《数据挖掘》第四章 回归分析 读书笔记(详细技术版)
来源 :基于《数据挖掘》(主编:吕欣、王梦宁)教材 + 官方 GitHub 仓库 XL-lab-bigdata/DataMining
本章定位 :本书核心技术章节之一,重点讲解从简单线性回归到正则化回归的完整理论与实践。
仓库资源 :chapter4/code/包含回归相关脚本,data/提供.parquet数据集,学习笔记/4 回归分析_A.md可作为补充。
1. 本章学习目标
完成本章后,你将能够:
- 理解线性回归的数学原理与最小二乘法推导
- 掌握多元线性回归、多项式回归的建模方法
- 深入理解正则化技术(Ridge、Lasso、Elastic Net)的原理与区别
- 熟练使用评估指标(R²、调整R²、MSE、RMSE、MAE、AIC/BIC)
- 进行回归诊断(残差分析、多重共线性、异方差性)
- 使用Python(scikit-learn + statsmodels)完整实现各类回归模型
- 理解回归模型的假设条件及违反时的处理方法
2. 回归分析概述
回归分析(Regression Analysis) 是研究一个或多个自变量(特征)与一个因变量(目标)之间关系的统计方法,主要用于预测 和推断。
回归 vs 分类
| 维度 | 回归分析 | 分类分析 |
|---|---|---|
| 目标变量类型 | 连续型(数值) | 离散型(类别) |
| 典型输出 | 具体数值预测 | 类别概率或标签 |
| 常见算法 | 线性回归、Ridge、Lasso | 逻辑回归、决策树、SVM |
| 评估指标 | MSE、R²、RMSE | 准确率、精确率、召回率、F1 |
3. 简单线性回归(Simple Linear Regression)
3.1 模型形式
y = β 0 + β 1 x + ϵ y = \beta_0 + \beta_1 x + \epsilon y=β0+β1x+ϵ
其中:
- y y y:因变量(响应变量)
- x x x:自变量(预测变量)
- β 0 \beta_0 β0:截距
- β 1 \beta_1 β1:回归系数(斜率)
- ϵ \epsilon ϵ:随机误差项(假设 ϵ ∼ N ( 0 , σ 2 ) \epsilon \sim N(0, \sigma^2) ϵ∼N(0,σ2))
3.2 最小二乘法(OLS)推导
目标:最小化残差平方和(Residual Sum of Squares, RSS)
RSS = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − β 0 − β 1 x i ) 2 \text{RSS} = \sum_{i=1}^{n} (y_i - \hat{y}i)^2 = \sum{i=1}^{n} (y_i - \beta_0 - \beta_1 x_i)^2 RSS=i=1∑n(yi−y^i)2=i=1∑n(yi−β0−β1xi)2
通过对 β 0 \beta_0 β0 和 β 1 \beta_1 β1 求偏导并令其为0,可得解析解:
β 1 ^ = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 = Cov ( x , y ) Var ( x ) \hat{\beta_1} = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2} = \frac{\text{Cov}(x,y)}{\text{Var}(x)} β1^=∑i=1n(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)=Var(x)Cov(x,y)
β 0 ^ = y ˉ − β 1 ^ x ˉ \hat{\beta_0} = \bar{y} - \hat{\beta_1} \bar{x} β0^=yˉ−β1^xˉ
矩阵形式(便于扩展到多元回归):
β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^T X)^{-1} X^T y β^=(XTX)−1XTy
4. 多元线性回归(Multiple Linear Regression)
模型形式:
y = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β p x p + ϵ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p + \epsilon y=β0+β1x1+β2x2+⋯+βpxp+ϵ
矩阵形式:
y = X β + ϵ \mathbf{y} = X\boldsymbol{\beta} + \boldsymbol{\epsilon} y=Xβ+ϵ
β ^ = ( X T X ) − 1 X T y \hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T \mathbf{y} β^=(XTX)−1XTy
重要概念
- 偏回归系数:控制其他变量不变时,某变量变化一个单位对y的影响
- 多重共线性:自变量之间高度相关,导致系数估计不稳定
5. 多项式回归(Polynomial Regression)
当数据呈现非线性关系时,可通过添加高次项扩展线性模型:
y = β 0 + β 1 x + β 2 x 2 + β 3 x 3 + ⋯ + β d x d + ϵ y = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \cdots + \beta_d x^d + \epsilon y=β0+β1x+β2x2+β3x3+⋯+βdxd+ϵ
注意 :多项式回归本质仍是线性回归(对参数而言是线性的)。
过拟合风险:高阶多项式容易过拟合,通常配合正则化使用。
6. 正则化回归(Regularized Regression)------ 本章重点
当特征数量多或存在多重共线性时,普通最小二乘法容易过拟合或系数不稳定。正则化通过在损失函数中加入惩罚项来解决。
6.1 Ridge 回归(L2 正则化)
目标函数:
min β ( ∣ ∣ y − X β ∣ ∣ 2 2 + λ ∣ ∣ β ∣ ∣ 2 2 ) \min_{\beta} \left( ||y - X\beta||_2^2 + \lambda ||\beta||_2^2 \right) βmin(∣∣y−Xβ∣∣22+λ∣∣β∣∣22)
- λ \lambda λ:正则化强度(超参数)
- 特点:缩小所有系数,但不会将系数压缩至 exactly 0
- 适用场景:存在多重共线性时
闭式解:
β ^ = ( X T X + λ I ) − 1 X T y \hat{\beta} = (X^T X + \lambda I)^{-1} X^T y β^=(XTX+λI)−1XTy
6.2 Lasso 回归(L1 正则化)
目标函数:
min β ( ∣ ∣ y − X β ∣ ∣ 2 2 + λ ∣ ∣ β ∣ ∣ 1 ) \min_{\beta} \left( ||y - X\beta||_2^2 + \lambda ||\beta||_1 \right) βmin(∣∣y−Xβ∣∣22+λ∣∣β∣∣1)
- 特点:可以产生稀疏解(部分系数被压缩为0,实现特征选择)
- 适用场景:高维数据、需要自动特征选择时
6.3 Elastic Net(弹性网络)
结合 L1 和 L2:
min β ( ∣ ∣ y − X β ∣ ∣ 2 2 + λ 1 ∣ ∣ β ∣ ∣ 1 + λ 2 ∣ ∣ β ∣ ∣ 2 2 ) \min_{\beta} \left( ||y - X\beta||_2^2 + \lambda_1 ||\beta||_1 + \lambda_2 ||\beta||_2^2 \right) βmin(∣∣y−Xβ∣∣22+λ1∣∣β∣∣1+λ2∣∣β∣∣22)
或写成:
α ⋅ L1 + ( 1 − α ) ⋅ L2 \alpha \cdot \text{L1} + (1-\alpha) \cdot \text{L2} α⋅L1+(1−α)⋅L2
对比总结表:
| 方法 | 惩罚项 | 系数压缩方式 | 特征选择能力 | 对多重共线性敏感度 | 推荐场景 |
|---|---|---|---|---|---|
| OLS | 无 | 无 | 无 | 高 | 特征少、无共线性 |
| Ridge | L2 | 全部缩小 | 弱 | 低 | 多重共线性严重 |
| Lasso | L1 | 部分压缩至0 | 强 | 中 | 高维数据、自动特征选择 |
| Elastic Net | L1+L2 | 部分压缩至0 | 强 | 低 | 特征数 > 样本数,或强相关特征 |
7. 模型评估指标
7.1 常用回归评估指标
| 指标 | 公式 | 含义 | 特点 |
|---|---|---|---|
| MSE | 1 n ∑ ( y i − y ^ i ) 2 \frac{1}{n}\sum (y_i - \hat{y}_i)^2 n1∑(yi−y^i)2 | 均方误差 | 对异常值敏感 |
| RMSE | MSE \sqrt{\text{MSE}} MSE | 均方根误差 | 与目标变量同量纲 |
| MAE | $\frac{1}{n}\sum | y_i - \hat{y}_i | $ |
| R² | 1 − SS r e s SS t o t 1 - \frac{\text{SS}{res}}{\text{SS}{tot}} 1−SStotSSres | 决定系数 | 解释方差比例,0~1之间 |
| 调整R² | 1 − ( 1 − R 2 ) n − 1 n − p − 1 1 - (1-R^2)\frac{n-1}{n-p-1} 1−(1−R2)n−p−1n−1 | 惩罚特征数量的R² | 更适合多元回归 |
| AIC / BIC | - | 信息准则 | 模型复杂度与拟合权衡 |
7.2 残差分析(模型诊断)
良好回归模型的残差应满足:
- 均值为0
- 方差齐性(同方差)
- 近似正态分布
- 无自相关(时间序列时)
常用诊断图:
- 残差 vs 拟合值图(检查异方差)
- Q-Q 图(检查正态性)
- 残差 vs 杠杆值图(检查异常点)
8. 完整 Python 实战代码(强烈推荐结合仓库运行)
以下代码整合了简单线性回归 → 多元回归 → 多项式回归 → Ridge/Lasso/Elastic Net 全流程,适合直接在仓库环境中运行。
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.pipeline import Pipeline
import statsmodels.api as sm
import warnings
warnings.filterwarnings('ignore')
# ==================== 1. 数据准备 ====================
# 推荐使用仓库数据:df = pd.read_parquet('chapter4/data/xxx.parquet')
np.random.seed(42)
n = 500
X = pd.DataFrame({
'面积': np.random.uniform(50, 200, n),
'房龄': np.random.uniform(0, 30, n),
'距离地铁': np.random.uniform(0.5, 10, n),
' bedrooms': np.random.randint(1, 6, n)
})
# 构造带噪声的非线性目标
y = (3.5 * X['面积'] - 0.8 * X['房龄']**1.5 +
15 * np.log(X['距离地铁'] + 1) +
20 * X['bedrooms'] + np.random.normal(0, 30, n))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ==================== 2. 简单线性回归 ====================
lr_simple = LinearRegression()
lr_simple.fit(X_train[['面积']], y_train)
y_pred_simple = lr_simple.predict(X_test[['面积']])
print(f"简单线性回归 R²: {r2_score(y_test, y_pred_simple):.4f}")
# ==================== 3. 多元线性回归 ====================
lr_multi = LinearRegression()
lr_multi.fit(X_train, y_train)
y_pred_multi = lr_multi.predict(X_test)
print(f"多元线性回归 R²: {r2_score(y_test, y_pred_multi):.4f}")
# 使用 statsmodels 进行详细统计推断
X_train_sm = sm.add_constant(X_train)
model_sm = sm.OLS(y_train, X_train_sm).fit()
print(model_sm.summary())
# ==================== 4. 多项式回归(带 Pipeline) ====================
poly_pipeline = Pipeline([
('poly', PolynomialFeatures(degree=2, include_bias=False)),
('scaler', StandardScaler()),
('lr', LinearRegression())
])
poly_pipeline.fit(X_train, y_train)
print(f"多项式回归 (degree=2) R²: {poly_pipeline.score(X_test, y_test):.4f}")
# ==================== 5. 正则化回归 + 超参数调优 ====================
# Ridge
ridge = Ridge()
param_grid = {'alpha': np.logspace(-3, 3, 13)}
ridge_cv = GridSearchCV(ridge, param_grid, cv=5, scoring='r2')
ridge_cv.fit(X_train, y_train)
print(f"最佳 Ridge alpha: {ridge_cv.best_params_['alpha']}, R²: {ridge_cv.best_score_:.4f}")
# Lasso
lasso = Lasso(max_iter=10000)
lasso_cv = GridSearchCV(lasso, param_grid, cv=5, scoring='r2')
lasso_cv.fit(X_train, y_train)
print(f"最佳 Lasso alpha: {lasso_cv.best_params_['alpha']}")
# Elastic Net
elastic = ElasticNet(max_iter=10000)
elastic_cv = GridSearchCV(elastic, param_grid, cv=5, scoring='r2')
elastic_cv.fit(X_train, y_train)
# ==================== 6. 模型对比 ====================
models = {
'Linear': LinearRegression(),
'Ridge': ridge_cv.best_estimator_,
'Lasso': lasso_cv.best_estimator_,
'ElasticNet': elastic_cv.best_estimator_
}
results = []
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
results.append({
'Model': name,
'R²': r2_score(y_test, y_pred),
'RMSE': np.sqrt(mean_squared_error(y_test, y_pred)),
'MAE': mean_absolute_error(y_test, y_pred)
})
results_df = pd.DataFrame(results)
print("\n模型性能对比:")
print(results_df.sort_values('R²', ascending=False))
# ==================== 7. 残差诊断 ====================
residuals = y_test - y_pred_multi
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
sns.scatterplot(x=y_pred_multi, y=residuals, ax=axes[0])
axes[0].axhline(0, color='red', linestyle='--')
axes[0].set_title('Residuals vs Fitted')
sm.qqplot(residuals, line='45', ax=axes[1])
axes[1].set_title('Q-Q Plot')
plt.tight_layout()
plt.show()
9. 回归诊断 checklist
- 线性关系:自变量与因变量存在线性关系
- 独立性:残差之间相互独立(Durbin-Watson 检验)
- 同方差性:残差方差恒定
- 正态性:残差近似正态分布
- 无多重共线性:VIF < 5 或 10
- 无强影响点:Cook's Distance、杠杆值检查
10. 高级主题简述
- 广义线性模型(GLM):逻辑回归、泊松回归等(当因变量非正态时)
- 分位数回归:预测条件分位数而非均值
- 稳健回归:对异常值不敏感的方法(RANSAC、Huber)
- 时间序列回归:加入滞后项、ARIMA 误差等
11. 本章知识总结 + 实践 checklist
- 掌握 OLS 推导与矩阵形式
- 理解 Ridge vs Lasso 的本质区别(L2 收缩 vs L1 稀疏)
- 能用 Pipeline 构建多项式 + 正则化流程
- 熟练解读
statsmodels的 summary 报告 - 能进行残差诊断并判断模型问题
- 知道何时使用哪种正则化方法
12. 与仓库结合的建议
- 阅读仓库内
学习笔记/4 回归分析_A.md - 运行
chapter4/code/中的脚本 - 尝试将本笔记中的代码迁移到仓库数据集上
- 对比不同正则化强度下系数的变化(画出正则化路径图)
本章小结 :
回归分析是数据挖掘中最基础且强大的预测工具。从简单线性回归到正则化方法,核心在于平衡偏差与方差。正则化技术(尤其是 Elastic Net)在高维数据时代尤为重要。
掌握本章后,你将具备构建稳健、可解释预测模型的核心能力。
文件生成时间:2026年5月
建议配合仓库代码与 statsmodels 深入学习统计推断部分