02 统计学习

核心问题:什么是统计学习?

统计学习是一套用于理解数据的工具集。

  • 监督学习:基于输入变量,构建统计模型来预测或估计输出变量
  • 无监督学习:没有明确的输出变量,从数据中发现结构和模式

核心思想:假设输出变量 \(Y\) 与输入变量 \(X = (X_1, X_2, \dots, X_p)\) 之间存在某种关系:

\[ \large{Y = f(X) + \epsilon} \]

  • \(f\):未知的系统性函数,捕捉 \(X\)\(Y\) 的影响
  • \(\epsilon\):随机误差项,均值为零,与 \(X\) 独立

统计学习的历史脉络

统计学习并非一夜之间诞生,而是多个学科交汇融合的产物:

时期 里程碑 关键贡献
1800s 最小二乘法 高斯、勒让德奠定回归分析基础
1930s Fisher 判别分析 分类问题的统计解法
1970s 交叉验证、Bootstrap 模型评估与推断的革命
1990s 随机森林、SVM 机器学习与统计的深度融合
2010s 深度学习爆发 非参数方法达到新高度

启示:统计学习是一个不断演进的领域,核心是用数据驱动决策

为什么商学院学生需要统计学习?

统计学习已经渗透到金融与商业的每个角落:

  • 投资管理:量化基金使用机器学习模型每天处理TB级市场数据
  • 风险控制:银行用分类模型评估贷款违约概率
  • 供应链优化:制造业用回归模型预测需求,降低库存成本
  • 精准营销:电商平台用推荐系统为每个用户定制展示内容

长三角地区案例

  • 海康威视(杭州):利用深度学习驱动智能安防产品
  • 科大讯飞(合肥):自然语言处理是统计学习的前沿应用
  • 宁波银行(宁波):用统计模型构建小微企业信用评分体系

本课程的目标:让你能够理解、评估并应用这些方法来解决真实商业问题。

直觉理解:\(f\) 是连接输入与输出的桥梁

统计学习核心概念图 展示输入变量X通过函数f映射到输出Y,加上随机误差项epsilon 输入 X X₁: 研发投入 X₂: 营收规模 X₃: 资产负债率 f(X) 未知系统性函数 输出 Y 利润增长率 + ε 随机误差 Y = f(X) + ε 统计学习的目标:估计这个未知的 f
Figure 1: 统计学习的核心概念:输入变量 \(X\) 通过函数 \(f\) 映射到输出 \(Y\)

实例:上市公司营收与利润的关系

以长三角地区上市公司为例,探索营业收入与净利润之间的系统性关系。

Code
import pandas as pd  # 导入pandas用于数据框操作
import numpy as np  # 导入numpy用于数值计算
import matplotlib.pyplot as plt  # 导入matplotlib用于可视化
import os  # 导入os模块用于跨平台路径

# 根据操作系统自动选择本地数据路径
DATA_ROOT = 'C:/qiufei/data' if os.name == 'nt' else '/home/ubuntu/r2_data_mount/qiufei/data'

# 读取上市公司基本信息和财务报表数据
stock_basic_info = pd.read_hdf(os.path.join(DATA_ROOT, 'stock/stock_basic_data.h5'))  # 上市公司基本信息
financial_statements = pd.read_hdf(os.path.join(DATA_ROOT, 'stock/financial_statement.h5'))  # 财务报表数据
Figure 2

数据可视化:营收-利润散点图

Code
# 筛选长三角四省市上市公司
yrd_provinces = ['上海市', '江苏省', '浙江省', '安徽省']  # 长三角四省市列表(与数据中省份全称匹配)
yrd_stock_codes = stock_basic_info[stock_basic_info['province'].isin(yrd_provinces)]['order_book_id'].tolist()  # 获取长三角地区股票代码

# 筛选2023年年报数据(quarter列格式为'2023q4'表示年报)
annual_report_2023 = financial_statements[
    (financial_statements['order_book_id'].isin(yrd_stock_codes)) &  # 限定长三角公司
    (financial_statements['quarter'] == '2023q4')  # 筛选2023年年报(第四季度)
].copy()  # 创建副本避免链式赋值警告

