线性回归与逻辑回归:从预测到分类

FreeGuideOnline 最新 2026-06-16

线性回归与逻辑回归:从预测到分类

引言

在机器学习的世界里,回归和分类是两类最基础的问题。线性回归解决的是“预测一个连续值”的问题,而逻辑回归虽然名字里有“回归”,却是一种强大的分类算法。理解它们之间的内在联系与本质区别,是构建更复杂模型的基石。本教程将带你从零开始,用清晰的数学直觉和可运行的代码,掌握这两种必备算法。

线性回归

什么是线性回归?

线性回归通过拟合一条直线(或超平面)来描述自变量( X )与因变量( y )之间的关系。核心假设是这种关系可以近似为特征的线性组合。

典型应用:房价预测、气温预报、销量预估等。

数学模型

给定( n )个样本,每个样本有( m )个特征,线性回归模型表示为:

[ \hat{y} = w_0 + w_1x_1 + w_2x_2 + \dots + w_m x_m ]

向量形式:(\hat{y} = \mathbf{w}^T \mathbf{x} + b)。其中( \mathbf{w} )为权重向量,( b )为偏置项(也可并入权重,同时扩展特征列全为1)。目标是最小化预测值( \hat{y} )与真实值( y )之间的误差。

最小二乘法

最常见的损失函数是均方误差(MSE)

[ \text{Loss} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 ]

通过求导并令导数为零,可以得到参数的解析解(正规方程):

[ \mathbf{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y} ]

当特征数目很大时,计算逆矩阵的代价较高,此时常用梯度下降法进行迭代求解。梯度下降沿着损失函数梯度的反方向更新参数,直至收敛。

模型评估指标

  • MAE(平均绝对误差):(\frac{1}{n}\sum|y_i-\hat{y}_i|),对离群值鲁棒。
  • MSE(均方误差):(\frac{1}{n}\sum(y_i-\hat{y}_i)^2),对大误差惩罚更重。
  • RMSE(均方根误差):MSE的平方根,量纲与目标值一致。
  • ( R^2 )(决定系数):衡量模型解释了多少方差,取值通常在0~1之间,越接近1拟合越好。

[ R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2} ]

Python实战:sklearn线性回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 生成模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 训练模型
model = LinearRegression()
model.fit(X, y)

# 预测
y_pred = model.predict(X)

# 输出结果
print(f"截距: {model.intercept_[0]:.3f}")
print(f"系数: {model.coef_[0][0]:.3f}")
print(f"MSE: {mean_squared_error(y, y_pred):.3f}")
print(f"R²: {r2_score(y, y_pred):.3f}")

# 可视化
plt.scatter(X, y, alpha=0.7)
plt.plot(X, y_pred, color='red', linewidth=2)
plt.xlabel("X")
plt.ylabel("y")
plt.title("线性回归拟合直线")
plt.show()

逻辑回归

从“回归”到“分类”

逻辑回归主要用于二分类问题(也可扩展到多分类)。名字中的“回归”是因为它在线性组合的基础上套了一个函数,将输出映射到 (0,1) 区间,再解释为属于某一类的概率。

典型应用:垃圾邮件识别、疾病诊断、客户流失预测等。

Sigmoid函数与概率输出

给定线性得分( z = \mathbf{w}^T\mathbf{x} + b ),通过Sigmoid(逻辑)函数进行变换: [ \sigma(z) = \frac{1}{1 + e^{-z}} ] Sigmoid将任意实数压缩到(0,1)之间。最终预测概率: [ P(y=1|\mathbf{x}) = \sigma(\mathbf{w}^T\mathbf{x} + b) ] 当概率≥0.5时判定为正类,否则为负类。

决策边界

线性得分( z = 0 )对应( \sigma(z)=0.5 ),因此决策边界是( \mathbf{w}^T\mathbf{x} + b = 0 )。这是一条直线(或超平面),将特征空间划分为两个区域。

代价函数:对数损失

