逻辑回归

逻辑回归介绍

逻辑回归的应用场景
  1. 逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛
  2. 广告点击率
  3. 是否为垃圾邮件
  4. 是否患病
  5. 金融诈骗
  6. 虚假账号
逻辑回归的原理-sigmoid函数
  1. 逻辑回归中,其输入值是什么,如何判断逻辑回归的输出

  2. 输入,逻辑回归的输入就是一个线性回归的结果

    \[h(x) = w_1x+w_2x+w_3x+...+b=w^Tx+b\\其中w,x可以理解为矩阵:w=\left[\begin{matrix} b\\ w_1 \\w_2\end{matrix}\right],x=\left[\begin{matrix} 1\\ x_1 \\x_2\end{matrix}\right]\]

  3. 激活函数,sigmoid函数

    \[g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}\]

    1. 判断标准
    2. 回归的结果输入到sigmoid函数当中
    3. 输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
  4. 逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)

  5. 输出结果解释

    1. 假设有两个类别A,B,并且假设我们的概率值为属于A(1)这个类别的概率值。现在有一个样本的输入到逻辑回归输出结果0.6,那么这个概率值超过0.5,意味着我们训练或者预测的结果就是A(1)类别。那么反之,如果得出结果为0.3那么,训练或者预测结果就为B(0)类别
损失以及优化
  1. 损失,对数似然函数

    1. 逻辑回归的损失,称之为对数似然损失,公式如下

    2. 分开类别

      \[cost(h_\theta(x),y)=\begin{cases} -log(h_\theta(x)),if\ y=1\\-log(1-h_\theta(x)),if\ y=0\end{cases}\]

    3. 综合完整损失函数,信息熵类似

      \[cos(h_\theta(x),y)=\sum^m_{i=1}-y_ilog(h_\theta(x))-(1-y_i)log(1-h_\theta(x))\]

  2. 优化

    1. 同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率

逻辑回归api介绍

LogisticRegression
  1. sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
    1. solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'}
      1. 默认: 'liblinear';用于优化问题的算法
      2. 对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快
      3. 对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类
    2. penalty:正则化的种类
    3. C:正则化力度
  2. 默认将类别数量少的当做正例
    1. LogisticRegression方法相当于 SGDClassifier(loss="log", penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习。而使用LogisticRegression(实现了SAG)

案例:癌症分类预测

流程分析
  1. 获取数据
  2. 基本数据处理
    1. 缺失值处理
    2. 确定特征值和目标值
    3. 分割数据
  3. 特征工程(标准化)
  4. 机器学习(逻辑回归)
  5. 模型评估
代码流程
  1. 代码

    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    # 1.获取数据
    names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
    'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
    'Normal Nucleoli', 'Mitoses', 'Class']
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
    names=names)
    data.head()
    # 2.基本数据处理
    # 2.1 缺失值处理
    data = data.replace(to_replace="?", value=np.NaN)
    data = data.dropna()
    # 2.2 确定特征值,目标值
    x = data.iloc[:, 1:10]
    x.head()
    y = data["Class"]
    y.head()
    # 2.3 分割数据
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
    # 3.特征工程(标准化)
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4.机器学习(逻辑回归)
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)
    # 5.模型评估
    y_predict = estimator.predict(x_test)
    y_predict
    estimator.score(x_test, y_test)
  2. 在很多分类场景当中我们不一定只关注预测的准确率,比如以这个癌症举例子!!!我们并不关注预测的准确率,而是关注在所有的样本当中,癌症患者有没有被全部预测(检测)出来

分类评估方法

分类评估方法
  1. 精确率与召回率
    1. 混淆矩阵

      1. 在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)

        正例(预测结果) 假例(预测结果)
        正例(真实结果) 真正例TP 伪反例FN
        假例(真实结果) 伪正例FP 真返例TN
    2. 精确率(Precision)与召回率(Recall)

      1. 精确率:预测结果为正例样本中真实为正例的比例,(查的准不准)
      2. 召回率:真实为正例的样本中预测结果为正例的比例,(查得全,对正样本的区分能力)
    3. F1-score

      1. F1-score,反映了模型的稳健型

        \[F1=\frac{2TP}{2TP+FN+FP}=\frac{2precision\cdot recall}{precision+ recall}\]

  2. 分类评估报告api

    1. sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )

      1. y_true:真实目标值
      2. y_pred:估计器预测目标值
      3. labels:指定类别对应的数字
      4. target_names:目标类别名称
      5. return:每个类别精确率与召回率
    2. 代码

      ret = classification_report(y_test, y_predict, labels=(2,4), target_names=("良性", "恶性"))
      print(ret)
      
    3. 假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好,这就是样本不均衡下的评估问题

ROC曲线与AUC指标
  1. TPR与FPR

    1. TPR = TP / (TP + FN),所有真实类别为1的样本中,预测类别为1的比例
    2. FPR = FP / (FP + TN),所有真实类别为0的样本中,预测类别为1的比例
  2. ROC曲线

    1. ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5
  3. AUC指标

    1. AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率
    2. AUC的最小值为0.5,最大值为1,取值越高越好,最终AUC的范围在[0.5, 1]之间,并且越接近1越好
    3. AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器
    4. 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值
    5. AUC只能用来评价二分类
    6. AUC非常适合评价样本不平衡中的分类器性能
  4. 意义解释

    1. AUC的意思是——Area Under roc Curve,就是ROC曲线的积分,也是ROC曲线下面的面积
    2. 绘制ROC曲线的意义很明显,不断地把可能分错的情况扣除掉,从概率最高往下取的点,每有一个是负样本,就会导致分错排在它下面的所有正样本,所以要把它下面的正样本数扣除掉(1-TPR,剩下的正样本的比例)。总的ROC曲线绘制出来了,AUC就定了,分对的概率也能求出来了
  5. AUC计算API

    1. from sklearn.metrics import roc_auc_score

      1. sklearn.metrics.roc_auc_score(y_true, y_score)
        1. 计算ROC曲线面积,即AUC值
        2. y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
        3. y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值
    2. 代码

      # 0.5~1之间,越接近于1约好
      y_test = np.where(y_test > 2.5, 1, 0)
      print("AUC指标:", roc_auc_score(y_test, y_predict)
posted on 2021-04-12 22:54  Darren_la  阅读(160)  评论(0)    收藏  举报