【发布时间】: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