corss_val_score 中的意外 R^2 损失值

Unexpected R^2 loss value in corss_val_score

我正在处理回归数据集,我希望将特定模型拟合到我的模型中 评估各种模型性能后的数据集。我用了 cross_val_score 来自 sklearn.model_selection 为此目的。在我选择评分参数 'r2' 后,我的一些模型得到了非常负的值。

demo = pd.read_csv('demo.csv')
X_train = demo.iloc[0:1460, : ]
Y_train = pd.read_csv('train.csv').loc[:, 'SalePrice':'SalePrice']
X_test = demo.iloc[1460: , : ]

regressors = []
regressors.append(LinearRegression())
regressors.append(Ridge())
regressors.append(Lasso())
regressors.append(ElasticNet())
regressors.append(Lars())
regressors.append(LassoLars())
regressors.append(OrthogonalMatchingPursuit())
regressors.append(BayesianRidge())
regressors.append(HuberRegressor())
regressors.append(RANSACRegressor())
regressors.append(SGDRegressor())
regressors.append(GaussianProcessRegressor())
regressors.append(DecisionTreeRegressor())
regressors.append(RandomForestRegressor())
regressors.append(ExtraTreesRegressor())
regressors.append(AdaBoostRegressor())
regressors.append(GradientBoostingRegressor())
regressors.append(KernelRidge())
regressors.append(SVR())
regressors.append(NuSVR())
regressors.append(LinearSVR())

cv_results = []
for regressor in regressors:
cv_results.append(cross_val_score(regressor, X = X_train, y = Y_train, scoring = 'r2', verbose = True, cv = 10))

上述代码经过编译运行后,cv_results如下。它是一个 float64 数组列表。每个数组包含 10 'r2' 个值(由于 cv = 10)。

我打开第一个数组,注意到对于这个特定模型,某些 'r2' 值非常负。

既然'r2'值应该在0到1之间,为什么会有很大的负值?

事情是这样的:R^2 值实际上不需要位于 [0, 1]。

本质上,R^2 的基线为 0,因为 0 意味着您的模型并没有做得更好并且 不比纯粹取响应变量的平均值差。在你 截距项的 OLS 中,这意味着 R^2 在 [0, 1].

然而,对于其他模型来说,一般情况下并非如此;例如,如果你 fix 你在线性回归模型中的截距,你最终可能会做的比仅仅采取更糟糕 你回答的平均值。