《数据挖掘》第四章 回归分析 读书笔记

《数据挖掘》第四章 回归分析 读书笔记(详细技术版)

来源 :基于《数据挖掘》(主编:吕欣、王梦宁)教材 + 官方 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 $
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. 与仓库结合的建议

  1. 阅读仓库内 学习笔记/4 回归分析_A.md
  2. 运行 chapter4/code/ 中的脚本
  3. 尝试将本笔记中的代码迁移到仓库数据集上
  4. 对比不同正则化强度下系数的变化(画出正则化路径图)

本章小结

回归分析是数据挖掘中最基础且强大的预测工具。从简单线性回归到正则化方法,核心在于平衡偏差与方差。正则化技术(尤其是 Elastic Net)在高维数据时代尤为重要。

掌握本章后,你将具备构建稳健、可解释预测模型的核心能力。


文件生成时间:2026年5月
建议配合仓库代码与 statsmodels 深入学习统计推断部分

相关推荐
Omics Pro5 小时前
全流程可重复!R语言脂质组学:原始数据→功能解析
开发语言·人工智能·深度学习·语言模型·r语言·excel·知识图谱
optimistic_chen6 小时前
【AI Agent 全栈开发】MCP
java·linux·运维·人工智能·ai编程·mcp
listhi5206 小时前
Harris算子特征点提取、匹配和提纯的程序实现
人工智能·opencv·计算机视觉
AI袋鼠帝12 小时前
Codex终于进手机了!
人工智能
Lee川12 小时前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端
一个王同学12 小时前
从零到一 | CV转多模态大模型 | week09 | Minillava Refactor结合手搓和llava源码深入理解多模态大模型原理
人工智能·深度学习·机器学习·计算机视觉·改行学it
2601_9577875813 小时前
全场景矩阵系统多端统一体验与跨端实时同步技术实践
大数据·人工智能·矩阵·多端统一·跨端同步
liudanzhengxi13 小时前
AI提示词极限赛:突破边界的艺术
人工智能
ZhengEnCi13 小时前
09-斯坦福CS336作业 📝
人工智能