机器学习入门:逻辑回归超详细学习笔记(含案例+代码)

机器学习入门:逻辑回归超详细学习笔记(含案例+代码)

作为机器学习初学者,逻辑回归是我接触的第一个分类算法。它原理清晰、应用广泛,而且是理解深度学习中激活函数、损失函数的基础。这篇笔记结合我的学习过程,从基础概念到实战案例,一步步拆解逻辑回归,适合和我一样的新手入门~

一、逻辑回归核心认知:它到底是什么?

1. 算法定位

逻辑回归是有监督学习 中的分类算法 (标签为离散值),核心用于二分类场景(比如:是否患病、客户是否流失、邮件是否垃圾邮件)。

很多新手会被"回归"二字误导------其实它本质是分类!只是借用了线性回归的数学框架,再通过激活函数完成分类转换。

2. 核心原理(三步走)

逻辑回归的核心逻辑特别好理解,就三步:

  1. 先对数据做线性回归 ,得到一个取值范围在 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)的预测值;
  2. 把这个预测值输入Sigmoid激活函数 ,映射到 ( 0 , 1 ) (0,1) (0,1)区间,得到"属于正例的概率";
  3. 设定阈值(常用0.5,可自定义):概率>阈值→判定为正例,否则为反例。

举个直观例子:预测肿瘤是否为恶性(正例=恶性,反例=良性)

  • 线性回归输出:89.1 → Sigmoid转换后:0.68(概率)
  • 若阈值=0.5 → 0.68>0.5 → 判定为恶性

二、关键数学基础:Sigmoid函数+损失函数

1. Sigmoid激活函数(核心转换工具)

(1)数学公式

f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1

(2)核心性质
  • 映射范围:把 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)的线性输出,压缩到 ( 0 , 1 ) (0,1) (0,1)(刚好符合概率的取值范围);
  • 单调递增:输入越大,输出概率越高,逻辑符合"特征越明显,正例概率越高";
  • 拐点特性:当 x = 0 x=0 x=0时, f ( x ) = 0.5 f(x)=0.5 f(x)=0.5(阈值的天然参考点);
  • 导函数简洁: f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x)=f(x)(1-f(x)) f′(x)=f(x)(1−f(x))(后续梯度下降优化时超有用)。
(3)可视化理解
复制代码
x: -6  -4  -2  0  2  4  6
f(x): 0.01  0.02  0.12  0.5  0.88  0.98  0.99

当x远小于0时,输出接近0(大概率反例);x远大于0时,输出接近1(大概率正例)。

2. 损失函数(模型优化的标尺)

损失函数的作用是:衡量模型预测值与真实值的"差距",差距越小,模型越好。

(1)核心思想
  • 若样本真实类别是1(正例):希望模型预测的概率 p p p越大越好;
  • 若样本真实类别是0(反例):希望模型预测的概率 1 − p 1-p 1−p越大越好。
(2)数学表达式(对数似然损失)

