使用cross_validate生成混淆矩阵

3
我正在尝试使用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_predict方法来制作混淆矩阵 -

y_train_pred = cross_val_predict(model, X, y, cv=10)
confusion_matrix(y, y_train_pred)

这很不错,但由于它正在进行自己的交叉验证,结果将不匹配。我只是想找到一种方法来同时产生具有匹配结果的两者。

任何帮助或指针都将非常感谢。谢谢!


请参考以下链接:https://dev59.com/uH3aa4cB1Zd3GeqPfZqe,https://dev59.com/3WHVa4cB1Zd3GeqPoZuH - Ben Reiniger
2个回答

5

我认为最好的方法是将混淆矩阵定义为一个评分器,而不是或者除了您已经定义的其他评分器之外。幸运的是,在用户指南中有一个示例;请参见第三个项目这里

def confusion_matrix_scorer(clf, X, y):
    y_pred = clf.predict(X)
    cm = confusion_matrix(y, y_pred)
    return {'tn': cm[0, 0], 'fp': cm[0, 1],
            'fn': cm[1, 0], 'tp': cm[1, 1]}
cv_results = cross_validate(svm, X, y, cv=5,
                            scoring=confusion_matrix_scorer)

那么cv_results ['test_tp'](等等)是一个列表,对于每个折叠,它都包含了真正例的数量。现在您可以按照最适合您的方式汇总混淆矩阵。


首先想到了另一种方法,如果它有助于理解sklearn如何处理事情,我会在这里添加它。但我肯定认为第一种方法更好。

您可以在cross_validate中设置return_estimator,此时返回的字典具有一个键estimator,其值为拟合模型的列表。但是你仍然需要能够找到相应的测试折叠。为此,您可以手动定义您的cv对象(例如cv = StratifiedKFold(10)cross_validate(...,cv = cv)),然后cv仍将包含生成拆分所需的相关数据。因此,您可以使用已拟合的估计器对适当的测试折叠进行评分,从而生成混淆矩阵。或者,您可以使用cross_val_predict(...,cv = cv),但此时您会重复拟合,因此您可能应该跳过cross_validate并自己进行循环。


2
短暂的答案是你不能
混淆矩阵的概念是使用训练模型评估一组数据,其结果是一个矩阵,而不是像准确度这样的分数。因此,您无法计算平均值或类似的内容。cross_val_score正如其名称所示,仅适用于分数。混淆矩阵不是分数,它是对评估过程中发生情况的一种总结。 cross_val_predict与您要寻找的内容非常相似。此功能将数据拆分为K个部分。每个部分都将使用您使用其他数据部分获得的模型进行测试。所有测试样本将合并。但是,请注意此功能:"将这些预测结果传递给评估指标可能不是衡量泛化性能的有效方法。除非所有测试集具有相等的大小且指标在样本上分解,否则结果可能与cross_validate和cross_val_score不同。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接