逻辑回归以及python(sklearn)详解
一、逻辑回归的核心思想
逻辑回归是一种用于解决二分类问题的统计学习方法,虽然名字中有"回归",但它实际上是一种分类算法。
1、逻辑回归的核心思想
线性回归的公式是 z=wTx+bz = w^T x + bz=wTx+b,其输出值 z 是一个连续的实数。如果我们想用它来做分类(比如判断邮件是“垃圾邮件”还是“非垃圾邮件”),我们需要将连续的输出转换为一个代表概率的值,即介于 0 和 1 之间的值。
逻辑回归的聪明之处在于,它在线性回归的结果上套用了一个激活函数,将这个实数 z 映射到 (0, 1) 区间。这个激活函数就是 Sigmoid 函数,也叫逻辑函数。
2、 Sigmoid 函数(核心公式)
Sigmoid 函数的数学表达式为:
σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+e−z1
其中:
- z 是线性回归模型的输出,即 z=wTx+bz = w^T x + bz=wTx+b。
- e是自然常数。
- σ(z)\sigma(z)σ(z)的输出值在 (0, 1) 区间内。
Sigmoid 函数的特性:
- 当 z→+∞z \to +\inftyz→+∞ 时,e−z→0e^{-z} \to 0e−z→0,所以 σ(z)→1\sigma(z) \to 1σ(z)→1。
- 当 z→−∞z \to -\inftyz→−∞ 时,e−z→+∞e^{-z} \to +\inftye−z→+∞,所以 σ(z)→0\sigma(z) \to 0σ(z)→0。
- 当 z=0z = 0z=0时,σ(z)=0.5\sigma(z) = 0.5σ(z)=0.5。
这个特性完美地将线性输出转换成了概率。
3、逻辑回归的完整模型
我们将线性部分和激活函数组合起来,就得到了逻辑回归的完整模型:
P(y=1∣x)=σ(wTx+b)=11+e−(wTx+b)P(y=1 | x) = \sigma(w^T x + b) = \frac{1}{1 + e^{-(w^T x + b)}}P(y=1∣x)=σ(wTx+b)=1+e−(wTx+b)1
这里:
- P(y=1∣x)P(y=1 | x)P(y=1∣x)代表了在给定输入特征 x 的情况下,预测样本属于类别 1 的概率。
- w 是权重向量,表示每个特征的重要程度。
- b是偏置项。
- x是输入特征向量。
对于二分类问题,我们通常设置一个阈值(默认为 0.5)来做最终判断:
- 如果 P(y=1∣x)≥0.5P(y=1 | x) \ge 0.5P(y=1∣x)≥0.5,则预测 y^=1\hat{y} = 1y^=1。
- 如果 P(y=1∣x)<0.5P(y=1 | x) < 0.5P(y=1∣x)<0.5,则预测 y^=0\hat{y} = 0y^=0。
4、决策边界
从 Sigmoid 函数的特性我们知道,当 P(y=1 | x) = 0.5时,对应的 z=wTx+b=0z = w^T x + b = 0z=wTx+b=0。
因此,决策边界就是由方程 wTx+b=0w^T x + b = 0wTx+b=0所定义的一个超平面(在二维空间中是一条直线)。
- 所有使得 wTx+b>0w^T x + b > 0wTx+b>0的点,我们预测为类别 1。
- 所有使得 wTx+b<0w^T x + b < 0wTx+b<0的点,我们预测为类别 0。
决策边界是模型在学习过程中自己确定的,而不是人为设定的。
二、相关指标详解
1、基础:混淆矩阵
混淆矩阵是所有这些指标的基石。它是一个2x2的表格(针对二分类问题),总结了模型的预测结果与实际结果之间的关系。
假设我们研究的问题是“预测一个患者是否患病”,我们将患病定义为正例,健康定义为负例。
| 实际为正例(患病) | 实际为负例(健康) | |
|---|---|---|
| 预测为正例(患病) | TP | FP |
| 预测为负例(健康) | FN | TN |
这四个字母的含义是:
- TP:真正例
- 含义:患者确实患病,模型也正确地预测为患病。
- 解释:预测正确,是我们喜闻乐见的结果。
- FP:假正例(误报)
- 含义:患者实际健康,但模型错误地预测为患病。
- 解释:第一类错误。例如“误诊”,可能带来不必要的治疗和恐慌。
- FN:假负例(漏报)
- 含义:患者实际患病,但模型错误地预测为健康。
- 解释:第二类错误。例如“漏诊”,后果可能非常严重,患者错过了治疗时机。
- TN:真负例
- 含义:患者确实健康,模型也正确地预测为健康。
- 解释:预测正确,也是好结果。
记住这个表格,后面的所有指标都是它的“数学组合”。
2、五大指标详解
指标一:准确率
- 公式:
Accuracy = (TP + TN) / (TP + TN + FP + FN)或者Accuracy = (TP + TN) / Total测试用例 - 含义:所有预测结果中,预测正确的比例。
指标二:精准率
- 公式:
Precision = TP / (TP + FP) - 含义:在所有被模型预测为“患病”的人中,真正患病的人的比例。 它关注的是预测结果的精确性。
指标三:召回率
- 公式:
Recall = TP / (TP + FN) - 含义:在所有真正“患病”的人中,被模型成功预测出来的比例。 它关注的是模型找出正例的能力。
指标四:F1分数
- 公式:
F1-Score = 2 * (Precision * Recall) / (Precision + Recall) - 含义:精准率和召回率的调和平均数。
指标五:ROC曲线与AUC
- ROC曲线:描绘了当分类模型的阈值从0变化到1时,真正例率(TPR) 和假正例率(FPR) 的关系。
- TPR(真正例率):其实就是召回率。
TPR = Recall = TP / (TP+FN) - FPR(假正例率):在所有实际负例中,被错误预测为正例的比例。
FPR = FP / (FP+TN)
- TPR(真正例率):其实就是召回率。
- AUC:ROC曲线下的面积。这个值在0.5到1之间。
- AUC = 1:完美分类器。
- AUC = 0.5:模型没有区分能力,和随机猜测一样(对角线)。
- AUC > 0.5:模型具有一定的区分能力,值越大,说明模型在“排序”能力上越好(即把正样本排在前面的概率越高)。
3、总结与如何选择
| 指标 | 公式 | 关注点 | 适用场景 |
|---|---|---|---|
| 准确率A | (TP+TN)/Total | 整体预测的正确性 | 数据平衡,简单快速的评估 |
| 精准率P | TP/(TP+FP) | 预测的精确度(降低误报FP) | FP代价高:垃圾邮件检测、推荐系统 |
| 召回率R | TP/(TP+FN) | 找出正例的能力(降低漏报FN) | FN代价高:疾病诊断、欺诈检测 |
| F1分数 | 2*P*R/(P+R) | 精准率和召回率的调和平衡 | 数据不平衡,需要综合评估 |
| AUC | ROC曲线下面积 | 模型的整体排序能力 | 评估模型区分正负样本的整体能力,对阈值不敏感 |
实战建议:
- 永远不要只看准确率,尤其是当你的数据不平衡时。
- 首先问自己一个业务问题:“在我的场景中,误报(FP)和漏报(FN)哪个代价更高?”
- 怕误报(FP) -> 优先看精准率。
- 怕漏报(FN) -> 优先看召回率。
- 两个都重要,想找平衡 -> 看F1分数。
- 使用混淆矩阵作为起点,它能最直观地展示模型的错误类型。
- 使用ROC曲线来评估模型的整体区分能力。
三、 python(sklearn)代码详解
1、LogisticRegression
from sklearn.linear_model import LogisticRegression# 创建并训练模型,使用平衡的类别权重和较强的正则化
model = LogisticRegression(penalty='l2', # 使用 L2 正则化C=0.1, # 较强的正则化solver='lbfgs', # 默认求解器,适用于此数据集max_iter=200, # 增加最大迭代次数class_weight='balanced', # 处理类别不平衡(虽然此数据集平衡,仅为演示)multi_class='multinomial', # 使用 multinomial 进行多分类random_state=42
)model.fit(X_train_scaled, y_train)# 进行预测
y_pred = model.predict(X_test_scaled)
y_pred_proba = model.predict_proba(X_test_scaled)
参数列表详解
| 参数 | 默认值 | 类型 | 可选值 | 解释 |
|---|---|---|---|---|
| penalty | ‘l2’ | str | ‘l1’, ‘l2’, ‘elasticnet’, None | 择用来惩罚模型复杂度(系数大小)的正则化类型。 |
| C | $1.0 | float | 正则化强度的倒数。C 值越小,正则化强度越大。 | |
| max_iter | 100 | int | 求解器收敛的最大迭代次数。如果数据复杂或特征多,可能需要增加这个值以避免“未收敛”的警告。 |
2、指标函数详解
from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, confusion_matrix, classification_report, RocCurveDisplay)
| 函数 | 使用 | 描述 |
|---|---|---|
| accuracy_score | accuracy_score(y_test, y_pred) | 获取测试集的准确率 |
| precision_score | precision_score(y_test, y_pred) | 获取测试集的精准率 |
| recall_score | recall_score(y_test, y_pred) | 获取测试集的召回率 |
| F1-Score | f1_score(y_test, y_pred) | 获取测试集F1分数 (F1-Score) |
| classification_report | classification_report(y_test, y_pred) | 完整评估报告 |
