【问题标题】:Why did Run best_estimator_ from GridSearch using cross-validation produce different accuracy score?为什么使用交叉验证从 GridSearch 运行 best_estimator_ 会产生不同的准确度分数?
【发布时间】:2018-09-12 20:01:17
【问题描述】:

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

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

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

我想知道,在 sk-learn 中,我应该指定正面的标签吗?在我的数据集中,我已经将正例标记为 1。

最后,以下文本是我的代码的 sn-p。

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)])

【问题讨论】:

  • 我之前没用过return_train_score=True。你确定你找到的是你的测试分数的平均值,而不是你的火车分数/两个分数吗?你的结果有何不同?
  • 感谢您的评论。 return_train_score=True 基本上是返回训练集中的评估分数(在交叉验证中)。 cross_validate 函数的输出是一个字典。默认情况下,测试分数和训练分数使用该字典中的不同键存储。因此,更改该参数不会改变情况。 (为了确认这一点,我也尝试将该参数设置为 false,但结果仍然不同)。来自 GridSearch 的 f1 为 0.5244938753,而来自交叉验证的 f1 为 0.448441558442。
  • @kidright,你的代码中的n (cv=n) 是什么?
  • @MaxU,我使用 n 等于 10(整数),所以根据我对文档的理解,这两种方法都将执行分层 10 折交叉验证。顺便说一句,阳性病例数为 41,阴性病例数为 52。
  • 您的数据集有多大?没想到差距这么大……

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


【解决方案1】:

这可能是由于cross_validateGridSearchCV 使用的交叉验证拆分不同,由于随机性。这种随机性的影响变得更大,因为您的数据集非常小 (93) 并且折叠数非常大 (10)。一个可能的解决方法是向cv 输入一个修复训练/测试拆分,并减少折叠数以减少方差,即

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

【讨论】:

  • 是的。看起来 GridSearchCV 和 cross_validate 中的拆分是不同的。就我而言,我还设置了 random_state 变量。因此,折叠变为: kfolds=StratifiedKFold(n_splits=n, random_state=y, shuffle=True) 谢谢。
猜你喜欢
  • 2015-04-21
  • 2020-03-28
  • 2021-03-22
  • 2021-11-05
  • 1970-01-01
  • 2021-02-19
  • 2022-01-19
  • 2013-09-14
  • 2020-04-13
相关资源
最近更新 更多