Pipeline搭配GridSearchCV对随机森林调参时criterion参数无效报错
问题原因
你遇到的报错是因为Pipeline封装后的参数需要指定所属步骤:GridSearchCV遍历参数时,默认是直接传入顶层的estimator(也就是你这里的Pipeline对象),而criterion、max_depth这些是Pipeline内部随机森林分类器的参数,不能直接写在param_grid的顶层key里。
用make_pipeline生成流水线时,scikit-learn会自动给每个步骤生成小写的类名作为步骤名,你这里的随机森林分类器步骤名是randomforestclassifier,参数需要用步骤名__参数名(双下划线分隔)的格式声明归属。
修正方案
1. 调整param_grid格式
把你原来的param_grid修改为如下格式即可:
param_grid = { 'randomforestclassifier__criterion': ('gini','entropy'), 'randomforestclassifier__max_depth': [5, 10, 20, 30, 50, 100,1000,2000], 'randomforestclassifier__min_samples_leaf': [1,2,4,8,20,40,80,100,200] }
如果你不确定步骤名,可以运行print(pipe_rf.named_steps)查看所有步骤的命名。
2. 可选优化(非必须,不影响运行)
随机森林属于树模型,对特征尺度不敏感,你流水线里的StandardScaler()是多余操作,可以直接去掉,简化流水线:
pipe_rf = make_pipeline(RandomForestClassifier(bootstrap=True, random_state=1))
修正后重新运行代码即可正常执行网格搜索。
内容的提问来源于stack exchange,提问作者hw21
相关产品推荐
相关产品推荐

