不是在每次折叠后记录精度和召回值,而是在每次折叠后存储测试样本的预测。接下来,收集所有测试(即袋外)预测并计算精度和召回率。
## let test_samples[k] = test samples for the kth fold (list of list)
## let train_samples[k] = test samples for the kth fold (list of list)
for k in range(0, k):
model = train(parameters, train_samples[k])
predictions_fold[k] = predict(model, test_samples[k])
# collect predictions
predictions_combined = [p for preds in predictions_fold for p in preds]
## let predictions = rearranged predictions s.t. they are in the original order
## use predictions and labels to compute lists of TP, FP, FN
## use TP, FP, FN to compute precisions and recalls for one run of k-fold cross-validation
在一次完整的 k 折交叉验证运行下,预测器对每个样本进行一个且仅一个预测。给定 n 个样本,您应该有 n 个测试预测。
(注意:这些预测与训练预测不同,因为预测器对每个样本进行预测,而之前从未见过它。)
除非您使用 leave-one-out 交叉验证,否则 k 折交叉验证通常需要对数据进行随机分区。理想情况下,您会进行重复(和分层)k-fold 交叉验证。然而,组合来自不同轮次的精确召回曲线并不简单,因为您不能在精确召回点之间使用简单的线性插值,这与 ROC 不同(请参阅 Davis and Goadrich 2006)。
我个人使用 Davis-Goadrich 方法在 PR 空间中插值计算了 AUC-PR(随后进行数值积分),并使用来自重复分层 10 折交叉的 AUC-PR 估计值比较了分类器验证。
为了绘制一个漂亮的图,我展示了其中一个交叉验证轮次的代表性 PR 曲线。
当然,根据数据集的性质,还有许多其他评估分类器性能的方法。
例如,如果您的数据集中(二进制)标签的比例没有偏差(即大约为 50-50),您可以使用更简单的 ROC 分析和交叉验证:
从每个折叠中收集预测并构建 ROC 曲线(如前所述),收集所有 TPR-FPR 点(即取所有 TPR-FPR 元组的并集),然后绘制可能平滑的组合点集。可选地,使用简单的线性插值和复合梯形法进行数值积分计算AUC-ROC。