残差图紧为零,但 R2 得分低

数据挖掘 机器学习 Python scikit-学习 回归
2022-02-14 08:14:50

嗨,我是数据科学的初学者,目前正在尝试使用 Gradient Boost Regressor 根据机器容量、汽车品牌、汽车类型等多个属性来预测汽车价格。

我正在关注本教程:https ://github.com/PaacMaan/cars-price-predictor/blob/master/cars_price_predictor.ipynb

我得到了一个低 R2 分数并绘制了残差与预测值,我感到困惑的是,即使我的残差值接近于零(如图所示),我的 r2_score 也很低。任何人都可以向我解释一下吗? 残差与预测

这是我的 r2 分数

r2_score:0.38

和我正在使用的代码

car_df_encoded = pd.get_dummies(car_df_encoded, columns=['Store_Loc','Brand','Type','Transmission'], prefix = ['Store_Loc','Brand','Type','Transmission'])
price= car_df_encoded.pop('Price')


x_train, x_test, y_train, y_test = train_test_split(car_df_encoded, harga, test_size=0.25)

gbr = GradientBoostingRegressor(loss='huber', max_depth=5, max_features=None,min_samples_leaf=8, min_samples_split=6, n_estimators=150,random_state=42)
gbr.fit (x_train, y_train)
predicted = gbr.predict(x_test)
residual = y_test - predicted

也尝试使用交叉验证

scores = cross_val_score(gbr, car_df_encoded, harga, cv=4, scoring='r2')
print('\nMean Score:')
print(scores.mean())

我的平均 r2 分数是

Cross Validation Scores:
[0.76621245 0.41771035 0.35744057 0.73955563]

Mean Score:
0.5702297501214788
3个回答

根据情节,您的残差中有一个巨大的异常值。再加上考虑到您的交叉验证有时会显示出相当好的结果(0.77、0.74),有时会不太好(0.42、0.36),我会首先尝试从您的数据中删除该异常值,然后看看您会得到什么。

您的残差似乎并不那么接近于零。查看直方图的 x 轴。你的四分位数范围是几十万,如果不是几百万的话,所以你有很多非常大的残差。是的,您正在处理大量数字,但图表上的紧密聚类只会在巨大的规模上看起来很紧密。我会说这就是为什么你看起来很紧,但是R2值不够强。Marat Seroglazov 的离群值想法很有趣,但看起来你应该有足够的数据来缓冲这种离群值效应。

我对你的残差的四分位数范围很好奇。

尝试绘制log残差,然后您可以更清楚地了解残差的大小。由于当前图中存在巨大的异常值,因此很难看出其他残差有多大。你的一些真的很大。