Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用交叉验证生成混淆矩阵_Python_Machine Learning_Scikit Learn_Cross Validation_Confusion Matrix - Fatal编程技术网

Python 使用交叉验证生成混淆矩阵

Python 使用交叉验证生成混淆矩阵,python,machine-learning,scikit-learn,cross-validation,confusion-matrix,Python,Machine Learning,Scikit Learn,Cross Validation,Confusion Matrix,我正试图找出如何使用交叉验证生成混淆矩阵。我能用我目前掌握的代码打印出分数 # Instantiating model model = DecisionTreeClassifier() #Scores scoring = {'accuracy' : make_scorer(accuracy_score), 'precision' : make_scorer(precision_score), 'recall' : make_scorer(recal

我正试图找出如何使用交叉验证生成混淆矩阵。我能用我目前掌握的代码打印出分数

# 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)
这很好,但由于它自己进行交叉验证,结果将不匹配。我只是在寻找一种方法,既能产生匹配的结果,又能产生匹配的结果


任何帮助或指点都会很好。谢谢

排序答案是您不能。

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

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

我认为最好的方法是将混淆矩阵定义为记分员,或者将其与您定义的其他矩阵相加。幸运的是,这是用户指南中的一个示例;见第三点:

def混淆矩阵记分器(clf,X,y):
y_pred=clf.predict(X)
cm=混淆矩阵(y,y\u pred)
返回{'tn':cm[0,0],'fp':cm[0,1],
'fn':cm[1,0],'tp':cm[1,1]}
cv_结果=交叉验证(svm,X,y,cv=5,
评分=混乱(矩阵评分员)
然后,
cv_results['test_tp']
(等)是一个列表,其中列出了每个折叠的真实阳性数。现在,您可以聚合最适合您的混淆矩阵


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

您可以在
cross\u validate
中设置
return\u estimator
,在这种情况下,返回的字典中有一个键
estimator
,其值为拟合模型列表。不过,您仍然需要能够找到相应的测试折叠。为此,您可以手动定义
cv
对象(例如
cv=StratifiedKFold(10)
交叉验证(…,cv=cv)
;然后
cv
仍将包含进行拆分的相关数据。因此,您可以使用拟合的估计器对适当的测试折叠进行评分,生成混淆矩阵。或者您可以使用
交叉值预测(…,cv=cv)
,但此时您需要重复安装,因此您可能只需跳过
交叉验证
,自己进行循环。

另请参见,