我在尝试验证网格搜索的best_score_
值时遇到了一个问题。
我刚刚运行了一个RandomizedSearchCV,并得到了best_score_=0.05325203252032521
。然后我试图根据RandomizedSearchCV对象中包含的信息手动计算这个值。我所做的是:
print(best_model_idx)results_in_splits = []for k, v in cv.cv_results_.items(): if 'split' in k: print('\t->', k) results_in_splits.append(v[best_model_idx]) else: print(k)print('\n')print(sum(results_in_splits) / len(results_in_splits))print(cv.best_score_)
这产生了以下输出:
0mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_subsampleparam_n_estimatorsparam_min_child_weightparam_max_depthparam_gammaparam_colsample_bytreeparams -> split0_test_score -> split1_test_score -> split2_test_score -> split3_test_score -> split4_test_score -> split5_test_score -> split6_test_score -> split7_test_score -> split8_test_score -> split9_test_score -> split10_test_score -> split11_test_score -> split12_test_scoremean_test_scorestd_test_scorerank_test_score
如你所见,我们得到了不同的结果(0.046 vs 0.053),在其他一些实验中,这种差异甚至更为显著。
有谁能帮我澄清这个问题吗?这将不胜感激!
谢谢。
回答:
更新:正如原帖中评论所述,将scikit-learn从v0.21.3升级到v0.22.2解决了这个问题。
正如我在评论中已经提到的,我无法重现你的问题,无论是使用iris
数据还是使用scikit-learn的make_classification
的多个配置生成的虚拟数据。
运行你发布在Pastebin的整个脚本(代码+数据)不会改变这一点;这里是你自己代码的最后几行:
results_in_splits = []for k, v in cv.cv_results_.items(): if 'split' in k: print('\t->', k) results_in_splits.append(v[best_model_idx]) else: print(k)print('\n')print(sum(results_in_splits) / len(results_in_splits))print(cv.best_score_)
输出结果为
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_subsampleparam_n_estimatorsparam_min_child_weightparam_max_depthparam_gammaparam_colsample_bytreeparams -> split0_test_score -> split1_test_score -> split2_test_score -> split3_test_score -> split4_test_score -> split5_test_score -> split6_test_score -> split7_test_score -> split8_test_score -> split9_test_score -> split10_test_score -> split11_test_score -> split12_test_scoremean_test_scorestd_test_scorerank_test_score0.89263209799647050.8926320979964705
即显然这两个分数是相同的,正如它们应该的那样。
在你CV分割中的几乎相同的分数,如在此答案的其他评论中讨论的,也不是bug或其他什么,只是由于不幸的情况造成的:数据集太小(678个样本)结合太多的CV分割(13个)导致每个分割的验证样本只有13-14个;在这么少的样本上计算的任何统计数据都是不可靠的,不应依赖。
但这个最后的观察实际上与你在这里的主要问题无关:你报告的问题在各种情况下无法重现,包括你自己提供的脚本和数据。