如何从含特征选择的GridSearchCV流水线中提取特征并导出决策树
报错原因说明
export_graphviz要求传入训练完成的决策树分类器实例,你传入的GridSearchCV是调参容器,本身不是决策树模型,自然没有n_features_属性。
1. 获取feature_selection筛选后的特征列名
首先确认原始特征名来源:
- 若输入
X是Pandas的DataFrame,原始特征名直接取X.columns.tolist()即可 - 若
X是numpy数组,手动替换为你自定义的特征名列表
之后从最优流水线中提取筛选掩码,过滤得到选中的特征名:
# 获取拟合完成的最优流水线 best_pipeline = grid.best_estimator_ # 提取特征选择器实例 selector = best_pipeline.named_steps['feature_selection'] # 原始特征名,非DataFrame输入请自行替换为自定义特征列表 original_features = X.columns.tolist() # 用get_support()返回的布尔掩码筛选选中的特征 selected_features = [feat for feat, is_selected in zip(original_features, selector.get_support()) if is_selected]
2. 正确导出训练好的决策树
从最优流水线中提取训练完成的决策树实例,传入export_graphviz即可:
from io import StringIO from sklearn.tree import export_graphviz # 提取最优决策树模型 best_tree = best_pipeline.named_steps['dec_tree'] dot_data = StringIO() export_graphviz(best_tree, out_file=dot_data, filled=True, rounded=True, special_characters=True, feature_names = selected_features, class_names=['0','1'])
额外注意项
你定义的参数字典存在重复键问题:
parameteres = {'dec_tree__max_depth':[list(range(1,X.shape[1]+1,1))], 'dec_tree__criterion':['gini', 'entropy'], 'dec_tree__max_depth':[2,4,6,8,10,12]}
同一个键dec_tree__max_depth定义了两次,后面的[2,4,6,8,10,12]会覆盖前面的无效定义,建议删除重复行避免后续出错。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

