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

当决定系数(R²)异常时如何改进回归模型

关于回归模型R²出现负值及异常计算公式的问题

多数文献里决定系数(R²)的取值在0到1之间,但我的回归模型算出了负值。查了StackOverflow和Sklearn文档后知道,模型表现极差时R²确实会为负,比如下面的代码算出的R²是-2.65:

import numpy as np

def calculate_r2(y_true, y_pred):
    y_mean = np.mean(y_true)
    sse = np.sum((y_true - y_pred)**2)
    sst = np.sum((y_true - y_mean)**2)
    r2 = 1 - (sse / sst)
    return r2

y_true = np.array([47, 40, 42, 43, 43, 34, 50, 47, 41, 34, 44, 48, 41, 35])
y_pred = np.array([42, 33, 51, 60, 45, 44, 51, 47, 34, 24, 53, 28, 35, 40])

r2 = calculate_r2(y_true, y_pred)

print("R²:", r2)

我还找到另一种R²计算公式,能消除负值,但有时候结果会超过1,比如这个例子里得到4.02:

import numpy as np

def calculate_r2(y_true, y_pred):
    y_mean = np.mean(y_true)
    sse = np.sum((y_pred - y_mean)**2)
    sst = np.sum((y_true - y_mean)**2)
    r2 = sse / sst
    return r2

y_true = np.array([47, 40, 42, 43, 43, 34, 50, 47, 41, 34, 44, 48, 41, 35])
y_pred = np.array([42, 33, 51, 60, 45, 44, 51, 47, 34, 24, 53, 28, 35, 40])

r2 = calculate_r2(y_true, y_pred)

print("R²:", r2)

这是怎么回事?我知道第一种被广泛认可的公式得出负值,说明模型完全不合适、预测效果极差,请问有什么方法能改进这个结果?

补充说明

我的数据集有71条记录,试过多种回归算法。上面的示例是用LinearRegression在全量归一化数据集上得到的,数据集按80%训练、20%测试划分。部分案例里我还用了Pearson相关系数(0.98)和PCA(0.99)做预处理,但还是出现了R²负值的情况。


问题解答

一、两种R²公式的差异

  • 第一种是标准R²的定义:$R^2 = 1 - \frac{SSE}{SST}$,其中SSE是预测值与真实值的残差平方和,SST是真实值与均值的总平方和。当模型预测的残差平方和SSE大于总平方和SST时,$\frac{SSE}{SST} > 1$,R²就会变成负数——这意味着你的模型连“用均值做预测”都不如,完全失效。
  • 第二种公式是错误的,它把SSE替换成了预测值与均值的平方和,本质上计算的是预测值的变异占真实值变异的比例,和R²的定义完全无关。当预测值的波动远大于真实值时,结果就会超过1,这个数值没有统计学意义,不能用来衡量模型好坏。

二、改进R²负值的方法

针对你的数据集情况,可从以下几个方向入手:

  1. 检查数据质量与划分
    • 71条记录的数据集本身偏小,80%训练集只有约57条,可能导致模型拟合不足。可以尝试调整划分比例(比如70%训练、30%测试),或者用交叉验证(如5折/10折交叉验证)替代单次划分,避免因样本划分极端导致的结果偏差。
    • 确认归一化逻辑:训练集和测试集的归一化必须用训练集的均值和标准差做转换,不能用全量数据的统计量——否则会导致测试集数据泄露,严重影响模型泛化能力。
  2. 特征工程优化
    • 高相关特征(Pearson系数0.98)会导致多重共线性,线性回归对共线性非常敏感,会放大参数波动,导致预测失效。建议先移除高度相关的特征(比如相关系数>0.9的特征只保留一个),再做PCA或直接建模。
    • 剔除冗余/噪声特征:检查是否存在和目标变量无关、或大量缺失值的特征,这类特征会干扰模型学习,直接删掉能提升模型效果。
  3. 模型调整与选择
    • 如果数据是非线性的,线性模型自然表现差。可以尝试非线性模型,比如决策树回归、随机森林回归、梯度提升树(XGBoost/LightGBM),这类模型对非线性关系的拟合能力更强,小数据集也能有不错的表现。
    • 给线性回归加正则化:用Ridge(L2正则)或Lasso(L1正则)回归替代普通线性回归,正则化能约束参数,避免过拟合或共线性导致的参数异常,提升泛化能力。
  4. 目标变量分析
    • 检查测试集目标变量是否有极端异常值:如果存在远偏离整体分布的真实值,模型无法预测会导致残差平方和剧增,拉低R²。可以用箱线图检测异常值,考虑剔除或做截断处理。

内容的提问来源于stack exchange,提问作者Liam Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:19:53