# 取营业收入和净利润两列,去除缺失值
revenue_profit_data = annual_report_2023[['revenue', 'net_profit']].dropna()  # 提取核心财务指标
# 转换为亿元单位便于阅读
revenue_profit_data['revenue_billion'] = revenue_profit_data['revenue'] / 1e8  # 营业收入转为亿元
revenue_profit_data['profit_billion'] = revenue_profit_data['net_profit'] / 1e8  # 净利润转为亿元
# 剔除极端值:仅保留营收在(0, 500亿)区间的公司
plot_data = revenue_profit_data[
    (revenue_profit_data['revenue_billion'] > 0) &  # 排除营收为负或零的公司
    (revenue_profit_data['revenue_billion'] < 500)  # 排除超大型企业以免影响可视化
].copy()  # 创建绘图用数据子集
Figure 3
Code
# 创建散点图画布
fig, ax_scatter = plt.subplots(figsize=(10, 6))  # 设置画布尺寸
ax_scatter.scatter(
    plot_data['revenue_billion'],  # X轴:营业收入(亿元)
    plot_data['profit_billion'],  # Y轴:净利润(亿元)
    alpha=0.4, s=30, color='#00A4E6'  # 设置透明度、点大小和颜色
)

# 添加LOWESS平滑趋势线展示系统性关系f(X)
from statsmodels.nonparametric.smoothers_lowess import lowess  # 导入LOWESS非参数平滑
sorted_data = plot_data.sort_values('revenue_billion')  # 按营收升序排列
smoothed_trend = lowess(
    sorted_data['profit_billion'],  # 因变量:净利润
    sorted_data['revenue_billion'],  # 自变量:营收
    frac=0.3  # 平滑参数:使用30%数据点的局部窗口
)
ax_scatter.plot(smoothed_trend[:, 0], smoothed_trend[:, 1], 'r-', linewidth=2.5, label='f̂(X) — LOWESS趋势')  # 绘制趋势线

ax_scatter.set_xlabel('营业收入(亿元)', fontsize=12)  # X轴标签
ax_scatter.set_ylabel('净利润(亿元)', fontsize=12)  # Y轴标签
ax_scatter.legend(fontsize=11)  # 显示图例
ax_scatter.grid(True, alpha=0.3)  # 添加网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示散点图
Figure 4: 长三角上市公司营收vs净利润 (2023年报)

为什么要估计 \(f\)?—— 两大目的

估计 \(f\) 的两个主要原因:

目的 核心关注 \(\hat{f}\) 的要求 金融应用案例
预测 \(\hat{Y}\) 的准确性 精度高即可,可为”黑箱” 股价趋势预测、信用违约概率
推断 \(X\) 如何影响 \(Y\) 必须可解释 股权激励 → ROE?研发投入 → 利润增长?

预测与推断:一枚硬币的两面

理解预测与推断的区别,是正确选择统计方法的前提:

预测场景(黑箱思维):

  • ‘我不在乎房价为什么涨,我只想知道明天涨不涨’
  • 关注点:\(\hat{Y}\) 的精度
  • 允许使用不可解释的复杂模型

推断场景(透明思维):

  • ‘我想知道增加独立董事比例是否能提升公司治理效率’
  • 关注点:\(X_j\)\(Y\) 之间的因果关系
  • 必须使用可解释的模型

现实中往往两者兼需:基金经理既需要预测收益(预测),也需要向投资者解释为什么买入某只股票(推断)。

预测:将 \(\hat{f}\) 视为黑箱

当目标是预测时:

\[ \large{\hat{Y} = \hat{f}(X)} \]

预测误差可分解为两部分:

\[ \large{E(Y - \hat{Y})^2 = \underbrace{[f(X) - \hat{f}(X)]^2}_{\text{可约误差}} + \underbrace{\text{Var}(\epsilon)}_{\text{不可约误差}}} \]

  • 可约误差:通过改进模型 \(\hat{f}\) 可以减小
  • 不可约误差:数据中固有的随机噪声,模型无法消除

