逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。
逻辑回归的应用场景
- 广告点击率
- 是否为垃圾邮件
- 是否患病
- 金融诈骗
- 虚假账号
看到上面的例子,我们可以发现其中的特点,那就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题的利器
逻辑回归的原理
输入
逻辑回归的输入就是一个线性回归的结果。
激活函数
- sigmoid函数
- 分析
- 回归的结果输入到sigmoid函数当中
- 输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)
输出结果解释(重要):假设有两个类别A,B,并且假设我们的概率值为属于A(1)这个类别的概率值。现在有一个样本的输入到逻辑回归输出结果0.6,那么这个概率值超过0.5,意味着我们训练或者预测的结果就是A(1)类别。那么反之,如果得出结果为0.3那么,训练或者预测结果就为B(0)类别。
所以接下来我们回忆之前的线性回归预测结果我们用均方误差衡量,那如果对于逻辑回归,我们预测的结果不对该怎么去衡量这个损失呢?我们来看这样一张图
那么如何去衡量逻辑回归的预测结果与真实结果的差异呢?
损失以及优化
损失
逻辑回归的损失,称之为对数似然损失,公式如下:
- 分开类别:
怎么理解单个的式子呢?这个要根据log的函数图像来理解
- 综合完整损失函数
看到这个式子,其实跟我们讲的信息熵类似。
接下来我们呢就带入上面那个例子来计算一遍,就能理解意义了。
我们已经知道,log(P), P值越大,结果越小,所以我们可以对着这个损失的式子去分析
优化
同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
逻辑回归API
sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
- solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
- sag:根据数据集自动选择,随机平均梯度下降
- penalty:正则化的种类
- C:正则化力度
默认将类别数量少的当做正例
LogisticRegression方法相当于 SGDClassifier(loss="log", penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习,也支持平均随机梯度下降法(ASGD),可以通过设置average=True。而使用LogisticRegression(实现了SAG)
案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
- 数据介绍
原始数据的下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/
数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。
分析
- 缺失值处理
- 标准化处理
- 逻辑回归预测
代码
import pandas as pd import numpy as np # 1、读取数据 path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data" column_name = ['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(path, names=column_name) data.head()
# 2、缺失值处理 # 1)替换-》np.nan data = data.replace(to_replace="?", value=np.nan) # 2)删除缺失样本 data.dropna(inplace=True) data.isnull().any() # 不存在缺失值
# 3、划分数据集 from sklearn.model_selection import train_test_split data.head()
# 筛选特征值和目标值 x = data.iloc[:, 1:-1] y = data["Class"] x.head()
y.head()
x_train, x_test, y_train, y_test = train_test_split(x, y)
x_train.head()
# 4、标准化 from sklearn.preprocessing import StandardScaler transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) x_train
from sklearn.linear_model import LogisticRegression # 5、预估器流程 estimator = LogisticRegression() estimator.fit(x_train, y_train) # 逻辑回归的模型参数:回归系数和偏置 estimator.coef_
estimator.intercept_
# 6、模型评估 # 方法1:直接比对真实值和预测值 y_predict = estimator.predict(x_test) print("y_predict: ", y_predict) print("直接比对真实值和预测值: ", y_test == y_predict) # 方法2:计算准确率 score = estimator.score(x_test, y_test) print("准确率为: ", score)
结果:
y_predict: [2 2 2 2 4 4 2 2 2 2 4 4 2 4 2 2 4 2 4 4 2 2 4 4 2 4 2 2 4 2 2 2 2 4 2 4 4 4 2 2 4 2 4 4 2 2 2 4 4 2 2 2 2 2 2 4 4 2 2 2 4 4 4 2 4 2 4 2 2 2 2 2 4 2 4 4 2 2 4 2 2 2 2 2 2 4 4 4 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 2 2 2 2 2 2 4 2 2 4 4 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 4 2 4 4 2 4 2 2 4 4 4 4 2 4 2 2 4 4 2 2 2 4 2 2 2 4 4 2 2 2 2 2 2 4 2] 直接比对真实值和预测值: 432 True 256 True 203 True 281 True 588 True 590 True 66 True 473 True 637 True 537 True 103 True 334 True 8 True 44 True 141 True 90 True 329 True 454 True 440 True 200 True 665 True 495 True 279 True 272 True 43 False 282 True 22 True 548 True 330 True 654 True ... 340 True 470 True 343 True 253 True 264 True 262 True 132 True 51 False 42 True 250 True 651 True 232 False 581 True 94 True 385 True 566 True 386 True 234 True 189 True 556 True 605 True 112 True 529 True 345 True 410 True 327 True 480 True 350 True 381 True 545 True Name: Class, Length: 171, dtype: bool 准确率为: 0.9649122807017544
分类的评估方法
精确率与召回率
混淆矩阵
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
精确率(Precision)与召回率(Recall)
- 精确率:预测结果为正例样本中真实为正例的比例(了解)
- 召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
那么怎么更好理解这个两个概念
还有其他的评估标准,F1-score,反映了模型的稳健型
分类评估报告API
- sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
-
- y_true:真实目标值
- y_pred:估计器预测目标值
- labels:指定类别对应的数字
- target_names:目标类别名称
- return:每个类别精确率与召回率
# 查看精确率、召回率、F1-score from sklearn.metrics import classification_report report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]) print(report)
假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好,这就是样本不均衡下的评估问题
问题:如何衡量样本不均衡下的评估?
ROC曲线与AUC指标
知道TPR与FPR
- TPR = TP / (TP + FN)
- 所有真实类别为1的样本中,预测类别为1的比例
- FPR = FP / (FP + FN)
- 所有真实类别为0的样本中,预测类别为1的比例
ROC曲线
- ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5
AUC指标
- AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率
- AUC的最小值为0.5,最大值为1,取值越高越好
- AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
- 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
最终AUC的范围在[0.5, 1]之间,并且越接近1越好
AUC计算API
from sklearn.metrics import roc_auc_score
- sklearn.metrics.roc_auc_score(y_true, y_score)
- 计算ROC曲线面积,即AUC值
- y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
- y_score:每个样本预测的概率值
y_test.head()
# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记 # 将y_test 转换成 0 1 y_true = np.where(y_test > 3, 1, 0)
y_true
from sklearn.metrics import roc_auc_score roc_auc_score(y_true, y_predict)