(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<1,由于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • 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.其实就是在求解积分/面积

 

 

 

癌症分类预测完整代码

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
from sklearn.metrics import classification_report #分类问题评估
from sklearn.metrics import roc_auc_score #二分类样本不平衡问题评估方法

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 = data.replace(to_replace='?', value=np.NaN)#用空值替换'?'
data = data.dropna()
# data = data.fillna(value=None, method='bfill')


x = data.iloc[:,1:-1]#特征值
y = data['Class']#目标值

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2, test_size=0.2)#数据分割:训练组+测试组

transfer = StandardScaler()#对训练集和测试集标准化
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

estimator =LogisticRegression()#机器学习(逻辑回归)
estimator.fit(x_train, y_train)

y_pre = estimator.predict(x_test)#利用测试集进行预测
print('逻辑回归后的预测值是:\n', y_pre)
# 模型基本评估
score = estimator.score(x_test, y_test)#预测结果的准确率如何
print('逻辑回归后的准确率是:\n', score)
# 模型其他评估——准确率、召回率、F1-score
ret = classification_report(y_test, y_pre, labels=(2,4), target_names=['良性','恶性'])
print('模型的评估:精确率、召回率、F1-score是:\n', ret)

# 不平衡二分类问题评估方法
y_test = np.where(y_test>3,1,0) #给测试值重新赋值,大于3为正例1,否则为反例
ret2 = roc_auc_score(y_true=y_test, y_score=y_pre)
print('AUC是:\n',ret2)

 

更多推荐