关键启示:即使估计出完美的 \(f\),预测仍然存在误差。

预测误差分解的直觉理解

让我们用一个通俗的比喻来理解预测误差的两个来源:

可约误差(Reducible Error)

  • 类比:你用一张模糊地图导航,因为地图不精确而走错路
  • 解决方案:换一张更精确的地图(改进模型 \(\hat{f}\)
  • 统计含义:\([f(X) - \hat{f}(X)]^2\)

不可约误差(Irreducible Error)

  • 类比:即使你有完美地图,路上仍然可能遇到随机堵车
  • 无法消除:这是数据中固有的随机性
  • 统计含义:\(\text{Var}(\epsilon)\)

核心启示:统计学习的目标是尽量减小可约误差——这是我们唯一能控制的部分。

金融案例:为什么完美预测不可能?

股票收益率预测为例:

\[ \large{R_{\text{stock}} = f(\text{基本面}, \text{技术面}, \text{宏观}) + \epsilon} \]

可约误差的来源

  • 使用了错误的特征变量(遗漏重要因子)
  • 模型形式不对(用线性模型拟合非线性关系)
  • 数据质量不佳(财务数据有噪声或延迟)

不可约误差的来源

  • 突发事件(战争、疫情、自然灾害)
  • 市场情绪的非理性波动
  • 内幕信息驱动的交易
  • 政策突变(如突然的监管政策调整)

这解释了为什么即使是最顶尖的量化基金,年化收益率也很难持续超过30%。

推断:理解 \(X\)\(Y\) 的关系

当目标是推断时,我们关心的核心问题:

  1. 哪些变量与 \(Y\) 相关?
    • 在众多财务指标中,哪些真正影响股价表现?
  2. \(X\)\(Y\) 的关系方向与强度?
    • 研发投入增加10%,利润增长多少?
  3. 这种关系是线性还是非线性?
    • 资产负债率与破产概率是否呈加速递增关系?

推断要求模型必须是可解释的——这就是为什么在学术论文和政策研究中,线性模型仍然是主流。

推断在学术研究与政策中的核心地位

在经济学和金融学的学术研究中,推断远比预测重要

学术研究的核心问题都是推断性质的

  • ‘ESG评分高的公司,长期股价表现是否更好?’
  • ‘提高最低工资是否会增加失业率?’
  • ‘股权质押是否会导致大股东利益侵占?’

政策制定依赖推断

  • 央行需要知道:利率变动如何影响实体经济
  • 证监会需要知道:信息披露制度是否改善了市场效率

关键挑战:相关性 ≠ 因果性

  • 冰淇淋销量与溺水事故正相关,但冰淇淋不会导致溺水
  • 在金融数据中,虚假相关(spurious correlation)无处不在

如何估计 \(f\)?—— 参数化方法

参数化方法分两步:

第一步:假设函数形式

例如,假设 \(f\) 是线性的:

\[ \large{f(X) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p} \]

第二步:用数据拟合参数

使用最小二乘法(OLS)等方法估计 \(\beta_0, \beta_1, \dots, \beta_p\)

优势:参数少,估计简单,可解释性强

风险:如果真实 \(f\) 不是线性的,模型将永远有偏差

参数化方法:以线性回归为例

线性模型的经济学直觉

假设我们研究公司利润(\(Y\))与营业收入(\(X_1\))、研发投入(\(X_2\))的关系:

\[ \large{\text{利润} = \beta_0 + \beta_1 \times \text{营收} + \beta_2 \times \text{研发} + \epsilon} \]

参数的经济含义

  • \(\beta_0\):基准利润(所有解释变量为零时的利润水平)
  • \(\beta_1\):营收每增加1亿元,利润平均增加 \(\beta_1\) 亿元
  • \(\beta_2\):研发投入每增加1亿元,利润平均变化 \(\beta_2\) 亿元

为什么是’参数化’:整个模型由有限个参数 \((\beta_0, \beta_1, \beta_2)\) 完全确定。

风险警示:如果利润与营收的真实关系是非线性的(例如存在规模效应),线性模型将无法捕捉这种非线性特征。

如何估计 \(f\)?—— 非参数化方法

非参数化方法:不对 \(f\) 的函数形式做假设,让数据决定形状。

常见方法:

  • 样条回归 (Splines):局部多项式拟合
  • 核回归 (Kernel Regression):基于距离的加权平均
  • 决策树 (Decision Trees):递归划分特征空间
  • 随机森林 (Random Forests):多棵树的集成
  • 神经网络 (Neural Networks):多层非线性变换

优势:可以捕捉任意复杂的非线性关系

风险:需要大量数据;容易过拟合;可解释性差

参数化 vs 非参数化:一张对比图

维度 参数化方法 非参数化方法
函数形式 预先假设(如线性) 由数据决定
参数数量 固定且少(p+1个) 随样本量增长
数据需求 较少 大量
过拟合风险 较低 较高
可解释性
适用场景 推断为主的研究 预测为主的应用

实践指南

  • 数据量少、需要可解释 → 参数化方法(线性回归、Logistic回归)
  • 数据量大、追求预测精度 → 非参数化方法(随机森林、深度学习)
  • 不确定时 → 从简单模型开始,逐步增加复杂度

核心权衡:灵活性 vs 可解释性

灵活性与可解释性权衡图 展示不同统计学习方法在灵活性和可解释性之间的取舍关系 灵活性 (Flexibility) → 可解释性 (Interpretability) → 子集选择 Lasso OLS GAM 决策树 随机森林 SVM 深度学习
Figure 5: 不同统计学习方法在灵活性-可解释性谱系上的位置

方法选择取决于业务目标

方法选择的黄金法则:没有最好的方法,只有最适合业务问题的方法。

场景一:学术论文(推断导向)

  • 目标:证明ESG评分影响公司价值
  • 方法:线性回归/面板回归 → 可解释,能做因果推断
  • 灵活性需求:低

场景二:量化投资(预测导向)

  • 目标:预测下周收益率最高的50只股票
  • 方法:随机森林/GBDT → 高预测精度
  • 灵活性需求:高

场景三:风控报告(推断+预测)

  • 目标:识别高风险客户,且需要向监管解释决策依据
  • 方法:Logistic回归/LASSO → 兼顾预测和可解释性
  • 灵活性需求:中等

回归 vs 分类:取决于输出类型

维度 回归 (Regression) 分类 (Classification)
输出变量 连续型(定量) 离散型(定性/类别)
典型场景 预测股价收益率 预测公司是否违约
评估指标 MSE, RMSE, R² 准确率, AUC, F1
典型方法 线性回归, Ridge, Lasso 逻辑回归, SVM, 决策树

注意:有些方法(如KNN、决策树、神经网络)既适用于回归也适用于分类。

金融中的回归与分类实例

回归问题(输出为连续值):

  • 预测公司下一季度的营业收入增长率
  • 估计期权的理论价格(Black-Scholes公式的非参数替代)
  • 预测GDP增长率

分类问题(输出为类别):

  • 判断上市公司是否会在下一年ST(特别处理)
  • 识别财务报表是否存在造假
  • 预测信用评级等级(AAA / AA / A / BBB / …)

边界情况

  • 有些问题既可以建模为回归也可以建模为分类
  • 例如:预测股价涨跌(分类)vs 预测收益率(回归)
  • 选择取决于业务决策如何使用模型输出

衡量模型好坏:均方误差 (MSE)

在回归问题中,最常用的评估指标是均方误差 (Mean Squared Error):

\[ \large{\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{f}(x_i))^2} \]

