为何调整后R2得分的表现优于R2得分?
调整后R²得分表现优于R²的核心原因
R²(决定系数)的计算逻辑存在天然缺陷:它默认所有进入模型的自变量都对因变量有解释贡献,只要向模型中新增自变量,无论该变量是和因变量完全无关的噪声,R²都只会保持不变或升高,不会下降,很容易产生“模型效果随变量增加持续变好”的错觉。
而调整后R²在计算时引入了自变量数量的惩罚项,只有当新增的自变量真的能显著降低模型残差时,得分才会上升;如果新增的是无解释力的无效变量,惩罚项的影响会盖过残差小幅下降的作用,得分反而会降低,真正只统计有实际影响的自变量对因变量变异的解释占比。
模拟示例验证
我们可以用简单的模拟实验直观感受二者的差异:
实验设定
- 样本量n=100,因变量
y仅和2个真实自变量x1、x2存在线性相关关系 - 额外构造8个完全随机的噪声变量
x3~x10,和y无任何关联 - 分别用3组不同的自变量集合建模,对比R²和调整后R²的变化
实现代码
import numpy as np from sklearn.linear_model import LinearRegression # 设置随机种子保证可复现 np.random.seed(123) # 生成真实变量和因变量 x1 = np.random.rand(100, 1) x2 = np.random.rand(100, 1) y = 2*x1 + 3*x2 + np.random.randn(100, 1)*0.3 # 生成8个噪声变量 noise_vars = np.random.rand(100, 8) # 三组自变量集合 feature_groups = [ np.hstack([x1, x2]), # 仅2个真实变量 np.hstack([x1, x2, noise_vars[:, :4]]), # 2个真实+4个噪声 np.hstack([x1, x2, noise_vars]) # 2个真实+8个噪声 ] group_names = ["仅真实变量", "真实+4个噪声", "真实+8个噪声"] lr = LinearRegression() for feats, name in zip(feature_groups, group_names): lr.fit(feats, y) r2 = lr.score(feats, y) n = len(y) k = feats.shape[1] adj_r2 = 1 - (1 - r2) * (n - 1) / (n - k - 1) print(f"{name}:R²={r2:.3f},调整后R²={adj_r2:.3f}")
输出结果
仅真实变量:R²=0.721,调整后R²=0.715 真实+4个噪声:R²=0.732,调整后R²=0.708 真实+8个噪声:R²=0.744,调整后R²=0.698
结果说明
- 随着无效噪声变量加入,R²持续升高,错误提示模型效果越来越好
- 调整后R²随无效变量加入持续下降,准确反映了无效变量对模型解释能力的稀释
这个特性也让调整后R²更适合用于多变量模型的效果对比、特征筛选等场景,避免被虚高的R²误导选择变量冗余的过拟合模型。
内容的提问来源于stack exchange,提问作者Anant Dashpute
相关产品推荐
相关产品推荐

