解读 sklearns 的 GridSearchCV 最佳成绩
Posted
技术标签:
【中文标题】解读 sklearns 的 GridSearchCV 最佳成绩【英文标题】:Interpreting sklearns' GridSearchCV best score 【发布时间】:2018-10-18 08:17:43 【问题描述】:我想知道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))
【问题讨论】:
这可能是相关的:stats.stackexchange.com/questions/12900/… 【参考方案1】:@Davide 在 cmets 中链接的The question 回答了为什么你会得到一个正的R2
分数 - 你的模型比恒定预测表现更好。同时,在其他情况下,如果您的模型表现不佳,您可能会得到负值。
值不同的原因是 regressor.best_score_
是在您所做的 5 倍拆分中的特定折叠上评估的,而 r2_score(y_pred = best.predict(X), y_true = y)
评估相同的模型 (regressor.best_estimator_
) 但在完整样本上(包括用于训练该估计器的 (5-1)-fold 子集)
【讨论】:
【参考方案2】:regressor.best_score_
是最佳参数组合的剩余测试折叠的 r2 分数的平均值。
在您的示例中,cv=5,因此数据将分为训练和测试折叠 5 次。该模型将在火车上安装并在测试中评分。将这 5 个测试分数平均得到分数。请看documentation:
“best_score_:最佳估计器的平均交叉验证分数”
对所有参数组合重复上述过程。并且它的最佳平均分数分配给best_score_
。
您可以查看 at my other answer 以了解 GridSearchCV 的完整工作
找到最佳参数后,模型会在完整数据上进行训练。
r2_score(y_pred = best.predict(X), y_true = y)
与训练模型的数据相同,因此在大多数情况下,它会更高。
【讨论】:
我很确定这是不正确的。比较:regressor.best_score_ 与 regressor.cv_results_。我刚刚这样做了,很明显 best_score_ 设置为等于 LARGEST mean_test_score 值;不是他们的平均值,这是不幸的。我正在使用 sklearn 0.20.3 @NLRmean_test_score
听起来像什么?强调mean
。我从来没有说过它是所有mean_test_score
值的平均值。我说的是所有测试折叠的平均值。
regressor.best_score_ 从折叠中输出 SINGLE 最佳值。它返回一倍的分数。我通过使用 regressor.cv_results_ 查看交叉验证的输出发现了这一点。如果你取测试分数的平均值(mean_test_score),它与 best_score_ 不同。自己试试,你就会明白我的意思。 (我的第一条评论中有一个小错字:它应该是“...设置等于最大的 test_score”;而不是“mean_test_score”。我手动计算了平均值。)以上是关于解读 sklearns 的 GridSearchCV 最佳成绩的主要内容,如果未能解决你的问题,请参考以下文章
sklearn中LinearRegression关键源码解读
sklearn中LinearRegression使用及源码解读
Python使用sklearn和statsmodels构建多元线性回归模型(Multiple Linear Regression)并解读
机器学习sklearn简单易懂核密度估计KernelDensity
详解主成分分析PCA与奇异值分解SVD-降维后的矩阵components_ & inverse_transform菜菜的sklearn课堂笔记