关键区分:

  • 训练 MSE:在训练数据上计算 → 衡量模型对已知数据的拟合程度
  • 测试 MSE:在未见过的数据上计算 → 衡量模型的泛化能力

核心原则:我们真正关心的永远是测试 MSE,而非训练 MSE。

为什么关注测试MSE而非训练MSE?

考试类比

  • 训练MSE → 用课后习题评估学生 → 学生可能只是背了答案
  • 测试MSE → 用从未见过的考试题评估 → 反映真正的理解能力

在金融中的含义

  • 用2015-2019年数据训练的模型在这段时期表现优异(低训练MSE)
  • 但在2020年新冠疫情期间可能完全失效(高测试MSE)
  • 模型只是’记住了’历史模式,没有学到泛化规律

核心原则

\[ \large{\text{好模型} \neq \text{训练MSE最低的模型}} \] \[ \large{\text{好模型} = \text{测试MSE最低的模型}} \]

实践方法:使用交叉验证(Cross-Validation)来估计测试MSE → 这是第5章的核心内容。

过拟合现象:训练误差与测试误差的分道扬镳

Code
from sklearn.preprocessing import PolynomialFeatures  # 导入多项式特征变换器
from sklearn.linear_model import LinearRegression  # 导入线性回归模型
from sklearn.metrics import mean_squared_error  # 导入均方误差评估函数