单个样本损失:
L o s s = { − l o g ( p ) 若 y = 1 − l o g ( 1 − p ) 若 y = 0 Loss = \begin{cases} -log(p) & 若y=1 \\ -log(1-p) & 若y=0 \end{cases} Loss={−log(p)−log(1−p)若y=1若y=0

多个样本(m个)总损失:
L o s s ( L ) = − ∑ i = 1 m ( y i l o g ( p i ) + ( 1 − y i ) l o g ( 1 − p i ) ) Loss(L)=-\sum_{i=1}^{m}\left(y_{i} log \left(p_{i}\right)+\left(1-y_{i}\right) log \left(1-p_{i}\right)\right) Loss(L)=−i=1∑m(yilog(pi)+(1−yi)log(1−pi))

其中 p i = s i g m o i d ( w T x i + b ) p_i = sigmoid(w^T x_i + b) pi=sigmoid(wTxi+b)(逻辑回归的输出概率)。

(3)手工计算示例(帮你理解)

假设有2个样本:

  • 样本1:真实标签 y = 1 y=1 y=1,预测概率 p = 0.4 p=0.4 p=0.4 → 损失: − l o g ( 0.4 ) ≈ 0.916 -log(0.4)≈0.916 −log(0.4)≈0.916
  • 样本2:真实标签 y = 0 y=0 y=0,预测概率 p = 0.68 p=0.68 p=0.68 → 损失: − l o g ( 1 − 0.68 ) ≈ 1.139 -log(1-0.68)≈1.139 −log(1−0.68)≈1.139
    总损失 = 0.916 + 1.139 ≈ 2.055

损失值越小,说明模型预测越准!模型训练的目标就是最小化这个总损失。

(4)为什么用对数?
  • 把"乘法概率"转化为"加法损失"(方便计算);
  • 放大预测错误的惩罚(比如 p = 0.1 p=0.1 p=0.1时, − l o g ( 0.1 ) = 2.3 -log(0.1)=2.3 −log(0.1)=2.3,惩罚力度足够大)。

三、分类模型评估:不止正确率!

新手很容易只看正确率,但分类问题中,精确率、召回率、AUC 往往更重要(比如医疗场景,漏诊和误诊的代价天差地别)。

1. 基础:混淆矩阵(分类结果的"成绩单")

混淆矩阵是所有评估指标的基础,用4个指标描述分类结果:

真实值\预测值 正例(预测) 反例(预测)
正例(真实) 真正例(TP):预测对了 伪反例(FN):预测错了(漏诊)
反例(真实) 伪正例(FP):预测错了(误诊) 真反例(TN):预测对了

2. 核心评估指标

(1)精确率(Precision):预测为正例的样本中,真正例的比例

P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP} Precision=TP+FPTP

  • 适用场景:重视"误诊成本"(比如预测是否为罪犯,避免冤枉好人)。
(2)召回率(Recall):真实正例中,被正确预测的比例

R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP

  • 适用场景:重视"漏诊成本"(比如癌症预测,尽量不遗漏患者)。
(3)F1-score:平衡精确率和召回率

精确率和召回率往往是"此消彼长"的,F1-score是两者的调和平均,综合反映模型性能:
F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = 2 × \frac{Precision × Recall}{Precision + Recall} F1=2×Precision+RecallPrecision×Recall

(4)AUC/ROC:模型区分能力的"金标准"
  • ROC曲线:以"假正例率(FPR)"为横轴,"真正例率(TPR=Recall)"为纵轴的曲线;
  • AUC:ROC曲线下的面积(范围0~1);
  • 解读:AUC越接近1,模型区分正负样本的能力越强;AUC=0.5时,模型和随机猜测一样。

四、实战案例:乳腺癌预测(附完整代码)

理论再好,不如动手跑一遍!这里用经典的乳腺癌数据集,实现二分类预测。

1. 数据说明

数据集包含威斯康星州乳腺癌患者的特征(如细胞大小、形状等),标签为"良性"或"恶性"。

2. 完整代码(Python+Scikit-learn)

python 复制代码
# 1. 导入所需库
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression  # 逻辑回归模型
from sklearn.model_selection import train_test_split  # 数据集分割
from sklearn.preprocessing import StandardScaler  # 特征标准化
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score  # 评估指标

# 2. 加载并预处理数据
# 加载数据(替换为你的数据路径)
data = pd.read_csv('./data/breast-cancer-wisconsin.csv')
# 处理缺失值:将"?"替换为NaN,然后删除含缺失值的行
data.replace('?', np.nan, inplace=True)
data.dropna(axis=0, inplace=True)

# 3. 特征工程
# 提取特征(第1列到倒数第1列)和标签(最后一列)
x = data.iloc[:, 1:-1]  # 特征
y = data['Class']       # 标签(1=恶性,0=良性)
# 分割训练集和测试集(测试集占20%)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=23)
# 特征标准化(逻辑回归对特征尺度敏感,必须做!)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)  # 训练集:拟合+转换
x_test = scaler.transform(x_test)        # 测试集:只转换(避免数据泄露)

# 4. 模型训练
model = LogisticRegression()  # 初始化模型
model.fit(x_train, y_train)   # 训练模型
print(f"模型权重w:{model.coef_}")
print(f"模型偏置b:{model.intercept_}")

# 5. 模型预测
y_pred = model.predict(x_test)  # 预测类别(0/1)
y_pred_prob = model.predict_proba(x_test)[:, 1]  # 预测为正例的概率

# 6. 模型评估
print("\n==== 模型评估结果 ====")
print(f"正确率(Accuracy):{accuracy_score(y_test, y_pred):.4f}")
print(f"精确率(Precision):{precision_score(y_test, y_pred):.4f}")
print(f"召回率(Recall):{recall_score(y_test, y_pred):.4f}")
print(f"F1-score:{f1_score(y_test, y_pred):.4f}")
print(f"AUC值:{roc_auc_score(y_test, y_pred_prob):.4f}")

3. 关键注意点

  1. 特征标准化 :逻辑回归基于梯度下降优化,特征尺度不一致会导致收敛慢或效果差,必须用StandardScaler标准化;
  2. 缺失值处理 :现实数据常含缺失值,这里用dropna删除,也可以用均值/中位数填充;
  3. 概率输出predict_proba返回每个样本属于各类别的概率,比predict(直接返回类别)更灵活(可自定义阈值)。

4. 运行结果示例

复制代码
模型权重w:[[-0.32  0.51 -0.48 -0.55 -0.21 -0.38 -0.52 -0.29 -0.25]]
模型偏置b:[-0.12]

==== 模型评估结果 ====
正确率(Accuracy):0.9649
精确率(Precision):0.9524
召回率(Recall):0.9762
F1-score:0.9642
AUC值:0.9876

AUC接近0.99,说明模型区分能力很强!

五、学习路径规划(新手友好)

如果想系统学习逻辑回归,推荐按这个顺序来:

  1. 先搞懂核心概念:二分类场景、Sigmoid函数的作用;
  2. 吃透数学基础:损失函数的推导、极大似然估计的思想(不用死磕公式,理解逻辑即可);
  3. 动手实现基础案例:用Scikit-learn跑通1-2个数据集(如本文的乳腺癌预测、鸢尾花二分类);
  4. 深入模型评估:对比不同阈值下的精确率/召回率,绘制ROC曲线;
  5. 实战复杂场景:如电信客户流失预测(处理类别不平衡、特征筛选)。

六、常见问题总结(避坑指南)

  1. 逻辑回归能做多分类吗?

    可以!通过"一对多"(OvR)或"一对一"(OvO)策略扩展,Scikit-learn的LogisticRegression默认支持多分类。

  2. 特征之间有相关性,会影响逻辑回归吗?

    会!逻辑回归假设特征独立,多重共线性会导致系数不稳定,可通过方差膨胀因子(VIF)检测并删除高相关特征。

  3. 为什么我的模型AUC很低?

    可能原因:特征工程不到位(如未标准化、缺失值未处理)、类别不平衡、阈值设置不合理。

  4. 逻辑回归和线性回归的区别?

    • 线性回归:预测连续值,损失函数是MSE;
    • 逻辑回归:预测离散类别,损失函数是对数似然损失,通过Sigmoid函数转换。

结语

逻辑回归是机器学习的"入门钥匙"------它不仅能解决实际分类问题,还能帮我们理解激活函数、损失函数、模型评估等核心概念,为后续学习神经网络、深度学习打下基础。

作为新手,建议多动手跑代码、调参数,感受不同因素对模型效果的影响。如果遇到问题,欢迎在评论区交流~ 祝大家学习顺利!

相关推荐
Pyeako7 小时前
机器学习--逻辑回归
人工智能·python·机器学习·逻辑回归
aloha_7897 小时前
接口自动化框架学习
功能测试·学习·自动化·模块测试
走在路上的菜鸟7 小时前
Android学Dart学习笔记第十九节 类-混入Mixins
android·笔记·学习·flutter
Salt_07287 小时前
DAY 37 MLP 神经网络的训练
人工智能·python·深度学习·神经网络·机器学习
Coovally AI模型快速验证7 小时前
是什么支撑L3自动驾驶落地?读懂AI驾驶与碰撞预测
人工智能·深度学习·目标检测·机器学习·计算机视觉·自动驾驶
Java后端的Ai之路8 小时前
【分析式AI】-LightGBM算法命名解释
人工智能·算法·机器学习·aigc·分析式ai
有为少年8 小时前
带噪学习 | Ambient Diffusion (NeurIPS 2023) 上篇
人工智能·深度学习·神经网络·学习·机器学习·计算机视觉·生成模型
甲虫机8 小时前
深度学习权重计算三步法则
人工智能·机器学习
啃火龙果的兔子8 小时前
Java 学习路线及学习周期
java·开发语言·学习