机器学习之逻辑回归(对数几率回归)

本文介绍了逻辑回归的概念,包括几率、逻辑和回归的含义。逻辑回归常用于二分类问题,通过Sigmoid函数将连续值转化为概率。文章详细讨论了损失函数、梯度下降求解参数的过程,并在SKlearn库中展示了实现步骤,包括数据预处理和模型评估,强调了逻辑回归在处理线性关系和分类概率方面的优势。
AI助手已提取文章相关产品:

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

机器学习算法之逻辑回归(对数几率回归)- 做分类的

一、概述:

逻辑(logistic)回归, 又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域

1、几率

几率:一个时间发生的概率 / 不发生的概率

2、逻辑

逻辑:指的是logistic function

3、回归

回归:来源于线性回归的 Z = XW,使用线性回归去拟合逼近一个‘界’,使得按照这个界进行数据分类后得到的损失函数最小,以概率0.5为分界线,将数据分为正例和反例,使得Z> 0对应于‘正例’(趋近于概率为1),Z< 0对应于‘反例’(趋近于概率为0),使用回归的思想去解决分类问题

二、作用

总的来说,逻辑回归是用来预测离散值输出只有0和1的离散型输出,做二分类(1/0)任务,并给出相应的概率

三、模型

灵感过程
  • 想要解决一个分类问题,从简单的二分类先开始

  • 数据标签是(1/0)

  • 可以使用最简单的单位阶跃函数

  • 在解决问题的迭代优化是需要使用到微分和导数,但是阶跃函数不连续,因此使用link function代替,使其连续可导, 横坐标是Z, 纵坐标是y, 定义域是服务穷到正无穷,值域是0-1(可对应于概率值0-1),link function 对于逻辑回归来说,就是Sigmoid函数:

  • 在这里插入图片描述

  • 在这里插入图片描述

Sigmoid函数的性质

  • Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时, g(z)趋近于0,它能够将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函 数。

四、损失函数

逻辑回归的损失函数由极大似然估计法得出,过程可以写作:

在这里插入图片描述

负对数似然函数:
cost=−∑(y∗log(h)−(1−y∗)log(1−h)) cost = -\sum (y^{*}log(h) - (1-y^{*})log(1-h)) cost=(ylog(h)(1y)log(1h))

