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

