如何计算RandomizedSearchCV的best_score_属性?

我在尝试验证网格搜索的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个;在这么少的样本上计算的任何统计数据都是不可靠的,不应依赖。

但这个最后的观察实际上与你在这里的主要问题无关:你报告的问题在各种情况下无法重现,包括你自己提供的脚本和数据。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注