逻辑回归以及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)
  • AUCROC曲线下的面积 。这个值在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曲线下面积 模型的整体排序能力 评估模型区分正负样本的整体能力,对阈值不敏感

实战建议:

  1. 永远不要只看准确率,尤其是当你的数据不平衡时。
  2. 首先问自己一个业务问题:"在我的场景中,误报(FP)和漏报(FN)哪个代价更高?"
    • 怕误报(FP) -> 优先看精准率
    • 怕漏报(FN) -> 优先看召回率
    • 两个都重要,想找平衡 -> 看F1分数
  3. 使用混淆矩阵作为起点,它能最直观地展示模型的错误类型。
  4. 使用ROC曲线来评估模型的整体区分能力。

三、 python(sklearn)代码详解

1、LogisticRegression

python 复制代码
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、指标函数详解

python 复制代码
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) 完整评估报告
相关推荐
AI小云2 小时前
【Numpy数据运算】数组间运算
开发语言·python·numpy
q***78372 小时前
【玩转全栈】----Django制作部门管理页面
后端·python·django
CoderIsArt2 小时前
抽象语法树AST与python的Demo实现
python
郝开4 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)3 - 枚举规范定义:定义基础枚举接口;定义枚举工具类;示例枚举
spring boot·后端·python·枚举·enum
钅日 勿 XiName4 小时前
一小时速通Pytorch之自动梯度(Autograd)和计算图(Computational Graph)(二)
人工智能·pytorch·python
故林丶4 小时前
【Django】Django笔记
python·django
码上地球4 小时前
大数据成矿预测系列(八) | 从定性到概率:逻辑回归——地质统计学派的“集大成者”
大数据·逻辑回归
IT北辰5 小时前
Python实现居民供暖中暖气能耗数据可视化分析(文中含源码)
开发语言·python·信息可视化
FreeCode5 小时前
LangChain1.0智能体开发:长期记忆
python·langchain·agent