# 使用A股上市公司数据模拟过拟合实验
np.random.seed(42)  # 固定随机种子确保实验可重复
sample_size = 120  # 设定模拟样本数量
x_simulation = np.sort(np.random.uniform(0, 10, sample_size))  # 生成均匀分布的自变量
# 真实函数:非线性关系 f(x) = sin(x) + 0.3x
true_function_values = np.sin(x_simulation) + 0.3 * x_simulation  # 计算真实函数值
# 添加高斯噪声模拟现实数据中的不可约误差
y_observed = true_function_values + np.random.normal(0, 1.5, sample_size)  # 生成含噪声的观测值

# 按60%/40%划分训练集和测试集
train_cutoff = 70  # 训练集包含前70个样本
x_train_2d = x_simulation[:train_cutoff].reshape(-1, 1)  # 训练集自变量(转为二维数组)
y_train_vec = y_observed[:train_cutoff]  # 训练集因变量
x_test_2d = x_simulation[train_cutoff:].reshape(-1, 1)  # 测试集自变量
y_test_vec = y_observed[train_cutoff:]  # 测试集因变量
Figure 6

过拟合实验结果:U型曲线的经典展示

Code
polynomial_degrees = range(1, 12)  # 尝试1至11阶多项式模型
training_mse_list = []  # 存储各阶数的训练MSE
testing_mse_list = []  # 存储各阶数的测试MSE

for degree in polynomial_degrees:  # 遍历每个多项式阶数
    poly_transform = PolynomialFeatures(degree=degree, include_bias=False)  # 创建指定阶数的多项式变换器
    x_train_poly = poly_transform.fit_transform(x_train_2d)  # 对训练数据进行多项式展开
    x_test_poly = poly_transform.transform(x_test_2d)  # 对测试数据应用相同变换
    ols_model = LinearRegression().fit(x_train_poly, y_train_vec)  # 在多项式特征上拟合OLS
    training_mse_list.append(mean_squared_error(y_train_vec, ols_model.predict(x_train_poly)))  # 记录训练MSE
    testing_mse_list.append(mean_squared_error(y_test_vec, ols_model.predict(x_test_poly)))  # 记录测试MSE

# 绘制训练MSE与测试MSE双曲线图
fig, ax_mse = plt.subplots(figsize=(10, 6))  # 创建画布
ax_mse.plot(list(polynomial_degrees), training_mse_list, 'd-', color='#10B981', linewidth=2, label='训练 MSE')  # 训练曲线
ax_mse.plot(list(polynomial_degrees), testing_mse_list, 's-', color='#EF4444', linewidth=2.5, label='测试 MSE')  # 测试曲线
optimal_degree = list(polynomial_degrees)[np.argmin(testing_mse_list)]  # 找到测试MSE最低的阶数
ax_mse.axvline(x=optimal_degree, color='#4B5563', linestyle='--', alpha=0.6, label=f'最优阶数 = {optimal_degree}')  # 最优阶数垂线
ax_mse.set_xlabel('多项式阶数(模型复杂度)', fontsize=12)  # X轴标签
ax_mse.set_ylabel('均方误差 (MSE)', fontsize=12)  # Y轴标签
ax_mse.set_yscale('log')  # Y轴使用对数刻度
ax_mse.legend(fontsize=11)  # 显示图例
ax_mse.grid(True, alpha=0.3)  # 添加网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图表
Figure 7: 过拟合演示:训练MSE持续下降,但测试MSE先降后升形成U型曲线

