解读sklearn的GridSearchCV最佳分数

9

我想了解GridSearchCV返回的分数和以下计算的R2评估指标之间的区别。在其他情况下,我收到的网格搜索得分非常低(cross_val_score也是如此),希望您能解释一下这是什么意思。

from sklearn import datasets
from sklearn.model_selection import (cross_val_score, GridSearchCV)
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import accuracy_score, r2_score
from sklearn import tree

diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
X = pd.DataFrame(X)

parameters = {'splitter':('best','random'), 
              'max_depth':np.arange(1,10), 
              'min_samples_split':np.arange(2,10), 
              'min_samples_leaf':np.arange(1,5)}

regressor = GridSearchCV(DecisionTreeRegressor(), parameters, scoring = 'r2', cv = 5)
regressor.fit(X, y)

print('Best score: ', regressor.best_score_)
best = regressor.best_estimator_
print('R2: ', r2_score(y_pred = best.predict(X), y_true = y))

这可能是相关的:https://stats.stackexchange.com/questions/12900/when-is-r-squared-negative - Davide Fiocco
2个回答

9

regressor.best_score_是最佳参数组合下,留出测试集进行评估的r2分数的平均值。

在您的示例中,cv=5,因此数据将被分成5个训练和测试集。 模型将在训练集上拟合并在测试集上评分。 这5个测试分数取平均值得到该分数。 请参见文档

"best_score_:best_estimator的交叉验证平均得分"

以上过程针对所有参数组合重复执行。最佳平均分数将分配给best_score_

您可以查看我的其他答案以完整了解GridSearchCV的工作方式。

找到最佳参数后,模型将在完整数据上进行训练。

r2_score(y_pred = best.predict(X), y_true = y)

是基于与模型训练相同的数据,因此大多数情况下它会更高。


我非常确定这是不正确的。比较:regressor.best_score_ 和 regressor.cv_results_。我刚刚做了这个,很明显best_score_被设置为最大的mean_test_score值;而不是它们的平均值,这是不幸的。我正在使用sklearn 0.20.3。 - NLR
@NLR,“mean_test_score”听起来像什么?强调“mean”。我从未说过它是所有“mean_test_score”值的平均值。我说的是它是所有测试折叠中值的平均值。 - Vivek Kumar
regressor.best_score_ 输出来自交叉验证中的单个最佳值。它返回一个折叠的分数。我通过查看使用 regressor.cv_results_ 的交叉验证输出发现了这一点。如果您取测试分数的平均值(mean_test_score),则与 best_score_ 不同。自己尝试一下,您就会明白我的意思。(在我的第一条评论中有一个小错误:应该写成“...设置为最大 test_score”,而不是“mean_test_score”。我手动计算了平均值。) - NLR

3
在评论中由@Davide提供的此问题已经解答了为什么你会得到一个正的R2分数 - 你的模型表现比常数预测要好。同时,如果你的模型表现不佳,你也可能得到负值。

值得注意的是,regressor.best_score_的差异在于它是在你进行的5次折叠交叉验证中的特定折叠上评估的,而r2_score(y_pred = best.predict(X), y_true = y)评估的是相同的模型(regressor.best_estimator_),但是在完整样本上评估(包括用于训练该估计器的(5-1)折子集)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接