python - 使用 cross_validate 生成混淆矩阵

标签 python machine-learning scikit-learn cross-validation confusion-matrix

我正在尝试找出如何使用 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)

这很好,但由于它正在执行自己的交叉验证,因此结果不会匹配。我只是在寻找一种方法来生成具有匹配结果的两者。

任何帮助或指示都会很棒。谢谢!

最佳答案

我认为最好的方法是将混淆矩阵定义为记分器,而不是或除了您定义的其他矩阵之外。幸运的是,这是用户指南中的示例;参见第三个项目符号 here :

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 并自己执行循环。

关于python - 使用 cross_validate 生成混淆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65645125/

相关文章:

python - 播种和重用 Python 随机种子

python - 在python中解析一个特殊的xml

python - 为 Django 中创建的每个新对象分配了错误的 id

c++ - 为TensorFlow Lite C++编写read_jpeg和解码_jpeg函数

python - 如何在 pyspark 机器学习中使用 Dataframe?

python - ValueError : features should be a dictionary of `Tensor` s. 给定类型:<class 'NoneType' >

python - 对压缩稀疏矩阵进行零填充(用于 NLP)?

python - 跟踪相同颜色的多个对象

tensorflow - keras + scikit-learn 包装器,当 GridSearchCV 与 n_jobs >1 时似乎挂起

python - 在 python 中使用 SVC 进行预测时出现 "ValueError: Expected 2D array, got 1D array instead"