You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调整后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:24:04