使用Graphviz可视化随机森林决策树并展示特征与类别名称
问题根因
你遇到的索引错误确实由特征维度不匹配导致:你传入的feature_names是原始DataFrame的25个列名,但随机森林分类器接收的是ColumnTransformer做独热编码后生成的155个特征,二者长度不一致,读取特征名时触发索引越界。
解决方法
你只需要替换特征名列表的生成逻辑,从训练完成的流水线中提取编码后的完整特征名即可,步骤如下:
- 从最优Pipeline中提取
ColumnTransformer对象,调用内置方法获取编码后的所有特征名 - 保持类别名、绘图逻辑不变,将新的特征名列表传入
plot_tree即可
修改后的完整代码如下:
# 获取ColumnTransformer编码后的完整特征名,替换原有原始列名 fn = rscv_rf.best_estimator_.named_steps['ct'].get_feature_names_out() # 类别名无需修改 cn= [str(s) for s in y.unique()] fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (5,5), dpi=800) for index in range(0, 5): tree.plot_tree(rscv_rf.best_estimator_.named_steps['clf'].estimators_[index], feature_names = fn, class_names = cn, filled = True, ax = axes[index]) axes[index].set_title('Estimator: ' + str(index), fontsize = 11) fig.savefig('rf_5trees.png')
注意事项
- 如果你使用的sklearn版本低于1.0.0,
get_feature_names_out()方法不可用,可替换为get_feature_names()方法 - 生成的树图中特征名会自动匹配独热编码后的格式,比如原始分类特征
city会生成city_北京、city_上海等编码后特征名,和模型实际使用的特征完全对应
内容的提问来源于stack exchange,提问作者wjie08
相关产品推荐
相关产品推荐

