(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曲线绘制案例
癌症分类预测完整代码
除了直接让模型预测值逼近实值标记 y,我们还可以让它逼近 y 的衍生物,这就是 广义线性模型(generalized linear model) 的思想,
y=g−1(ωTx+b)
其中 g(⋅)称为 联系函数(link function),要求单调可微。使用广义线性模型我们可以实现强大的 非线性函数映射 功能。比方说 对数线性回归(log-linear regression),令 g(⋅)=ln(⋅),此时模型预测值对应的是实值标记在指数尺度上的变化。
这里介绍了什么是广义线性模型,以及为什么逻辑回归会使用这样的Sigmoid函数?
应用场景:
广告点击率、是否为垃圾邮件、是否患病、金融诈骗、虚假账号。
逻辑回归适用于二分类问题,假设逻辑回归输出的概率值表示属于正类的概率。那么,当输出的概率值大于阈值0.5,我们预测为正类;小于阈值0.5则预测为父类。
逻辑回归的损失,称之为对数似然损失。进驻log思想,分为真实值为1和真实值为0两种情况。
最大化对数似然函数L(β)求β,相当于最小化对数似然函数的相反数(即完整的损失函数-L(β))。
其中p(y=1|x)=h(x)。
接下来用梯度下降法利用梯度下降法更新参数(西瓜书or博客)。
同样使用梯度下降算法,去减少损失函数的值。这样去更新逻辑回归前面对应的权重系数。提升原本属于1类别的概率,降低原本是0类别的概率。
不同类别的样本比例相差很大,往往“小类”更加重要。常见的类别不平衡问题学习方法:
- 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.获取数据
- 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也可以解决回归问题,正规方程和梯度下降法也可以解决分类问题。
在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
预测结果为正例样本中,真实为正例的比例。预测为癌症的人里真正得癌症得人有多少
真实为正例得样本中预测结果为正例得比例。真正得癌症得人里,你预测出了多少个。
反映了模型的稳健性,越接近1,模型的稳健性越强,相当于模型的评估效果越好。
越接近1,模型的稳健性越强,相当于模型的评估效果越好
- sklearn.metrics.classification_report(y_true, y_pred, labels=[ ], target_names=None)
- y_true:真实目标值
- y_pred:估计器预测的目标值
- labels:指定类别对应的数字
- target_names:目标类别的名称
- return:每个类别精确率与召回率
假设有这样一个情况,如果有99个癌症样本,1个样本非癌症,不管怎么样我都预测正例(默认癌症为正例),准确率就是99%,但是这样效果并不好,这就是样本不均衡下的评估问题。
AUC指标主要用于评价不平衡的二分类问题。
通过TPR和FPR进行图形绘制,绘制ROC曲线之后形成一个指标:AUC指标
- sklearn.metrics.roc_auc_score(y_true, y_score)
- 计算ROC曲线的面积,即AUC的值
- y_true:每个样本的真实类别。必须为0(反例),1(正例)标记,所以需要将真实值都转化为0-1形式。
- y_score:预测值,可以是正例的估计概率、置信值或分类器方法的返回值
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)