核心问题:什么是统计学习?
统计学习是一套用于理解数据的工具集。
- 监督学习:基于输入变量,构建统计模型来预测或估计输出变量
- 无监督学习:没有明确的输出变量,从数据中发现结构和模式
核心思想:假设输出变量 \(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级市场数据
- 风险控制:银行用分类模型评估贷款违约概率
- 供应链优化:制造业用回归模型预测需求,降低库存成本
- 精准营销:电商平台用推荐系统为每个用户定制展示内容
长三角地区案例:
- 海康威视(杭州):利用深度学习驱动智能安防产品
- 科大讯飞(合肥):自然语言处理是统计学习的前沿应用
- 宁波银行(宁波):用统计模型构建小微企业信用评分体系
本课程的目标:让你能够理解、评估并应用这些方法来解决真实商业问题。
实例:上市公司营收与利润的关系
以长三角地区上市公司为例,探索营业收入与净利润之间的系统性关系。
数据可视化:营收-利润散点图
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() # 显示散点图
为什么要估计 \(f\)?—— 两大目的
估计 \(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%。
推断在学术研究与政策中的核心地位
在经济学和金融学的学术研究中,推断远比预测重要:
学术研究的核心问题都是推断性质的:
- ‘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 可解释性
方法选择取决于业务目标
方法选择的黄金法则:没有最好的方法,只有最适合业务问题的方法。
场景一:学术论文(推断导向)
- 目标:证明ESG评分影响公司价值
- 方法:线性回归/面板回归 → 可解释,能做因果推断
- 灵活性需求:低
场景二:量化投资(预测导向)
- 目标:预测下周收益率最高的50只股票
- 方法:随机森林/GBDT → 高预测精度
- 灵活性需求:高
场景三:风控报告(推断+预测)
- 目标:识别高风险客户,且需要向监管解释决策依据
- 方法:Logistic回归/LASSO → 兼顾预测和可解释性
- 灵活性需求:中等
回归 vs 分类:取决于输出类型
| 输出变量 |
连续型(定量) |
离散型(定性/类别) |
| 典型场景 |
预测股价收益率 |
预测公司是否违约 |
| 评估指标 |
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章的核心内容。
过拟合实验结果: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() # 显示图表
偏差-方差权衡:过拟合的理论解释
测试 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() # 显示图表
实践指南:如何控制偏差与方差
| 高偏差(欠拟合) |
训练误差高,测试误差也高 |
增加特征、使用更灵活的模型 |
| 高方差(过拟合) |
训练误差低,测试误差远高于训练误差 |
增加数据、正则化、降低模型复杂度 |
模型复杂度调整的具体手段:
- 增加灵活性:添加交互项、多项式项、更多层/节点
- 降低灵活性:特征选择、正则化(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 估计及其性质。
本章知识图谱