为什么使用交叉验证从GridSearch中运行BEST_ESTIMATOR_会产生不同的精度得分



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

然后,我使用GridSearchCV查找最佳估计器,并将交叉验证参数设置为10。由于我想分析预测结果,因此我使用最佳估计器使用相同的数据集执行交叉验证(当然I当然I使用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)])

可能是由于cross_validateGridSearchCV中使用的交叉验证拆分是由于随机性而不同的。随着您的数据集非常小(93(,并且折叠的数量太大(10(,这种随机性的效果变得更大。一个可能的修复是进食cv固定火车/测试拆分,并减少折叠数量以减少方差,即

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

最新更新