使用CROSS_VALIFY生成混淆矩阵

人气:63 发布:2023-01-03 标签: python scikit-learn machine-learning confusion-matrix cross-validation

问题描述

我正在尝试找出如何使用CROSS_VALIDATE生成混淆矩阵。我可以用我目前掌握的代码打印出分数。

# Instantiating model
model = DecisionTreeClassifier()

#Scores
scoring = {'accuracy' : make_scorer(accuracy_score), 
           'precision' : make_scorer(precision_score),
           'recall' : make_scorer(recall_score), 
           'f1_score' : make_scorer(f1_score)}

# 10-fold cross validation
scores = cross_validate(model, X, y, cv=10, scoring=scoring)

print("Accuracy (Testing):  %0.2f (+/- %0.2f)" % (scores['test_accuracy'].mean(), scores['test_accuracy'].std() * 2))
print("Precision (Testing):  %0.2f (+/- %0.2f)" % (scores['test_precision'].mean(), scores['test_precision'].std() * 2))
print("Recall (Testing):  %0.2f (+/- %0.2f)" % (scores['test_recall'].mean(), scores['test_recall'].std() * 2))
print("F1-Score (Testing):  %0.2f (+/- %0.2f)" % (scores['test_f1_score'].mean(), scores['test_f1_score'].std() * 2))

但我正在尝试将这些数据放入混淆矩阵中。我可以使用CROSS_VAL_FORECT-

创建混淆矩阵
y_train_pred = cross_val_predict(model, X, y, cv=10)
confusion_matrix(y, y_train_pred)

这很好,但因为它自己进行交叉验证,所以结果不会匹配。我只是在寻找一种方法,让两者都能得到匹配的结果。

任何帮助或提示都是很棒的。谢谢!

推荐答案

简短的答案是您不能。

混淆矩阵的思想是使用一个训练好的模型来评估一个数据。结果是一个矩阵,而不是像准确度这样的分数。所以你不能计算平均值或类似的东西。cross_val_score顾名思义,仅适用于分数。混淆矩阵不是分数,它是评估过程中发生的事情的一种汇总。

cross_val_predict在您寻找的内容上非常相似。此函数将数据拆分为K个部分。每个部分都将使用您使用数据的其他部分获得的模型进行测试。所有被测试的样本将被合并。但使用此函数时要小心: 将这些预测传递到评估度量可能不是衡量泛化性能的有效方法。结果可能与CROSS_VALIDATE和CROSS_VAL_SCORE不同,除非所有测试集的大小相同并且度量在样本上分解。

17