我可以在 k 折交叉验证后对精度和召回列表进行平均吗?

机器算法验证 Python 交叉验证 scikit-学习 精确召回
2022-04-10 12:34:19

我创建了一个 5 折交叉验证模型并使用 cross_val_score 函数计算交叉验证模型的精度和召回率,如下所示:

def print_accuracy_report(classifier, X, y, num_validations=5):
    precision = cross_validation.cross_val_score(classifier, 
            X, y, scoring='precision', cv=num_validations)
    print "Precision: " + str(round(100*precision.mean(), 2)) + "%"


    recall = cross_validation.cross_val_score(classifier, 
            X, y, scoring='recall', cv=num_validations)
    print "Recall: " + str(round(100*recall.mean(), 2)) + "%" 

我想知道是否允许我做这些行:

    print "Precision: " + str(round(100*precision.mean(), 2)) + "%"
    print "Recall: " + str(round(100*recall.mean(), 2)) + "%" 

我的意思是这是否代表了整个模型的精度和召回率precision.mean()recall.mean()

只是为了比较起见,在scikit-learn 的 文档中,我看到模型的准确性计算为:

from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)


print(scores)                                          

数组([0.96..., 1. ..., 0.96..., 0.96..., 1. ])

    print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

准确度:0.98 (+/- 0.03)

1个回答

首先,当你进行 5 折交叉验证时,你没有一个模型,你有五个。因此,谈论“整个模型”的精度/召回率并不是很正确,因为不只是一个。相反,您从模型构建过程中获得了对精度/召回率的估计。

也就是说,每个折叠都是一个具有自己的精度和召回率的模型,您可以对它们进行平均以获得所有折叠的平均性能指标。不过,需要注意的一点是,由于召回率是所有正例中真正正例的比例,因此您必须按正例数对每一折进行加权。

想象一下这样一种情况,你有 4 个折叠,每个折叠只有一个阳性,它被正确识别,让你 100% 回忆这些折叠。第五折有 96 个阳性,其中 46 个被正确识别,召回率为 48%。一个直接的平均值会给你 90% 的召回率,但如果你在第五折中考虑到更多的阳性,你的整体召回率只有 50%(100 个阳性中的 50 个)。如果您的折叠分层良好,则此问题将解决召回问题,但对于精度,这取决于每个折叠中预测的阳性数,我看不到在进行预测之前有任何分层方法(您必须在定义折叠和训练模型之前知道预测输出)。我将实施加权平均方法,因为它适用于您选择计算的任何指标,

评论中建议的另一种方法,相当于汇总指标的加权平均值,是对每个折叠的预测混淆矩阵求和,并从组合矩阵计算汇总统计信息。通过对所有折叠的 TP、TN、FP 和 FN 求和,然后计算精确率/召回率,您隐含地考虑了阳性病例的流行率或跨折叠的阳性预测的任何差异。