使用 GridSearchCV 进行超参数调整

Posted

技术标签:

【中文标题】使用 GridSearchCV 进行超参数调整【英文标题】:hyperparameter tuning using GridSearchCV 【发布时间】:2021-08-11 13:37:37 【问题描述】:

我有一个 K 最近邻分类器,您可以在下面看到。据我了解,GridSearchCV 正在使用 1-20 之间的不同 k 值测试模型。当我做y_pred=knn_grid_cv.predict(x_test) 时,我得到了一堆 y 预测,但是使用什么值 k(1-20 之间)来获得这些 y 预测?它会是 GridSearchCV 中得分最高的 k 值吗?

x=football_df["Pace"].values.reshape(-1, 1)
print(x)
y=football_df["Position"].values.reshape(-1, 1)  

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.4,random_state=42)

param_grid="n_neighbors":np.arange(1,20)  
knn = KNeighborsClassifier()
knn_grid_cv = GridSearchCV(knn, param_grid, cv=5)
knn_grid_cv.fit(x_train,y_train)
y_pred=knn_grid_cv.predict(x_test)
print(y_pred)

【问题讨论】:

【参考方案1】:

你是对的。您定义param_grid 的方式将测试20 个不同模型的性能,每个模型都有不同的n_neighbors 值。最佳模型被选为具有最高平均交叉验证分数的模型。对于KNeighborsClassifier,使用的默认分数指标是平均准确率。

在您的情况下,这将是所有五个拆分中平均准确度最高的模型。

要查看选择了 n_neighbors 的哪个值,只需执行以下操作:

# Option 1: print the parameters of the best classifier
print(knn_grid_cv.best_estimator_.get_params())

# Option 2: print results of all model combinations
import pandas as pd
res = pd.DataFrame(knn_grid_cv.cv_results_)
print(res)

【讨论】:

感谢您解决这个问题。奇怪的是,9 已被确定为最佳 n_neighbors。但是,当我在没有 GridsearchCV 且 K =3 的情况下做一个单独的 KNN 模型(相同的 train_test_split)时,我的 y_pred 得到了更好的结果 这可能是因为您在没有交叉验证的情况下测试性能。这也可能发生,因为您在声明 knn 或将数据拆分为训练和测试集时没有设置 random_state。基于邻居的模型的一个大问题是它们非常依赖训练数据,并且在从一个数据集切换到另一个数据集时往往会发生巨大变化。 @atyahoo 请参阅What should I do when someone answers my question?。我想知道这里怎么碰巧问了几个问题,得到了几个答案,却没有一个回答。

以上是关于使用 GridSearchCV 进行超参数调整的主要内容,如果未能解决你的问题,请参考以下文章

实现 GridSearchCV 和 Pipelines 以执行 KNN 算法的超参数调整

ValueError 在 Scikit 中找到最佳超参数时使用 GridSearchCV 学习 LogisticRegression

如何使用 GridSearchCV 比较多个模型以及 python 中的管道和超参数调整

调整 SVR 的超参数 [关闭]

如何保存 GridSearchCV 对象?

K-Means GridSearchCV 超参数调优