过拟合的现实后果:量化交易的教训

真实案例:某量化基金的过拟合灾难

  1. 策略开发阶段:使用10年历史数据,尝试了500种因子组合
  2. 回测表现:发现一个年化60%的’神奇策略’
  3. 实盘运行:第一个月亏损8%
  4. 事后诊断:策略完美拟合了历史噪声,但不具备泛化能力

过拟合的警告信号

  • 训练表现远优于测试表现
  • 模型对小幅数据变动极度敏感
  • 模型参数数量接近或超过样本量
  • 回测收益曲线’过于完美’

防止过拟合的方法(后续章节详解):

  • 交叉验证(第5章)
  • 正则化:Ridge / Lasso(第6章)
  • 集成学习(第8章)

偏差-方差权衡:过拟合的理论解释

测试 MSE 可以严格分解为三部分:

\[ \large{E(y_0 - \hat{f}(x_0))^2 = \underbrace{[\text{Bias}(\hat{f}(x_0))]^2}_{\text{偏差}^2} + \underbrace{\text{Var}(\hat{f}(x_0))}_{\text{方差}} + \underbrace{\sigma^2_\epsilon}_{\text{不可约误差}}} \]

分量 含义 灵活性↑时的变化
偏差² 模型假设与真实 \(f\) 的差距 ↓ 下降
方差 模型对不同训练集的敏感度 ↑ 上升
不可约误差 数据固有噪声 — 不变

偏差与方差的直觉理解

偏差 (Bias):模型的’系统性偏见’

  • 高偏差 = 模型太简单,抓不住数据的真实规律
  • 类比:一个只会用直线画画的画家,无论如何都画不出圆形
  • 金融例子:用简单线性模型预测期权价格(忽略了波动率微笑)

方差 (Variance):模型的’不稳定性’

  • 高方差 = 模型太敏感,换一批训练数据就得到完全不同的结果
  • 类比:一个过于在意每个细节的画家,无法画出一致的作品
  • 金融例子:用100阶多项式拟合5个数据点

权衡的必然性

  • 降低偏差 → 增加模型复杂度 → 方差上升
  • 降低方差 → 简化模型 → 偏差上升
  • 统计学习的艺术就在于找到这个最佳平衡点

偏差-方差权衡的可视化

Code
# 生成灵活性轴:从1到10的100个等间距点
flexibility_range = np.linspace(1, 10, 100)  # 模型灵活性连续变化

# 构建偏差-方差理论曲线
bias_squared = 20 / flexibility_range  # 偏差平方随灵活性增加而衰减(反比例)
variance_component = 0.8 * (flexibility_range - 1)**1.8  # 方差随灵活性增加而按幂律膨胀
irreducible_error = 2.0  # 不可约误差为常数
total_test_mse = bias_squared + variance_component + irreducible_error  # 总测试MSE = 三部分之和

# 创建偏差-方差权衡图
fig, ax_bv = plt.subplots(figsize=(10, 6))  # 创建画布
ax_bv.plot(flexibility_range, bias_squared, color='#DC2626', linewidth=2, label='偏差² (Bias²)')  # 偏差曲线
ax_bv.plot(flexibility_range, variance_component, color='#2563EB', linewidth=2, label='方差 (Variance)')  # 方差曲线
ax_bv.axhline(y=irreducible_error, color='#94A3B8', linestyle='--', label='不可约误差 Var(ε)')  # 噪声底线
ax_bv.plot(flexibility_range, total_test_mse, color='#1E293B', linewidth=3, label='总测试 MSE')  # 总误差曲线
# 标注最优点
optimal_idx = np.argmin(total_test_mse)  # 找到U型曲线最低点索引
ax_bv.plot(flexibility_range[optimal_idx], total_test_mse[optimal_idx], 'o', color='gold', markersize=12, markeredgecolor='black')  # 金色圆点标记最优
ax_bv.annotate('最优拟合点', xy=(flexibility_range[optimal_idx], total_test_mse[optimal_idx]),
               xytext=(flexibility_range[optimal_idx]+1, total_test_mse[optimal_idx]+4),
               arrowprops=dict(facecolor='black', shrink=0.05), fontsize=11, fontweight='bold')  # 箭头标注
