1. 什么是逻辑回归
逻辑回归(Logistic Regression)是机器学习中的 一种分类模型 ,虽然名字中带有回归,但逻辑回归是一种分类算法。由于算法的简单和高效,在实际中广泛应用于二分类问题的统计模型和机器学习算法。逻辑回归的输入是线性回归的输出。
应用场景:
- 广告点击率
- 是否为垃圾邮件
- 是否患病
- 信用卡账单是否会违约
看到上面的例子,我们可以发现其中的特点,那就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题
的利器。
2. 激活函数
sigmoid函数
g
(
w
T
,
x
)
=
1
1
+
e
−
h
(
w
)
=
1
1
+
e
−
w
T
x
g(w^T, x)=\frac{1}{1+e^{-h(w)}}=\frac{1}{1+e^{-w^Tx}}
g(wT,x)=1+e−h(w)1=1+e−wTx1
判断标准
- 回归的结果输入到sigmoid函数当中
- 输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)
原理
逻辑回归使用逻辑函数(Sigmoid函数)将线性回归的输出映射到[0,1]区间,表示某个样本属于正类的概率。逻辑回归的阈值是可以进行改变的
3. 损失以及优化
逻辑回归的损失,称之为 对数似然损失 ,公式如下:
分开类别:
c o s t ( h θ ( x ) , y ) = { − log ( h θ ( x ) ) , if y = 1 − log ( 1 − h θ ( x ) ) , if y = 0 \large cost(h_\theta(x), y) = \begin{cases} -\log(h_\theta(x)), & \text {if $y=1$ } \\ -\log(1-h_\theta(x)), & \text{if $y=0$} \end{cases} cost(hθ(x),y)=⎩ ⎨ ⎧−log(hθ(x)),−log(1−hθ(x)),if y=1 if y=0
其中y为真实值, h θ ( x ) h_\theta(x) hθ(x)为预测值
无论何时,我们都希望 损失函数值,越小越好
分情况讨论,对应的损失函数值:
- 当y=1时,我们希望 h θ ( x ) h_\theta(x) hθ(x)值越大越好;
- 当y=0时,我们希望 h θ ( x ) h_\theta(x) hθ(x)值越小越好
综合完整损失函数
c o s t ( h θ ( x ) , y ) = ∑ i = 1 m − y i log ( h θ ( x ) ) − ( 1 − y i ) log ( 1 − h θ ( x ) ) \large cost(h_\theta(x), y) = \sum_{i=1}^m-y_i\log(h_\theta(x))-(1-y_i)\log(1-h_\theta(x)) cost(hθ(x),y)=i=1∑m−yilog(hθ(x))−(1−yi)log(1−hθ(x))
优化:同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
4. 分类评估指标
4.1. 混淆矩阵
混淆矩阵作用就是看一看在测试集样本集中:
- 真实值是 正例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做真正例(TP,True Positive)
- 真实值是 正例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做伪反例(FN,False Negative)
- 真实值是 假例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做伪正例(FP,False Positive)
- 真实值是 假例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做真反例(TN,True Negative)
例子:
样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:
模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本
- 真正例 TP 为:3
- 伪反例 FN 为:3
- 伪正例 FP 为:0
- 真反例 TN:4
模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本
- 真正例 TP 为:6
- 伪反例 FN 为:0
- 伪正例 FP 为:3
- 真反例 TN:1
4.2. Precision(精准率)
精准率也叫做查准率,指的是对正例样本的预测准确率。比如:我们把恶性肿瘤当做正例样本,则我们就需要知道模型对恶性肿瘤的预测准确率。
例子:
样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:
模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本
- 真正例 TP 为:3
- 伪反例 FN 为:3
- 假正例 FP 为:0
- 真反例 TN:4
- 精准率:3/(3+0) = 100%
模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本
- 真正例 TP 为:6
- 伪反例 FN 为:0
- 假正例 FP 为:3
- 真反例 TN:1
- 精准率:6/(6+3) = 67%
4.3. Recall(召回率)
召回率也叫做查全率,指的是预测为真正例样本占所有真实正例样本的比重。例如:我们把恶性肿瘤当做正例样本,则我们想知道模型是否能把所有的恶性肿瘤患者都预测出来。
例子:
样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:
模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本
- 真正例 TP 为:3
- 伪反例 FN 为:3
- 假正例 FP 为:0
- 真反例 TN:4
- 精准率:3/(3+0) = 100%
- 召回率:3/(3+3)=50%
模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本
- 真正例 TP 为:6
- 伪反例 FN 为:0
- 假正例 FP 为:3
- 真反例 TN:1
- 精准率:6/(6+3) = 67%
- 召回率:6/(6+0)= 100%
4.4. F1-score
如果我们对模型的精度、召回率都有要求,希望知道模型在这两个评估方向的综合预测能力如何?则可以使用 F1-score 指标。
例子:
样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:
模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本
- 真正例 TP 为:3
- 伪反例 FN 为:3
- 假正例 FP 为:0
- 真反例 TN:4
- 精准率:3/(3+0) = 100%
- 召回率:3/(3+3)=50%
- F1-score:(2*3)/(2*3+3+0)=67%
模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本
- 真正例 TP 为:6
- 伪反例 FN 为:0
- 假正例 FP 为:3
- 真反例 TN:1
- 精准率:6/(6+3) = 67%
- 召回率:6/(6+0)= 100%
- F1-score:(2*6)/(2*6+0+3)=80%
4.5. ROC曲线
ROC 曲线:我们分别考虑正负样本的情况:
- 正样本中被预测为正样本的概率,即:TPR (True Positive Rate)
- 负样本中被预测为正样本的概率,即:FPR (False Positive Rate)
ROC 曲线图像中,4 个特殊点的含义:
- (0, 0) 表示所有的正样本都预测为错误,所有的负样本都预测正确
- (1, 0) 表示所有的正样本都预测错误,所有的负样本都预测错误
- (1, 1) 表示所有的正样本都预测正确,所有的负样本都预测错误
- (0, 1) 表示所有的正样本都预测正确,所有的负样本都预测正确
4.6. AUC指标
- 我们发现:图像越靠近 (0,1) 点则模型对正负样本的辨别能力就越强
- 我们发现:图像越靠近 (0, 1) 点则 ROC 曲线下面的面积就会越大
- AUC 是 ROC 曲线下面的面积,该值越大,则模型的辨别能力就越强
- AUC 范围在 [0, 1] 之间
- 当 AUC= 1 时,该模型被认为是完美的分类器,但是几乎不存在完美分类器
AUC 值主要评估模型对正例样本、负例样本的辨别能力.
5. 类别不平衡数据处理
在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如:一个用于模型训练的数据集中,A 类样本占 95%,B 类样本占 5%。
类别的不平衡会影响到模型的训练,所以,我们需要对这种情况进行处理。处理的主要方法如下:
- 过采样:增加少数类别样本的数量,例如:减少 A 样本数量,达到 AB 两类别比例平衡。
- 欠采样:减少多数类别样本的数量,例如:增加 B 类样本数量,达到 AB 两类别比例平衡。
class_weight=“balanced”
参数 根据样本出现的频率自动给 样本设置 权重
6.可执行示例代码
以下是使用Python和sklearn
库实现逻辑回归的示例代码:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 2)
y = (X[:, 0] + X[:, 1] > 1).astype(int)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型
model = LogisticRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)
print(f"准确率: {accuracy}")
print(f"精确率: {precision}")
print(f"召回率: {recall}")
print(f"F1分数: {f1}")
print(f"AUC值: {roc_auc}")
# 绘制ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
7. 逻辑回归算法总结
逻辑回归是一种简单而有效的二分类模型,适用于预测某事件发生的概率。它具有易于实现和解释、计算效率高等优点,但在处理非线性关系和异常值时存在一定局限性。通过合理的特征选择和模型优化,可以在许多实际问题中取得良好的分类效果。
优点
-
易于实现和解释:逻辑回归模型简单,易于实现和理解,模型参数具有明确的解释意义。
-
计算效率高:训练和预测过程计算效率高,适用于大规模数据集。
-
适用性广:逻辑回归不仅用于二分类问题,还可以扩展到多分类问题(如Softmax回归)。
-
概率输出:输出结果是一个概率值,便于后续决策处理。
-
线性可分数据:对于线性可分的数据,逻辑回归能够很好地处理。
缺点
-
线性假设:假设特征与对数几率之间存在线性关系,无法处理复杂的非线性关系。
-
对异常值敏感:对异常值较为敏感,可能显著影响模型的拟合效果。
-
特征工程依赖:需要对特征进行筛选和工程,确保输入特征与目标变量之间有合理的关系。
-
不能处理高度相关特征:特征之间存在多重共线性时,模型参数可能不稳定。
适用性
逻辑回归适用于以下场景:
- 二分类问题,如邮件分类(垃圾邮件与正常邮件)、信用风险评估(违约与不违约)。
- 多分类问题,可以通过扩展(如Softmax回归)来处理。
- 概率预测,如预测某事件发生的概率。
- 特征与目标变量之间存在线性关系时,逻辑回归表现良好。
实现过程
数据准备:收集和整理数据,确保数据质量,并进行必要的预处理(如处理缺失值、异常值等)。
特征工程:选择合适的特征,进行特征转换和扩展(如标准化、归一化、生成多项式特征)。
模型训练:使用训练数据拟合逻辑回归模型,通常使用最大似然估计(MLE)来估计模型参数。
模型评估:使用测试数据评估模型性能,计算评估指标(如准确率、精确率、召回率、F1分数、ROC曲线和AUC值)。
模型优化:根据评估结果和业务需求,调整模型参数和特征,进行模型优化。