如何将Random Forest所有decision tree保存到同一个PDF文件
问题原因
仅保存到最后一棵决策树的核心原因是导出逻辑存在覆盖问题:要么每次绘图时重置了画布内容,要么每次写文件时直接覆盖了之前已写入的PDF内容,没有做追加写入。
实现代码
如果未安装依赖库,先执行安装命令:pip install scikit-learn matplotlib
完整可运行代码:
import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris from sklearn.tree import plot_tree from matplotlib.backends.backend_pdf import PdfPages # --------------- 以下为示例模型训练,替换成你自己训练好的模型即可 --------------- X, y = load_iris(return_X_y=True) # n_estimators对应随机森林的决策树数量,按你的实际需求设置 rf_model = RandomForestClassifier(n_estimators=10, random_state=42) rf_model.fit(X, y) # ----------------------------------------------------------------------------- # 初始化多页PDF写入器,所有树会按顺序写入同一个文件 with PdfPages("all_rf_decision_trees.pdf") as pdf_writer: # 遍历随机森林中的每一棵决策树 for tree_id, single_tree in enumerate(rf_model.estimators_): # 每棵树单独创建画布,避免绘图重叠 fig, ax = plt.subplots(figsize=(14, 9)) # 绘制单棵决策树 plot_tree( single_tree, filled=True, ax=ax, feature_names=load_iris().feature_names, # 替换为你自己数据集的特征名列表 class_names=load_iris().target_names, # 替换为你自己数据集的类别名列表 rounded=True, proportion=False ) ax.set_title(f"Decision Tree {tree_id + 1}/{len(rf_model.estimators_)}", fontsize=15) # 当前树的绘图存入PDF新一页 pdf_writer.savefig(fig, bbox_inches="tight") # 关闭画布释放内存 plt.close(fig) print(f"导出完成,共保存{len(rf_model.estimators_)}棵决策树到all_rf_decision_trees.pdf")
避坑说明
- 不要在遍历树的循环内部初始化
PdfPages对象,否则每次循环都会覆盖原有PDF文件,最终只会留下最后一棵树 - 如果单棵树节点过多文字重叠,直接调大
subplots里的figsize参数即可,比如改成(20,12) - 如果你用的是自己的数据集,记得把
feature_names、class_names替换成对应的值,否则节点只会显示特征下标,可读性差 - 代码运行完成后,PDF文件会生成在当前Python脚本的运行目录下,每一页对应一棵决策树
内容的提问来源于stack exchange,提问作者Francisco Felipe Vilches M
相关产品推荐
相关产品推荐

