plot_tree是首选方案,因其自scikit-learn 0.21起内置、不依赖Graphviz、直接用matplotlib渲染,适合快速调试和教学;但树过深或特征过多时易不可读,需配合max_depth、filled、fontsize等参数优化可读性。

为什么 plot_tree 是首选方案
Scikit-learn 自 0.21 版起内置了 plot_tree,它不依赖 Graphviz 或额外安装,直接用 matplotlib 渲染,适合快速调试和教学场景。如果你看到报错 ModuleNotFoundError: No module named 'graphviz' 还硬要走 export_graphviz + graphviz.Source 路线,纯属给自己加戏。
实操建议:
- 确认 scikit-learn ≥ 0.21(
import sklearn; print(sklearn.__version__)) - 确保已安装
matplotlib(pip install matplotlib) - 别在 Jupyter 中跳过
%matplotlib inline—— 否则图可能不显示
plot_tree 的关键参数怎么选
默认输出常是一团黑线,根本看不出分裂逻辑。核心是控制信息密度和可读性:
-
max_depth=3:限制树深度,避免节点爆炸;设为None会画整棵树,但大概率糊成一片 -
filled=True:按类别或值上色,一眼识别纯度高的叶子节点 -
feature_names和class_names必须传入列表(不是 numpy array),否则标签显示为feature_0这类编号 -
fontsize=10:默认太小,尤其导出 PNG 时文字几乎不可读;12–14 更稳妥 -
rounded=True和precision=2提升可读性,让数字和边框更友好
示例:
from sklearn.tree import plot_tree<br>plot_tree(clf, max_depth=2, filled=True, feature_names=iris.feature_names,<br> class_names=iris.target_names, fontsize=12, rounded=True, precision=2)
立即学习“Python免费学习笔记(深入)”;
导出图片时容易踩的坑
直接调 plt.show() 只能在交互环境看,没法存图或嵌入报告。正确做法是显式调用 plt.savefig():
- 必须在
plot_tree()后、plt.show()前调用savefig,否则保存的是空白图 - 路径含中文或空格?会静默失败 —— 改用英文路径,如
"tree_output.png" - 图片裁切?加
bbox_inches='tight'参数,否则边缘文字被截断 - DPI 不够?PDF 导出模糊?加
dpi=300(屏幕显示 150 足够,论文投稿建议 300)
完整导出代码:
import matplotlib.pyplot as plt<br>plt.figure(figsize=(12, 8))<br>plot_tree(...)<br>plt.savefig("decision_tree.png", bbox_inches='tight', dpi=300)
什么时候不该用 plot_tree
树太深(比如 max_depth > 5)、特征太多(>20 列)、样本量极大(>10k)时,plot_tree 渲染缓慢且结果不可读。这时该换思路:
- 用
clf.tree_.feature和clf.tree_.threshold手动提取分裂规则,生成文本结构图 - 对高维数据,先用
feature_importances_筛出 top-5 特征,再重训一棵简化树可视化 - 需要交互探索?考虑用
dtreeviz库(pip install dtreeviz),支持缩放、悬停查看统计量,但需额外依赖
真正卡住的往往不是“怎么画”,而是“该画哪棵”。训练前想清楚:这棵树是用来解释模型,还是仅作中间验证?前者必须控制复杂度,后者可以关掉 max_depth 任其生长。


