J(Θ)=−∑[yi∗log(yθ(xi))−(1−yi∗)log(1−yθ(xi)] J(\Theta ) = -\sum [y_{i}^{*}log(y_{\theta }(x_{i}))- (1 - y_{i}^{*})log(1 -y_{\theta }(x_{i})] J(Θ)=[yilog(yθ(xi))(1yi)log(1yθ(xi)]

其中, 表示求解出来的一组参数, m是样本的个数, x是样本 上真实的标签, 是样本 上,基于 参数 计算出来的逻辑回归的返回值, 是样本 各个特征的取值。我们的目标,就是求解出使 最小的 取 值。 在损失函数中, , 都是已知量, 是未知量。 接下来,我只用找 最小值时的参数 。

五、梯度下降求解参数过程

  • 梯度:在多元函数上对各个自变量求偏导数,再把这个偏导数用向量的方式写出来,就是梯度。
  • 逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数$ \theta $ 的值,即求解能够让损失函数$ J(\theta) $ 最小化的 值

六、SKlearn中的逻辑回归

详细步骤:

  • 首先进行数据清洗

  • 处理类别型特征变量

    • 对于类别型特征变量的处理

    • 名义变量:没有大小关系,并列的 , 要将它单独的拆出来,由列拆成单独的一列 —— 采用独热编码,将一个特征变成三个特征

      • from sklearn.preprocessing import OneHotEncoder
        # 实例化
        one = OneHotEncoder()
        trans = one.fit_transform(df[['race', 'sex']])
        # 查看每一列代表的是什么
        one.get_feature_names()
        # 将装换后的数据转变成dataframe类型
        df2 = pd.DataFrame(trans.toarray())
        df2.rename({0: 'Amer-Indian-Eskimo', 1: 'Asian-Pac-Islander', 2: 'Black',
                   3: 'Other', 4: 'White', 5: 'Female', 6: 'Male'}, axis=1, inplace=True)
        # 拼接回原表
        df = pd.merge(left=df, right=df2, left_index=True, right_index=True)
        
    • 有序变量:小学, 初中,高中,大学:直接从小到大给0, 1, 2, 3

      • from sklearn.preprocessing import OrdinalEncoder
        Or = OrdinalEncoder()
        or_ = df[['workclass', 'education', 'marital_status', 'occupation', 'relationship', 'native_country']]
        trans_ = Or.fit_transform(or_)
        # 查看每一个代表什么
        Or.categories_
        df1 = pd.DataFrame(trans_)
        df1.rename({0: 'workclass', 1: 'education', 2: 'marital_status',
                   3: 'occupation', 4: 'relationship', 5: 'native_country'}, axis=1, inplace=True)
        df = pd.merge(left=df, right=df1, left_index=True, right_index=True)
        
    • 有距变量: 分箱之后的变量,比如说身高0—1.65的- 低,1.65-1.8 - 中等,1.8以上,利用分箱给0, 1, 2或者里面的数值都可以

  • 对数据进行量纲标准化

    • from sklearn.preprocessing import StandardScaler
      X = StandardScaler().fit_transform(df)
      
  • 进行训练集的划分

    • from sklearn.model_selection import train_test_split
      xtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size = 0.3, random_state = 40)
      
      
  • 导入逻辑回归的模块,进行预测

    • from sklearn.linear_model import LogisticRegression
      LR = LogisticRegression(penalty='l2', 
                              tol=0.01, 
                              max_iter=20,
                              C = 1.0)
      # 参数 :penalty:{l2},正则化项,默认是l2正则,会压缩一些特征,防止过拟合
      # tol = 0.0001,梯度下降的参数
      # C = 1.0 :正则化项的系数,表示正则化项很强,加满
      # fit_intercept = True: 要不要截距项
      LR.fit(xtrain, ytrain)
      LR.predict(xtest)
      
  • 查看精确度,查准率和查全率

    • # 查看精确率
      LR.score(xtest, ytest)
      # 查看查准率和查全率
      from sklearn.metrics import classification_report
      print(classification_report(ytest, LR.predict(xtest)))
               precision    recall  f1-score   support
      
                 0       1.00      1.00      1.00      6160
                 1       1.00      1.00      1.00      1957
      
          accuracy                           1.00      8117
         macro avg       1.00      1.00      1.00      8117
      weighted avg       1.00      1.00      1.00      8117
      # 查看混淆矩阵
      from sklearn.metrics import confusion_matrix
      print(confusion_matrix(ytest, LR.predict(xtest)))
      [[ 51   5]
       [  6 109]]
      # 查看标签是1的查全率
      from sklearn.metrics import recall_score
      recall_score(ytest, LR.predict(xtest))
      # 查看标签是0的查全率
      recall_score(ytest, LR.predict(xtest), pos_label=0)
      # 将正则变成l1正则
      LR_l1 = LogisticRegression(penalty='l1', 
                              tol=0.0001,
                              solver='liblinear', # 对应梯度下降的一种方法
                              max_iter=100,
                              C = 1.0).fit(xtrain, ytrain)
      
  • 重要参数:

    • 正则化项:penalty=‘I2’ 或者 penalty=‘I1’

      • L1:会将参数压缩为0 L2:只会让参数尽量小,不会为0
    • C正则化强度的倒数:C=1.0

      • 必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的 比值是1:1
      • C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越 来越小
    • 梯度下降的最大迭代次数(代替步长):max_iter=100

    • # 检查步长
      train_score = []
      test_scroe = []
      test_recall = []
      for i in range(100):
          LR_ = LogisticRegression(penalty='l1', 
                              tol=0.01,
                              solver='liblinear', # 对应梯度下降的一种方法
                              max_iter=i,
                              C = 1.0).fit(xtrain, ytrain)
          ts = LR_.score(xtrain, ytrain)
          # 求平均的准确率
          tts = LR_.score(xtest, ytest)
          tr = recall_score(ytest, LR_.predict(xtest), pos_label=0)
          train_score.append(ts)
          test_scroe.append(tts)
          test_recall.append(tr)
          
      plt.plot(range(100), train_score, c='r')
      plt.plot(range(100), test_scroe, c='g')
      plt.plot(range(100), test_recall, c='b')
      

七、模型评估

混淆矩阵

真实\预测10
1TPFN
0FPTN

查准率

  • 关注的问题是筛选的样本中是正样本的比例=查正确的样本/预测结果是这个类型的 总样本数。

precision=TPTP+FP precision = \frac{TP}{TP + FP} precision=TP+FPTP

查全率

  • 关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。

recall=TPTP+FN recall = \frac{TP}{TP + FN} recall=TP+FNTP

错误率与精度

  • 错误率:分错的样本战样本总数的比例
  • 精度: 1- E

八、逻辑回归的优点

  • 逻辑回f归对线性关系的拟合效果非常好
  • 逻辑回归计算快
  • 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
  • 逻辑回归还有抗噪能力强

关注的问题是筛选的样本中有多少比例的正样本被筛选出来=查正确的样本/真正 是这个类型的总样本数。

recall=TPTP+FN recall = \frac{TP}{TP + FN} recall=TP+FNTP

错误率与精度

  • 错误率:分错的样本战样本总数的比例
  • 精度: 1- E

八、逻辑回归的优点

  • 逻辑回f归对线性关系的拟合效果非常好
  • 逻辑回归计算快
  • 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
  • 逻辑回归还有抗噪能力强

您可能感兴趣的与本文相关内容

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值