GridSearchCV best_score_ 属性的含义是啥? (该值与交叉验证数组的平均值不同)

Posted

技术标签:

【中文标题】GridSearchCV best_score_ 属性的含义是啥? (该值与交叉验证数组的平均值不同)【英文标题】:What is the meaning of the GridSearchCV best_score_ attribute? (the value is different from the mean of the cross validation array)GridSearchCV best_score_ 属性的含义是什么? (该值与交叉验证数组的平均值不同) 【发布时间】:2015-12-14 11:18:42 【问题描述】:

我对结果感到困惑,可能我没有正确理解交叉验证和 GridSearch 的概念。我遵循了这篇文章背后的逻辑: https://randomforests.wordpress.com/2014/02/02/basics-of-k-fold-cross-validation-and-gridsearchcv-in-scikit-learn/

argd = CommandLineParser(argv)
folder,fname=argd['dir'],argd['fname']

df = pd.read_csv('../../'+folder+'/Results/'+fname, sep=";")

explanatory_variable_columns = set(df.columns.values)
response_variable_column = df['A']
explanatory_variable_columns.remove('A')
y = np.array([1 if e else 0 for e in response_variable_column])

X =df[list(explanatory_variable_columns)].as_matrix()

kf_total = KFold(len(X), n_folds=5, indices=True, shuffle=True, random_state=4)

dt=DecisionTreeClassifier(criterion='entropy')

min_samples_split_range=[x for x in range(1,20)]
dtgs=GridSearchCV(estimator=dt, param_grid=dict(min_samples_split=min_samples_split_range), n_jobs=1)

scores=[dtgs.fit(X[train],y[train]).score(X[test],y[test]) for train, test in kf_total]
# SAME AS DOING: cross_validation.cross_val_score(dtgs, X, y, cv=kf_total, n_jobs = 1)

print scores
print np.mean(scores)
print dtgs.best_score_

获得的结果:

# score [0.81818181818181823, 0.78181818181818186, 0.7592592592592593, 0.7592592592592593, 0.72222222222222221]
# mean score 0.768
# .best_score_ 0.683486238532

附加说明:

我使用解释变量的另一种组合(仅使用其中一些)运行它,我得到了逆问题。现在 .best_score_ 高于交叉验证数组中的所有值。

# score [0.74545454545454548, 0.70909090909090911, 0.79629629629629628, 0.7407407407407407, 0.64814814814814814]
# mean score 0.728
# .best_score_ 0.802752293578

【问题讨论】:

【参考方案1】:

代码混淆了几件事。 dtgs.fit(X[train_],y[train_]) 对来自 param_grid 的每个参数组合进行内部 3 折交叉验证,生成一个包含 20 个结果的网格,您可以通过调用 dtgs.grid_scores_ 打开它。

[dtgs.fit(X[train_],y[train_]).score(X[test],y[test]) for train_, test in kf_total] 因此这条线适合网格搜索五次,然后使用 5-Fold 交叉验证对其得分。结果是 5 倍验证的分数数组。

当您调用 dtgs.best_score_ 时,您将在 last 拟合(共 5 个)的超参数 3 倍验证结果的网格中获得最高分。

【讨论】:

谢谢。发布问题后,我意识到 Grid SearchCV 默认会进行 3 折交叉验证。所以我的问题是,我看到几个博客他们使用 GridSearchCV 然后交叉验证。因此,如果 cv 是在 GridSearchCV 中隐式完成的,为什么还要使用 cross_val_score?? 有很多关于“为什么会有 cross_val 得分?”的讨论。在交叉验证中。这是比较详细的link之一

以上是关于GridSearchCV best_score_ 属性的含义是啥? (该值与交叉验证数组的平均值不同)的主要内容,如果未能解决你的问题,请参考以下文章

GridSearchCV.best_score_ 评分设置为“准确度”和 CV 时的含义

GridSearchCV best_score_ 属性的含义是啥? (该值与交叉验证数组的平均值不同)

best_score_的gridsearch cv的AUC分数与gridsearch cv的最佳模型的auc_roc_score不同

如何使用GridSearchCV获取所有模型(每组参数一个)?

AttributeError:“GridSearchCV”对象没有属性“best_estimator_”

AttributeError:“GridSearchCV”对象没有属性“best_params_”