为什么GridSearchCV中的best_params_忽略方差?

GridSearchCVbest_param_文档说明如下:

best_params_ : dict

在保留数据上获得最佳结果的参数设置。

由此,我认为“最佳结果”指的是最佳得分(最高准确率/最低错误率)以及在我的k折交叉验证中最低的方差。

然而,事实并非如此,正如我们在cv_results_中看到的:

显示4个超参数值具有最佳排名的结果表图像

这里best_param_返回k=5而不是k=9,在k=9mean_test_score和方差会更优。

我知道我可以实现自己的评分函数或使用cv_results_的输出创建自己的best_param函数。但为什么一开始就不考虑方差呢?


我在将KNN应用于iris数据集时遇到了这种情况,训练集占70%,进行了3折交叉验证。


编辑:示例代码:

import numpy as npimport pandas as pdfrom sklearn import neighborsfrom sklearn import model_selectionfrom sklearn import datasetsX = datasets.load_iris().datay = datasets.load_iris().targetX_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, train_size=0.7, test_size=0.3, random_state=62)knn_model = neighbors.KNeighborsClassifier()param_grid = [{"n_neighbors" : np.arange(1, 31, 2)}]grid_search = model_selection.GridSearchCV(knn_model, param_grid, cv=3, return_train_score=False)grid_search.fit(X_train, y_train.ravel())results = pd.DataFrame(grid_search.cv_results_)k_opt = grid_search.best_params_.get("n_neighbors")print("Value returned by best_param_:",k_opt)results.head(6)

结果与上图中的表格不同,但情况相同:对于k=5,mean_test_scorestd_test_score是最优的。然而best_param_返回k=1。


回答:

GridSearchCV源码

    # 通过比较平均验证分数找到最佳参数:
    # 注意`sorted`在打破平局的方式上是确定的
    best = sorted(grid_scores, key=lambda x: x.mean_validation_score,                  reverse=True)[0]

它按平均验证分数排序,仅此而已。sorted()在平局时保留现有顺序,因此在这种情况下k=1是最佳的。

我同意你的想法,认为可以提交一个PR来改进平局处理逻辑。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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