逻辑回归不再使用MSE,因为它会导致非凸优化问题。采用交叉熵损失(对数损失): [ J(\mathbf{w}) = -\frac{1}{n}\sum_{i=1}^{n}\left[y_i \log(\hat{p}_i) + (1-y_i)\log(1-\hat{p}_i)\right] ] 其中( \hat{p}_i = \sigma(z_i) )。当预测概率接近真实标签时,损失很小;反之则处罚很大。

该函数是凸函数,能够通过梯度下降等优化方法找到全局最优解。

模型评估指标

  • 准确率(Accuracy):(正确分类数 / 总数),在类别不平衡时不够可靠。
  • 精确率(Precision):TP / (TP + FP),关注查准率。
  • 召回率(Recall):TP / (TP + FN),关注查全率。
  • F1分数:精确率与召回率的调和平均值。
  • ROC曲线与AUC:描绘真正率(TPR)与假正率(FPR)的权衡,AUC值越大分类器性能越好。

Python实战:sklearn逻辑回归

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
import pandas as pd

# 使用经典鸢尾花数据集,只取两个类别做二分类
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[iris.target != 2]      # 仅保留类别0和1
y = iris.target[iris.target != 2]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 训练逻辑回归(默认使用L2正则化)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)

# 预测概率与类别
y_pred = logreg.predict(X_test)
y_prob = logreg.predict_proba(X_test)[:, 1]

# 评估
print(classification_report(y_test, y_pred))
print(f"AUC: {roc_auc_score(y_test, y_prob):.3f}")

# 查看系数
print("特征权重:", logreg.coef_)
print("偏置:", logreg.intercept_)

线性回归与逻辑回归的核心对比

维度 线性回归 逻辑回归
问题类型 回归(预测连续值) 分类(预测离散标签)
输出范围 实数( (-\infty, +\infty) ) 概率 (0,1)
激活函数 无(恒等映射) Sigmoid(逻辑函数)
损失函数 均方误差(MSE) 对数损失(交叉熵)
决策边界 不适用 线性(超平面)
参数优化 解析解或梯度下降 梯度下降或牛顿法
评估指标 MSE, MAE, (R^2) 准确率, F1, AUC等
假设前提 线性关系、误差正态分布 特征线性可分(对概率进行建模)

尽管两者原理和函数形式相似,但最关键的区别在于:线性回归直接输出数值,而逻辑回归通过Sigmoid将线性输出转化为概率,再结合阈值完成分类。

从线性回归视角理解逻辑回归

逻辑回归可以看作一种“广义线性模型”(GLM),它在线性回归的基础上串联了一个link函数(Sigmoid)。你可以想象我们先进行了一次线性预测,然后问:“这个预测值有多大把握让它属于正类?”Sigmoid给出的就是这个把握。

另一种直觉:逻辑回归的决策边界由( (\mathbf{w}^T\mathbf{x} + b = 0) )决定,这本身就是一条直线。因此,逻辑回归本质上仍然是线性分类器。当数据不是线性可分时,可以考虑添加多项式特征或使用其他非线性模型。

常见问题与避坑指南

  1. 特征缩放:线性回归和逻辑回归都对特征尺度敏感,使用前应进行标准化(StandardScaler)或归一化(MinMaxScaler)。
  2. 多重共线性:特征之间高度相关会导致权重不稳定,可进行特征选择或使用正则化(Ridge/Lasso)解决。
  3. 类别不平衡:逻辑回归的默认阈值0.5可能失效,可根据业务调整阈值,或采用class_weight参数。
  4. 过拟合:当特征数量远大于样本数时,应添加L1或L2正则化(在sklearn中通过penalty参数控制)。
  5. 异常值处理:线性回归对异常值敏感,可考虑使用稳健回归(如HuberRegressor);逻辑回归中的极端异常值会影响决策边界斜率。

总结

线性回归是解决回归问题的入门算法,直观且可解释性强;逻辑回归则是二分类的利器,以概率视角优雅地输出类别。虽然两者都基于线性假设,但它们通过不同的输出层和损失函数适应了不同的问题场景。掌握这两种模型,你就拥有了数据科学工具箱中最坚实的基石。下一步,可以尝试将它们应用到真实数据集中,并实验正则化、特征工程带来的性能提升。