我正在处理一个回归数据集,希望在评估了各种模型的性能后,将特定模型拟合到我的数据集上。为此,我使用了sklearn.model_selection中的cross_val_score。当我将评分参数设为’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]之间。
然而,对于其他模型,情况并非总是如此;例如,如果你在线性回归模型中固定截距,你可能会比仅仅取响应变量的平均值表现得更差。