我正在尝试弄清楚如何使用cross_validate生成混淆矩阵。目前我已经可以打印出分数了。
# 实例化模型
model = DecisionTreeClassifier()
# 分数
scoring = {'accuracy' : make_scorer(accuracy_score),
'precision' : make_scorer(precision_score),
'recall' : make_scorer(recall_score),
'f1_score' : make_scorer(f1_score)}
# 10折交叉验证
scores = cross_validate(model, X, y, cv=10, scoring=scoring)
print("准确率(测试):%0.2f (+/- %0.2f)" % (scores['test_accuracy'].mean(), scores['test_accuracy'].std() * 2))
print("精确率(测试):%0.2f (+/- %0.2f)" % (scores['test_precision'].mean(), scores['test_precision'].std() * 2))
print("召回率(测试):%0.2f (+/- %0.2f)" % (scores['test_recall'].mean(), scores['test_recall'].std() * 2))
print("F1分数(测试):%0.2f (+/- %0.2f)" % (scores['test_f1_score'].mean(), scores['test_f1_score'].std() * 2))
但是我想将这些数据放入混淆矩阵中。我能够使用cross_val_predict来创建一个混淆矩阵 –
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不同。