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

时间:2018-04-03 13:11:12

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

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

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

但是,当我打印出性能分数(精确度,回忆率,f度量和准确度)时,它会产生不同的分数。为什么你认为这发生了?

我想知道,在sk-learn中我应该指定正面的标签吗?在我的数据集中,我已将正面案例标记为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)])

1 个答案:

答案 0 :(得分:0)

这可能是由于随机性导致cross_validateGridSearchCV中使用的交叉验证拆分不同。当您的数据集非常小(93)并且折叠数量如此之大(10)时,这种随机性的影响变得更大。一个可能的解决方法是输入cv修正列车/测试分组,并减少折叠次数以减少差异,即

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