为什么使用交叉验证的 GridSearch 运行 best_estimator_ 会产生不同的准确度分数?

Why did Run best_estimator_ from GridSearch using cross-validation produce different accuracy score?

基本上,我想使用 sk-learn 中的 SVM (SVC) 执行二进制分类。由于我没有单独的训练和测试数据,我使用交叉验证来评估我使用的特征集的有效性。

然后,我使用 GridSearchCV 找到最佳估计器并将交叉验证参数设置为 10。因为我想分析预测结果,所以我使用最佳估计器使用相同的数据集(的当然我使用 10 折交叉验证)。

但是,当我打印性能分数(精度、召回率、f-measure 和准确性)时,它会产生不同的分数。你认为为什么会这样?

我想知道,在sk-learn中我是否应该指定positive one的标签?在我的数据集中,我已经将正例标记为 1.

最后,以下文字是我的代码片段。

tuned_parameters = [{'kernel': ['linear','rbf'], 'gamma': [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10],  'C': [0.1, 1, 5, 10, 50, 100, 1000]}]
scoring = ['f1_macro', 'precision_macro', 'recall_macro', 'accuracy']
clf = GridSearchCV(svm.SVC(), tuned_parameters, cv=10, scoring= scoring, refit='f1_macro')
clf.fit(feature, label)
param_C = clf.cv_results_['param_C']
param_gamma = clf.cv_results_['param_gamma']
P = clf.cv_results_['mean_test_precision_macro']
R = clf.cv_results_['mean_test_recall_macro']
F1 = clf.cv_results_['mean_test_f1_macro']
A = clf.cv_results_['mean_test_accuracy']
#print clf.best_estimator_
print clf.best_score_
scoring2 = ['f1', 'precision', 'recall', 'accuracy']
scores = cross_validate(clf.best_estimator_, feature, label, cv=n, scoring=scoring2, return_train_score=True)
print scores
scores_f1 = np.mean(scores['test_f1'])
scores_p = np.mean(scores['test_precision'])
scores_r = np.mean(scores['test_recall'])
scores_a = np.mean(scores['test_accuracy'])
print '\t'.join([str(scores_f1), str(scores_p), str(scores_r),str(scores_a)])

这可能是由于 cross_validateGridSearchCV 中使用的 cross-validation 拆分不同,由于随机性。当您的数据集非常小 (93) 而折叠数非常大 (10) 时,这种随机性的影响会变得更大。一个可能的修复方法是将 cv 馈入修复 train/test 拆分,并减少折叠次数以减少方差,即

kfolds=StratifiedKFold(n_splits=3).split(feature, label)
...
clf = GridSearchCV(..., cv=kfolds, ...)
...
scores = cross_validate(..., cv=kfolds, ...)