我试图使用GridSearchCV来优化一条管道,该管道在开始时进行特征选择,最后使用KNN进行分类。我使用我的数据集对模型进行了拟合,但是当我看到GridSearchCV找到的最佳参数时,它只给出了SelectKBest的最佳参数。我不知道为什么它没有显示出KNN的最佳参数。
这是我的密码。
加法KNN和SelectKbest
classifier = KNeighborsClassifier()
parameters = {"classify__n_neighbors": list(range(5,15)),
"classify__p":[1,2]}
sel = SelectKBest(f_classif)
param={'kbest__k': [10, 20 ,30 ,40 ,50]}具有流水线和参数网格的GridsearchCV
model = GridSearchCV(Pipeline([('kbest',sel),('classify', classifier)]),
param_grid=[param,parameters], cv=10)拟合模型
model.fit(X_new, y)结果
print(model.best_params_)
{'kbest__k': 40}发布于 2022-07-27 12:59:49
我相信这是个不正确的合并方法。试一试
param_grid={**param,**parameters}或(Python 3.9+)
param_grid=param|parameters发布于 2022-07-27 13:34:54
当param_grid是一个列表时,将探索列表中每个字典生成的网格之间的不相交的联合。因此,您的搜索已经结束(1)默认的k=10选择的特性和分类器参数的每个组合,以及(2)默认分类器参数和k的每个值。最好的参数只显示k=40,这意味着拥有更多的特性,即使使用默认分类器,效果也最好。您可以检查您的cv_results_以验证。
作为dx2-66 answers,合并字典将生成您可能需要的完整网格。您也可以从一开始就定义一个字典。
https://stackoverflow.com/questions/73138822
复制相似问题