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

时间:2017-12-17 14:30:11

标签: python machine-learning scikit-learn cross-validation grid-search

best_param_GridSearchCVdocumentation

  

best_params_:dict

     

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

从那以后,我假设了#34;最好的结果"意味着最佳分数(最高准确度/最低误差)和最低方差我的k倍。

但是,我们在cv_results_中看到的情况并非如此:

Image of a result table with 4 hyperparameter values having the best rank

此处best_param_返回k=5而不是k=9 mean_test_score,其中方差最佳。

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

我在这种情况下运行,将KNN应用于iris数据集,其中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)

它会产生与上图不同的表,但情况相同:对于k = 5 mean_test_scorestd_test_score是最佳的。但是best_param_返回k = 1。

2 个答案:

答案 0 :(得分:2)

来自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()保留了tie的现有顺序,因此在这种情况下,k = 1是最好的。

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

答案 1 :(得分:-1)

在Grid Search中,cv_results_提供std_test_score,它是得分的标准偏差。由此,您可以通过平方来计算方差误差