在构建通用评估工具时,我遇到了以下问题,其中 cross_val_score.mean() 给出的结果与 cross_val_predict 略有不同。
为了计算测试分数,我有以下代码,它计算每次折叠的分数,然后计算所有折叠的平均值。
testing_score = cross_val_score(clas_model, algo_features, algo_featurest, cv=folds).mean()
为了计算 tp、fp、tn、fn,我有以下代码,它计算所有折叠的这些指标(我假设是总和)。
test_clas_predictions = cross_val_predict(clas_model, algo_features, algo_featurest, cv=folds)
test_cm = confusion_matrix(algo_featurest, test_clas_predictions)
test_tp = test_cm[1][1]
test_fp = test_cm[0][1]
test_tn = test_cm[0][0]
test_fn = test_cm[1][0]
这段代码的结果是:
algo test test_tp test_fp test_tn test_fn
5 GaussianNB 0.719762 25 13 190 71
4 LogisticRegression 0.716429 24 13 190 72
2 DecisionTreeClassifier 0.702381 38 33 170 58
0 GradientBoostingClassifier 0.682619 37 36 167 59
3 KNeighborsClassifier 0.679048 36 36 167 60
1 RandomForestClassifier 0.675952 40 43 160 56
因此,选择第一行 cross_val_score.mean() 给出 0.719762 (测试)并通过计算分数 25+190/25+13+190+71=0.719063545150... ((tp+tn)/(tp+tn+fp +fn)) 略有不同。
我有机会从 quora 的一篇文章中读到这一点:“在 cross_val_predict() 中,元素的分组方式与 cross_val_score() 中的稍有不同。这意味着当您使用这些函数计算相同的指标时,您可以获得不同的结果。 ”
这背后有什么特殊原因吗?
这也在
cross_val_predict
的文档中被提及:
将这些预测传递到评估指标中可能不是衡量泛化性能的有效方法。结果可能与
和cross_validate
不同,除非所有测试集具有相同的大小并且度量在样本上分解。cross_val_score
在您的情况下,您的指标似乎是准确性,这确实会分解样本。但有可能(实际上很可能,因为总大小不是高度可整除的 299)您的测试折叠的大小不同,这可以解释两者之间非常小的(相对)差异。
@bmreiniger,在许多询问有关
cross_val_predict
问题的帖子中,例如,使用 cross_val_score 计算的指标与从 cross_val_predict 开始计算的相同指标有何不同?,对其作用存在普遍误解。或者更准确地说,它不做什么。 cross_val_predict
不返回分数,它返回交叉验证过程中做出的样本外预测。通过将这些预测与真实值相结合,分解为折叠,可以计算每个折叠的模型得分,这就是cross_val_score
的作用。
每个折叠都有一组样本,用于在该折叠上训练模型,并设置一组测试样本,用于使用该模型进行预测。一旦掌握了这些预测,它们就会与测试集的真实值相结合,以对该折叠的模型进行评分。
cross_val_predict
所做的就是使用该折叠的训练集为给定折叠创建一个模型,然后使用该折叠的测试集进行预测。最后,它只是将预测堆叠在所有折叠上,并返回这堆预测,按折叠排序。
cross_val_predict
的结果在许多应用中非常有用,例如,绘制交叉验证结果图、Bootstrap Bias Corrected Cross-Validation,以及(如果计算正确)模型得分。假设 cross_val_predict
用于对模型进行评分。仅当其结果经过适当的后处理时,这才是正确的!
更多详情请参阅: