在构建一个通用的评估工具时,我遇到了以下问题: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_fn5 GaussianNB 0.719762 25 13 190 714 LogisticRegression 0.716429 24 13 190 722 DecisionTreeClassifier 0.702381 38 33 170 580 GradientBoostingClassifier 0.682619 37 36 167 593 KNeighborsClassifier 0.679048 36 36 167 601 RandomForestClassifier 0.675952 40 43 160 56
以第一行为例,cross_val_score.mean() 给出的结果是0.719762(test),而通过计算分数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)不是一个高度可分的数字,你的测试折叠可能大小不一,这可能解释了两个结果之间非常小的(相对的)差异。