线性回归与逻辑回归:从预测到分类
线性回归与逻辑回归:从预测到分类
引言
在机器学习的世界里,回归和分类是两类最基础的问题。线性回归解决的是“预测一个连续值”的问题,而逻辑回归虽然名字里有“回归”,却是一种强大的分类算法。理解它们之间的内在联系与本质区别,是构建更复杂模型的基石。本教程将带你从零开始,用清晰的数学直觉和可运行的代码,掌握这两种必备算法。
线性回归
什么是线性回归?
线性回归通过拟合一条直线(或超平面)来描述自变量( 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) )决定,这本身就是一条直线。因此,逻辑回归本质上仍然是线性分类器。当数据不是线性可分时,可以考虑添加多项式特征或使用其他非线性模型。
常见问题与避坑指南
- 特征缩放:线性回归和逻辑回归都对特征尺度敏感,使用前应进行标准化(StandardScaler)或归一化(MinMaxScaler)。
- 多重共线性:特征之间高度相关会导致权重不稳定,可进行特征选择或使用正则化(Ridge/Lasso)解决。
- 类别不平衡:逻辑回归的默认阈值0.5可能失效,可根据业务调整阈值,或采用class_weight参数。
- 过拟合:当特征数量远大于样本数时,应添加L1或L2正则化(在sklearn中通过penalty参数控制)。
- 异常值处理:线性回归对异常值敏感,可考虑使用稳健回归(如HuberRegressor);逻辑回归中的极端异常值会影响决策边界斜率。
总结
线性回归是解决回归问题的入门算法,直观且可解释性强;逻辑回归则是二分类的利器,以概率视角优雅地输出类别。虽然两者都基于线性假设,但它们通过不同的输出层和损失函数适应了不同的问题场景。掌握这两种模型,你就拥有了数据科学工具箱中最坚实的基石。下一步,可以尝试将它们应用到真实数据集中,并实验正则化、特征工程带来的性能提升。