解读sklearns' GridSearchCV得分最高

时间:2018-05-08 11:33:06

标签: python scikit-learn cross-validation grid-search

我想知道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))

2 个答案:

答案 0 :(得分:1)

由@Davide在评论中链接的

The question有答案为什么你得到一个肯定的R2分数 - 你的模型比一个恒定的预测表现更好。同时,如果您的模型表现不佳,您可以在其他情况下获得负值。

值差异的原因是regressor.best_score_在您执行的5倍拆分中的特定折叠上进行评估,而r2_score(y_pred = best.predict(X), y_true = y)评估相同的模型(regressor.best_estimator_ )但是在完整样本上(包括用于训练该估算器的(5-1) - 折叠子集)

答案 1 :(得分:1)

regressor.best_score_是最佳参数组合的左侧测试折叠的r2分数的平均值。

在您的示例中,cv = 5,因此数据将被拆分为train和test folds 5次。该模型将安装在火车上并在测试中得分。这5个测试分数被平均得分。

对所有参数组合重复上述过程。并将其中最佳平均分配给best_score_

您可以查看at my other answer以完成GridSearchCV的完整工作

在找到最佳参数后,对模型进行全数据训练。

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

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