交叉验证中的准确性和混淆矩阵

Posted

技术标签:

【中文标题】交叉验证中的准确性和混淆矩阵【英文标题】:Accuracy and Confusion Matrix in Cross Validation 【发布时间】:2022-01-19 12:18:47 【问题描述】:

我正在使用 scikitlearn 训练一个模型来解决二元分类问题,我希望进行 5 折交叉验证。

作为指标,我希望获得 5 折的平均准确率和混淆矩阵。

因此,使用cross_validate 我可以将多个指标传递给scoring 参数。

根据这个link,我可以def 一个在每个折叠处返回混淆矩阵的函数。在那段代码中,它使用X 通过.predict(X) 预测一些输出。但是不应该使用测试集x_test 来代替吗?而且由于在每一折中,从cross_validate 获得不同的测试集,我不明白我们如何将X 传递给confusion_matrix_scorer().predict()。另一个问题,clf = svm 在吗?

【问题讨论】:

【参考方案1】:

Docs 声明一个可调用的记分员应该满足

可以用参数(estimator, X, y)调用,其中estimator是应该评估的模型,X是验证数据,y是X的ground truth target(在有监督的情况下)或None(在无人监督的情况下)。

当调用cross_validate 时,cv 折叠为first generated 并传递给独立的拟合过程。在这些过程中,测试数据集被传递给私有_score 方法。来自source code

test_scores = _score(estimator, X_test, y_test, scorer, error_score)

使用定义的参数(estimator, X, y)source code调用输入scorrer

scores = scorer(estimator, X_test, y_test)

如果您想同时获得平均准确率和混淆矩阵,您可以通过dictionary返回这些分数

示例代码

from sklearn.metrics import accuracy_score, confusion_matrix

def confusion_matrix_scorer(clf, X, y):
      y_pred = clf.predict(X)
      cm = confusion_matrix(y, y_pred)
      acc = accuracy_score(y, y_pred)
      return 
          'acc': acc,
          'tn': cm[0, 0], 
          'fp': cm[0, 1],
          'fn': cm[1, 0], 
          'tp': cm[1, 1]
      

【讨论】:

你好,米格尔。我理解返回字典的那一部分,但我的问题是关于这里使用的变量XX 不是整个输入数据吗?你不应该.predict() 只是X 的一小部分(测试集,让我们调用X_test)吗?如果您从cross_validate 获取该变量,您如何将X_test 传递给confusion_matrix_scorer 输入 X 是您的测试数据,因为您根据测试数据评估模型性能。所以你将X_testy_test 传递给自定义记分器函数并返回一些指标值,cross_validate 只返回每个折叠的评估指标。 cross_validate 只是为训练和测试样本生成索引,在 _fit_and_score 内部进行了拆分。 Reference

以上是关于交叉验证中的准确性和混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

10折交叉验证的混淆矩阵

在 KFold 交叉验证的情况下如何显示平均分类报告和混淆矩阵

获取每个交叉验证折叠的混淆矩阵

sklearn中留一法交叉验证的混淆矩阵

交叉表和混淆矩阵在 Python 中导致不一致

如何提高 SVM 的性能?