为什么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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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