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

Why does best_params_ in GridSearchCV ignore the variance?

GridSearchCVbest_param_documentation 指出:

best_params_ : dict

Parameter setting that gave the best results on the hold out data.

据此,我假设 "best results" 表示我的 k 折中的最佳分数(最高准确度/最低错误)和最低方差。

然而,正如我们在 cv_results_ 中看到的那样,情况并非如此:

此处 best_param_ returns k=5 而不是 k=9 其中 mean_test_score 和方差将是最优的。

我知道我可以使用 cv_results_ 的输出实现我自己的评分函数或我自己的 best_param 函数。但是,首先不考虑方差的原因是什么?


我 运行 在那种情况下通过将 KNN 应用于具有 70% 训练拆分和 3 折交叉验证的鸢尾花数据集。


编辑:示例代码:

import numpy as np
import pandas as pd
from sklearn import neighbors
from sklearn import model_selection
from sklearn import datasets

X = datasets.load_iris().data
y = datasets.load_iris().target

X_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)

它的结果 table 与上图不同,但情况是一样的:对于 k=5 mean_test_scorestd_test_score 是最优的。然而 best_param_ returns k=1.

来自GridSearchCV source

    # Find the best parameters by comparing on the mean validation score:
    # note that `sorted` is deterministic in the way it breaks ties
    best = sorted(grid_scores, key=lambda x: x.mean_validation_score,
                  reverse=True)[0]

它按 mean_val 分数排序,仅此而已。 sorted() 保留现有的关系顺序,因此在这种情况下 k=1 是最好的。

我同意你的想法,并且认为可以提交 PR 以获得更好的平局逻辑。

在网格搜索中,cv_results_ 提供 std_test_score 这是分数的标准偏差。由此您可以通过平方来计算方差误差