【问题标题】: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 在吗?

【问题讨论】:

    标签: python scikit-learn confusion-matrix


    【解决方案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
    猜你喜欢
    • 2014-04-19
    • 2018-12-06
    • 2012-04-01
    • 2018-07-21
    • 1970-01-01
    • 2019-04-13
    • 2017-03-03
    • 2019-05-29
    • 2018-09-10
    相关资源
    最近更新 更多