ax_bv.set_xlabel('模型灵活性 →', fontsize=12)  # X轴标签
ax_bv.set_ylabel('误差 →', fontsize=12)  # Y轴标签
ax_bv.set_ylim(0, 25)  # Y轴范围
ax_bv.legend(fontsize=11)  # 显示图例
ax_bv.grid(True, alpha=0.3)  # 添加网格
plt.tight_layout()  # 调整布局
plt.show()  # 显示图表
Figure 8: 偏差-方差权衡:总测试误差的U型曲线

直觉比喻:射击靶心

偏差-方差射击靶心比喻 用四个靶心图示直觉理解偏差和方差的组合效应 偏差-方差的靶心比喻 低偏差 + 低方差 理想状态 ✓ 低偏差 + 高方差 过拟合 高偏差 + 低方差 欠拟合 高偏差 + 高方差 最差状态 ✗
Figure 9: 用射击靶心直觉理解偏差与方差的四种组合

实践指南:如何控制偏差与方差

问题 诊断信号 解决方案
高偏差(欠拟合) 训练误差高,测试误差也高 增加特征、使用更灵活的模型
高方差(过拟合) 训练误差低,测试误差远高于训练误差 增加数据、正则化、降低模型复杂度

模型复杂度调整的具体手段

  • 增加灵活性:添加交互项、多项式项、更多层/节点
  • 降低灵活性:特征选择、正则化(Ridge/Lasso)、早停(Early Stopping)
  • 平衡策略:交叉验证选择最优超参数

经验法则

如果你的模型在训练集上表现极好但测试集上很差 → 过拟合,需要降低复杂度

如果你的模型在训练集和测试集上表现都差 → 欠拟合,需要增加复杂度

分类问题的评估:错误率

在分类问题中,MSE 不再适用。我们使用错误率

\[ \large{\text{错误率} = \frac{1}{n} \sum_{i=1}^{n} I(y_i \neq \hat{y}_i)} \]

  • \(I(\cdot)\):指示函数,预测错误时取 1,正确时取 0
  • 准确率 = 1 − 错误率

金融应用中的评估指标:

指标 公式 金融场景
准确率 \((TP+TN)/(TP+TN+FP+FN)\) 整体分类正确比例
精确率 \(TP/(TP+FP)\) 预测违约中真正违约的比例
召回率 \(TP/(TP+FN)\) 真正违约被模型捕获的比例

金融中的不平衡分类问题

在金融领域,类别不平衡是常态而非例外:

信用违约预测

  • 正常还款客户:~99%
  • 违约客户:~1%
  • 如果模型把所有客户预测为’不违约’,准确率高达99%!
  • 但这个模型完全无用——它一个违约客户都识别不出来

应对策略

  • 不要只看准确率(Accuracy),要看精确率-召回率权衡
  • 在金融风控中,召回率(漏掉的违约客户比例)通常比精确率更重要
  • 一个被漏掉的违约客户可能造成数百万损失

评估工具

  • 混淆矩阵(Confusion Matrix):全面展示分类结果
  • ROC曲线 / AUC:不依赖于阈值的综合评估
  • F1分数:精确率与召回率的调和平均

偏差-方差分解的严格数学推导

设真实生成过程 \(y_0 = f(x_0) + \epsilon\)\(E[\epsilon]=0\)\(\text{Var}(\epsilon)=\sigma^2\)

第一步:展开总误差

