使用GridSearchCV优化含SelectKBest与KNN的管道时仅返回SelectKBest最优参数问题
问题原因与解决方法
问题根源
你在param_grid中传入的是两个独立的参数字典列表[param, parameters],这会让GridSearchCV执行两组完全独立的搜索:
- 第一组:仅遍历
kbest__k的所有取值,KNN全程使用默认参数 - 第二组:仅遍历KNN的
n_neighbors和p参数,SelectKBest全程使用默认参数
最终输出的最优结果来自第一组搜索,因此只会显示kbest__k的参数。
正确写法
要同时优化管道中两个组件的参数,需要把所有参数合并到同一个字典中,让GridSearchCV遍历所有参数组合:
classifier = KNeighborsClassifier() sel = SelectKBest(f_classif) # 将两个组件的参数合并到同一字典 param_grid = { "kbest__k": [10, 20, 30, 40, 50], "classify__n_neighbors": list(range(5,15)), "classify__p": [1,2] } # 传入合并后的参数网格 model = GridSearchCV( Pipeline([('kbest', sel), ('classify', classifier)]), param_grid=param_grid, cv=10 ) model.fit(X_new, y) print(model.best_params_)
预期结果
修改后,best_params_会同时返回SelectKBest和KNN的最优参数,示例输出:
{'kbest__k': 40, 'classify__n_neighbors': 8, 'classify__p': 2}
内容的提问来源于stack exchange,提问作者nigebLM
相关产品推荐
相关产品推荐

