首页 文章

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

提问于
浏览
1

基本上,我想使用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

    可能是由于随机性, cross_validateGridSearchCV 中使用的交叉验证分裂是不同的 . 随着您的数据集非常小(93)并且折叠数量如此之大(10),这种随机性的影响变得更大 . 一种可能的解决方法是将 cv 输入固定列车/测试分割,并减少折叠次数以减少方差,即

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

相关问题