无法打印Pipeline中SequentialFeatureSelector选择的特征求助
问题解决:获取网格搜索后SequentialFeatureSelector选中的最优特征
问题原因
你遇到的报错核心原因:
- 你设置了
GridSearchCV(refit=False),网格搜索完成后不会用最优参数重新拟合整个数据集,你定义的原始pipe对象从未被实际拟合,自然不存在support_属性。 - 即便后续修改
refit=True,拟合后的最优模型也不是原始pipe,而是存储在GridSearchCV的best_estimator_属性中。
解决方案
步骤1:调整GridSearchCV的refit参数
将refit设为True,让网格搜索自动用最优参数拟合全量数据集:
gs = GridSearchCV(estimator=pipe, param_grid=param_grid, scoring=custom_scorer, n_jobs=-1, cv=cv, refit=True) # 修改此处为True gs.fit(X, y)
步骤2:从最优模型中提取特征选择结果
从gs.best_estimator_中获取拟合完成的SequentialFeatureSelector实例,再提取选中的特征:
# 获取最优模型中的特征选择组件 best_sfs = gs.best_estimator_.named_steps['sfs'] # 获取选中特征的掩码 selected_mask = best_sfs.support_ # 也可以用get_support()方法,效果完全一致 # selected_mask = best_sfs.get_support() # 如果特征有列名,直接提取特征名称 selected_features = X.columns[selected_mask] print("选中的最优特征:", selected_features)
补充:若必须使用refit=False
如果因数据量等原因不想重新拟合全量数据,可从cv_results_中提取最优参数,手动初始化并拟合管道:
# 找到最优参数对应的索引 best_idx = gs.best_index_ best_params = gs.cv_results_['params'][best_idx] # 初始化新管道并设置最优参数 new_pipe = Pipeline([('sfs', sfs), ('knn', knn)]) new_pipe.set_params(**best_params) # 拟合管道 new_pipe.fit(X, y) # 提取选中特征 selected_mask = new_pipe.named_steps['sfs'].support_ selected_features = X.columns[selected_mask] print(selected_features)
内容的提问来源于stack exchange,提问作者Tomward Matthias
相关产品推荐
相关产品推荐

