GridSearchCV
中best_param_
的文档说明如下:
best_params_
: dict在保留数据上获得最佳结果的参数设置。
由此,我认为“最佳结果”指的是最佳得分(最高准确率/最低错误率)以及在我的k折交叉验证中最低的方差。
然而,事实并非如此,正如我们在cv_results_
中看到的:
这里best_param_
返回k=5
而不是k=9
,在k=9
处mean_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_score
和std_test_score
是最优的。然而best_param_
返回k=1。
回答:
# 通过比较平均验证分数找到最佳参数:
# 注意`sorted`在打破平局的方式上是确定的
best = sorted(grid_scores, key=lambda x: x.mean_validation_score, reverse=True)[0]
它按平均验证分数排序,仅此而已。sorted()在平局时保留现有顺序,因此在这种情况下k=1是最佳的。
我同意你的想法,认为可以提交一个PR来改进平局处理逻辑。