\[ E[(y_0 - \hat{f}(x_0))^2] = E[(f(x_0) - \hat{f}(x_0))^2] + \sigma^2 \]

(利用 \(\epsilon\) 独立且均值为零消除交叉项)

第二步:令 \(\bar{f}(x_0) = E[\hat{f}(x_0)]\),加减 \(\bar{f}\)

\[E[(f - \hat{f})^2] = (f - \bar{f})^2 + E[(\bar{f} - \hat{f})^2]\]

\[ = [\text{Bias}]^2 + \text{Var}(\hat{f}) \]

最终结果

\[ E[(y_0 - \hat{f}(x_0))^2] = [\text{Bias}]^2 + \text{Var}(\hat{f}) + \sigma^2 \]

推导的核心技巧与洞察

这个推导中有两个值得记住的数学技巧

技巧一:加减同一项

  • \((f - \hat{f})^2\) 中插入 \(\bar{f} = E[\hat{f}]\)
  • 利用 \((a-b)^2 = (a-c+c-b)^2 = (a-c)^2 + 2(a-c)(c-b) + (c-b)^2\)
  • 然后证明交叉项为零(因为 \(E[\hat{f} - \bar{f}] = 0\)

技巧二:噪声独立性

  • \(\epsilon\)\(\hat{f}\) 独立 → 交叉项 \(E[\epsilon \cdot (f - \hat{f})]\) 为零
  • 这使得噪声方差可以干净地分离出来

深层洞察

  • 偏差-方差分解是对期望测试MSE的分解(对不同训练集取平均)
  • 对于单一训练集,我们无法直接观察偏差和方差
  • 交叉验证是实践中估计这种’平均表现’的最佳工具

本章核心总结

核心概念 要点
统计学习框架 \(Y = f(X) + \epsilon\),目标是估计 \(f\)
预测 vs 推断 预测关注 \(\hat{Y}\) 准确度;推断关注 \(X \to Y\) 因果链
参数化 vs 非参数化 有假设 vs 无假设;简单 vs 灵活
灵活性-可解释性权衡 更灵活 → 通常更难解释
训练误差 vs 测试误差 真正关心的是泛化能力
偏差-方差分解 MSE = Bias² + Variance + 不可约误差
最优模型 在偏差和方差之间找到最佳平衡点

下一章预告:我们将学习最经典的参数化方法——线性回归,深入理解 OLS 估计及其性质。

思考与练习(一)

概念辨析

  1. 请用自己的话解释’可约误差’和’不可约误差’的区别。给出一个金融领域的例子,说明什么是不可约误差。

  2. 在以下场景中,你会选择预测还是推断?为什么?

      1. 某基金公司想预测下个月哪些股票会涨
      1. 某学者研究碳税政策对企业利润的影响
      1. 某银行想知道哪些客户特征与贷款违约最相关
  3. 如果一个模型在训练集上的MSE为0.01,在测试集上的MSE为5.0,这说明什么问题?你会如何改进?

思考与练习(二)

数学推导练习

  1. 证明:如果 \(\epsilon\) 的均值为零且与 \(X\) 独立,那么:

\[ E[(Y - \hat{f}(X))^2] = E[(f(X) - \hat{f}(X))^2] + \text{Var}(\epsilon) \]

提示:将 \(Y = f(X) + \epsilon\) 代入,然后展开平方项。

编程实践

  1. 使用本章的过拟合实验代码,将多项式阶数范围扩展到1-20阶。观察当阶数很高时,训练MSE和测试MSE分别发生了什么?你能找到最优阶数吗?

  2. 修改散点图代码,将 LOWESS 的平滑参数 frac 从 0.3 改为 0.05 和 0.8,观察拟合曲线的变化。frac 参数如何影响偏差和方差?

本章知识图谱

第二章知识图谱 展示统计学习核心概念之间的逻辑关系 Y = f(X) + ε 预测 (Prediction) 推断 (Inference) 参数化 非参数化 偏差-方差权衡 训练MSE vs 测试MSE 最优模型选择
Figure 10: 第二章核心概念关系图谱