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

Accuracy and Confusion Matrix in Cross Validation

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

作为指标,我想获得 5 倍的平均准确度和混淆矩阵。

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

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

Docs 声明可召集得分手应满足

It can be called with parameters (estimator, X, y), where estimator is the model that should be evaluated, X is validation data, and y is the ground truth target for X (in the supervised case) or None (in the unsupervised case).

调用时cross_validate, the cv folds are first generated and passed to independent fitting processes. Inside these processes, the test dataset is passed to a private _score method. From the source code

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

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

scores = scorer(estimator, X_test, y_test)

如果您想同时获得平均准确度和混淆矩阵,您可以通过 dictionary

return 这些分数

示例代码

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