• 机器学习 笔记03——逻辑回归 + 分类问题评估指标:精确率、召回率、F1-score、AUC指标


    (3条消息) 机器学习笔记九——线性模型原理以及python实现案例_珞沫的博客-CSDN博客https://blog.csdn.net/weixin_45666566/article/details/107137877用于分类的线性模型对数几率回归(逻辑回归)线性判别分析(LAD)的内容介绍


    目录

     1、广义线性模型补充

     2、对数几率回归(逻辑回归)的补充

    2.1 输入与输出

    ​编辑 2.2 损失与优化

    2.2.1 损失

    2.2.2 优化

    3、线性判别分析补充

     4、多分类问题

    5、类别不平衡问题怎么解决

    逻辑回归API介绍

     案例:癌症分类预测-良 / 恶心乳腺癌肿瘤预测

    1、分析

     2、分类评估方法

    1、混淆矩阵

    2、准确率

    3、精确率Precision——查的准不准 

    4、召回率Recall——查得全不全,对样本得区分能力

    5、F1-score

    6、分类评估报告API

    3、如何衡量样本不均衡问题?

    3.1 TPR和FPR

    3.2 ROC曲线

    3.3 AUC指标

    3.4 AUC计算API 

    3.5 AUC总结 

    3.6 ROC曲线绘制案例

    癌症分类预测完整代码



     1、广义线性模型补充

            除了直接让模型预测值逼近实值标记 y,我们还可以让它逼近 y 的衍生物,这就是 广义线性模型(generalized linear model) 的思想,

    y=g−1(ωTx+b)

    其中 g(⋅)称为 联系函数(link function),要求单调可微。使用广义线性模型我们可以实现强大的 非线性函数映射 功能。比方说 对数线性回归(log-linear regression),令 g(⋅)=ln(⋅),此时模型预测值对应的是实值标记在指数尺度上的变化。

            这里介绍了什么是广义线性模型,以及为什么逻辑回归会使用这样的Sigmoid函数?

     2、对数几率回归(逻辑回归)的补充

    2.1 输入与输出

    • 逻辑回归的输入:线性回归的结果
    • 激活函数:将线性回归的结果输入到Sigmoid函数中
      • 把整体的之映射到[0,1]
      • 再设置一个阈值进行分类判断

    应用场景:

            广告点击率、是否为垃圾邮件、是否患病、金融诈骗、虚假账号。

            逻辑回归适用于二分类问题,假设逻辑回归输出的概率值表示属于正类的概率。那么,当输出的概率值大于阈值0.5,我们预测为正类;小于阈值0.5则预测为父类。

     2.2 损失与优化

    2.2.1 损失

            逻辑回归的损失,称之为对数似然损失。进驻log思想,分为真实值为1和真实值为0两种情况。

     损失函数和对数似然函数如何定义?

             最大化对数似然函数L(β)求β,相当于最小化对数似然函数的相反数(即完整的损失函数-L(β))

     其中p(y=1|x)=h(x)。

            接下来用梯度下降法利用梯度下降法更新参数(西瓜书or博客)。

    2.2.2 优化

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

    3、线性判别分析补充

     4、多分类问题

    • 拆解法:将一个分类任务拆分为若干个二分类
    • 纠错输出码

    5、类别不平衡问题怎么解决

            不同类别的样本比例相差很大,往往“小类”更加重要。常见的类别不平衡问题学习方法:

             什么是阈值移动?


    逻辑回归API介绍

    • sklearn.linear_model.LogisticRegression(solver='liblinear', penalty='l2', C=1.0)
      • solver可选参数:{'liblinear', 'sag', 'saga', 'newton-cg', 'lbfgs'}
        • 默认 'liblinear' :用于优化问题的算法。
        • 对于小数据集来说,'liblinear' 是个不错的选择。而'sag'和'saga'对于大数据集会更快。
        • 对于多分类问题,只有'newton-cg', 'sag' 和’lbfgs‘可以处理多项损失,'liblinear'仅限于'one-versus-rest'分类。
      • penalty:正则化种类,默认L2正则化。
      • C:正则化力度,默认1.0

    默认将类别数量较少的当作正例

     案例:癌症分类预测-良 / 恶心乳腺癌肿瘤预测

    属于下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases + 数据集名

    Index of /ml/machine-learning-databases/breast-cancer-wisconsin (uci.edu)https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

    1、分析

    • 1.获取数据
    • 2.基本数据处理
      • 2.1 缺失值处理
      • 2.2 确定特征值,目标值(这里的特征都是医学专家选的,不需要我们再删选了)
      • 2.3 分割数据
    • 3.特征工程(标准化)
    • 4.机器学习(逻辑回归)
    • 5.模型评估
    • 缺失值怎么处理?
      • 如果缺失值比较少 — 直接删除 .dropna()
      • 如果缺失值比较多 — 替换 .replace()
      • data = data.fillna(value=None, method='bfill')

     逻辑回归需要用到标准化吗?

    • 如果实现过程中涉及到计算值的大小,就需要用到标准化
    • KNN算法中要求欧氏距离,所以使用了标准化
    • 线性回归中也要用到标准化
    • 逻辑回归是将线性回归的输出作为逻辑回归的输入,所以也需要用到标准化。

             在很多分类场景中,我们不一定只关注预测的准确率,比如在这个癌症的例子中,我们并不关注预测的准确率,而是关注在多有样本中,癌症患者有没有被全部预测(检测)出来。 

    • 分类回归api,并没有明确的界限,有时候可以混合使用。

      • LogisticRegression方法(分类问题)相当于SGDClassifier(loss=‘log’, penalty=‘’),说明逻辑回归可以通过随机梯度下降法实现。
      • 前面介绍的是SGDRegressor() 随机梯度下降。SGD既有Classifier-分类 又有 Regressor-回归
      • SGDClassifier(loss=‘log’, penalty=‘l2’)表示实现了一个普通的随机梯度下降,来进行分类
      • LogisticRegression实现了SAG
    • KNN也可以解决回归问题,正规方程和梯度下降法也可以解决分类问题。

     2、分类评估方法

    1、混淆矩阵

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

     

    2、准确率

    \frac{TP+TN}{TP+TN+FP+FN}

    3、精确率Precision——查的准不准 

            预测结果为正例样本中,真实为正例的比例。预测为癌症的人里真正得癌症得人有多少

    4、召回率Recall——查得全不全,对样本得区分能力

            真实为正例得样本中预测结果为正例得比例。真正得癌症得人里,你预测出了多少个。

    5、F1-score

            反映了模型的稳健性,越接近1,模型的稳健性越强,相当于模型的评估效果越好。

            越接近1,模型的稳健性越强,相当于模型的评估效果越好

    6、分类评估报告API

    • sklearn.metrics.classification_report(y_true, y_pred, labels=[ ], target_names=None)
      • y_true:真实目标值
      • y_pred:估计器预测的目标值
      • labels:指定类别对应的数字
      • target_names:目标类别的名称
      • return:每个类别精确率与召回率 

            假设有这样一个情况,如果有99个癌症样本,1个样本非癌症,不管怎么样我都预测正例(默认癌症为正例),准确率就是99%,但是这样效果并不好,这就是样本不均衡下的评估问题。

    • 然而其精确率为0.99,召回率为1,f1-score为0.99497

    3、如何衡量样本不均衡问题?

            AUC指标主要用于评价不平衡的二分类问题。

    3.1 TPR和FPR

    • TPR:所有真实类别为1的样本中,预测类别为1的比例

    TPR= \frac{TP}{TP+FN}

    •  FPR:所有真实类别为0的样本中,预测类别为1的比例

    FPR=\frac{FP}{FP+TN}

    3.2 ROC曲线

            通过TPR和FPR进行图形绘制,绘制ROC曲线之后形成一个指标:AUC指标

    • 横轴:FPR
    • 纵轴:TPR

    • AUC为0.5对应的ROC曲线是红色虚线(ROC曲线右下角面积)(胡说八道)
      • 不管真是样本是什么类,取正例的概率一样。
    • 左上角(0,1)的顶点是最好的,TPR=1,FPR=0。
    • ROC曲线越接近(0,1)点,即Perfect Classification点越好。

    3.3 AUC指标

    • AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率
    • AUC的最小值为0.5,最大值为1,范围为[0.5,1]
    • 取值越高越好,越接近1越好
    • AUC=1,完美分类器,采用这个预测模型,不管设定什么阈值,都能得出完美预测。绝大多数预测的场合,不存在完美分类器
    • 0.5
    • AUC的意思就是Area Under roc Curve

    3.4 AUC计算API 

    • sklearn.metrics.roc_auc_score(y_true, y_score)
      • 计算ROC曲线的面积,即AUC的值
      • y_true:每个样本的真实类别。必须为0(反例),1(正例)标记,所以需要将真实值都转化为0-1形式。
      • y_score:预测值,可以是正例的估计概率、置信值或分类器方法的返回值 

    3.5 AUC总结 

    • AUC只能用于评价二分类问题
    • AUC适合用于评价样本不平衡中的二分类问题

    3.6 ROC曲线绘制案例

    • 1.构建模型,把模型的概率值从大到小进行排序
    • 2.从概率最大的点开始取值,一直进行TPR和FPR计算,然后构建整体模型,得到结果
    • 3.其实就是在求解积分/面积

     

     

     

    癌症分类预测完整代码

    1. import pandas as pd
    2. import numpy as np
    3. from sklearn.model_selection import train_test_split #分割数据
    4. from sklearn.preprocessing import StandardScaler #特征预处理:标准化
    5. from sklearn.linear_model import LogisticRegression
    6. from sklearn.metrics import classification_report #分类问题评估
    7. from sklearn.metrics import roc_auc_score #二分类样本不平衡问题评估方法
    8. names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size ',
    9. 'Uniformity of Cell Shape','Marginal Adhesion',
    10. 'Single Epithelial Cell Size','Bare Nuclei ',
    11. 'Bland Chromatin','Normal Nucleoli ',
    12. 'Mitoses', 'Class']#数据列名
    13. data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',
    14. names=names)#导入数据,并修改列名
    15. data = data.replace(to_replace='?', value=np.NaN)#用空值替换'?'
    16. data = data.dropna()
    17. # data = data.fillna(value=None, method='bfill')
    18. x = data.iloc[:,1:-1]#特征值
    19. y = data['Class']#目标值
    20. x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2, test_size=0.2)#数据分割:训练组+测试组
    21. transfer = StandardScaler()#对训练集和测试集标准化
    22. x_train = transfer.fit_transform(x_train)
    23. x_test = transfer.fit_transform(x_test)
    24. estimator =LogisticRegression()#机器学习(逻辑回归)
    25. estimator.fit(x_train, y_train)
    26. y_pre = estimator.predict(x_test)#利用测试集进行预测
    27. print('逻辑回归后的预测值是:\n', y_pre)
    28. # 模型基本评估
    29. score = estimator.score(x_test, y_test)#预测结果的准确率如何
    30. print('逻辑回归后的准确率是:\n', score)
    31. # 模型其他评估——准确率、召回率、F1-score
    32. ret = classification_report(y_test, y_pre, labels=(2,4), target_names=['良性','恶性'])
    33. print('模型的评估:精确率、召回率、F1-score是:\n', ret)
    34. # 不平衡二分类问题评估方法
    35. y_test = np.where(y_test>3,1,0) #给测试值重新赋值,大于3为正例1,否则为反例
    36. ret2 = roc_auc_score(y_true=y_test, y_score=y_pre)
    37. print('AUC是:\n',ret2)

     

  • 相关阅读:
    mysql数据库ip被阻断
    Linux——shell外壳程序
    【前台筛选】根据查询条件,实现纯前台的数据筛选
    设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)
    加密与安全_深入了解Hmac算法(消息认证码)
    Socks5代理:数字化时代的技术支柱
    从数学角度和编码角度解释 熵、交叉熵、KL散度
    vue中的全局事件总线 $bus
    GD32 看门狗
    [PAT练级笔记] 28 Basic Level 1028 人口普查
  • 原文地址:https://blog.csdn.net/S1406793/article/details/127699603