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

随机森林回归R²为负、线性回归为正,模型拟合问题咨询

问题背景

我用随机森林回归处理数据集,得到的R-squared值为**-0.22**,远低于预期。代码如下:

rsquaredscores = [] 
x = correcteddf[['sleepiness_resolution_index']]
y = correcteddf[['distance']]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3,train_size=0.7,random_state=0)
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 100,random_state = 0)
regressor.fit(x_train,y_train)
y_pred = regressor.predict(x_test)
from sklearn.metrics import r2_score
rsquaredscore = r2_score(y_test,y_pred)
rsquaredscores.append(rsquaredscore)
print(rsquaredscores)

用相同数据做线性回归时:

resultmodeldistancevariation2sleep = sm.OLS(y,x).fit()
resultmodeldistancevariation2sleepsummary = resultmodeldistancevariation2sleep.summary()
print(resultmodeldistancevariation2sleepsummary)

得到的R-squared值为0.027,远高于随机森林的结果。

请问:

  • 这种一正一负的情况是否正常?
  • 负R-squared值是否代表模型拟合效果极差?
  • 还是我的代码存在问题?

数据集前10行:

correcteddf['sleepiness_resolution_index'].head(10)

    sleepiness_resolution_index
0   0.555556
1   1.500000
3   1.000000
6   0.900000
7   0.857143
8   0.875000
9   0.300000
10  0.750000
12  1.400000
13  2.333333

correcteddf[['distance']].head(10)

    distance
0   -0.251893
1   0.072180
3   -0.555438
6   0.199593
7   -0.378295
8   -0.162809
9   -0.108010
10  0.162275
12  -0.007996
13  4.637838

解答

1. 一正一负的R²是正常的

不同模型对数据的适配性差异很大:线性回归是简单模型,拟合的是全局线性趋势;随机森林是非线性模型,优势在于捕捉复杂多维非线性关系,但你的数据只有1个特征,随机森林的优势无法发挥,反而可能因为树的随机采样、分裂规则,对测试集的预测效果比线性模型还差。

2. 负R²确实代表拟合效果极差

R²的计算公式为:$R^2 = 1 - \frac{SS_{res}}{SS_{tot}}$,其中$SS_{res}$是预测值与真实值的残差平方和,$SS_{tot}$是真实值与均值的平方和。当$SS_{res} > SS_{tot}$时,R²会变为负数——这意味着你的模型预测效果不如直接用测试集的y均值来预测,属于完全无效的拟合。

3. 代码问题排查

你的代码整体逻辑没问题,但有几个细节可以优化:

  • 确认train_test_split划分比例:打印x_train.shape、x_test.shape,验证是否符合7:3的设定
  • 调整随机森林参数:单特征下,默认的树深度(max_depth)可能过大,导致过拟合训练集。可以尝试设置max_depth=3或更小的值,限制模型复杂度
  • 统一线性回归的设定:sm.OLS(y,x)没有加截距项,而sklearn的线性回归默认加截距。若要公平对比,要么给statsmodels的OLS添加截距(sm.add_constant(x)),要么让sklearn线性回归关闭截距项,避免模型设定不一致导致的R²差异

额外建议

从数据集前10行看,distance存在极端值(13号样本的4.637838),这个异常值可能严重干扰模型拟合。建议先做异常值检测和处理,再重新训练模型。另外,单特征的预测能力本身有限,可考虑加入更多相关特征提升模型效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:45:44