我正在处理回归数据集,我希望为我的模型拟合一个特定的模型 评估各种模型的性能后的数据集。我用了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之间,为什么会有很大的负值?
答案 0 :(得分:0)
这是事实:R^2
值实际上不需要在[0,1]中。
本质上,R^2
的基线为0,因为0意味着您的模型没有更好的表现,
并不比单纯采用响应变量的平均值差。在您拥有截距项的OLS中,这意味着R^2
位于[0,1]中。
但是,对于其他模型,这通常是不正确的;例如,如果您在线性回归模型中进行 fix 拦截,则最终结果可能会比仅仅采取 您的回答的平均值。