Python中使用GraphViz实现带10折交叉验证的决策树可视化求助
决策树GraphViz可视化实现指引
前置依赖安装
- 安装GraphViz本体工具
- Windows:下载官方安装包后,将安装目录下的bin文件夹路径添加到系统环境变量PATH
- macOS:终端执行
brew install graphviz - Linux:终端执行
sudo apt install graphviz
- 安装Python依赖:终端执行
pip install graphviz pydotplus
代码实现说明
你现有代码已经完成了交叉验证评估和全量数据模型训练,只需在训练完成的代码段后添加可视化逻辑即可,完整修改后代码如下:
import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_validate from sklearn.tree import DecisionTreeClassifier from sklearn import tree import graphviz data = pd.read_csv("goddess_2.csv") label_Label = LabelEncoder() data["Label"] = label_Label.fit_transform(data['Label']) X = data.drop("Label", axis = 1) y = data['Label'] # 10折交叉验证评估 model = DecisionTreeClassifier() scoring = ['accuracy','precision_weighted', 'recall_weighted','f1_weighted'] scores = cross_validate(model, X, y, cv=10, scoring=scoring) Accuracy = scores['test_accuracy'].mean() Precision = scores['test_precision_weighted'].mean() Recall = scores['test_recall_weighted'].mean() F1Score= scores['test_f1_weighted'].mean() print("********** Decision Tree *********") print("\nAccuracy,", round(Accuracy * 100,3)) print("\nPrecision,", round(Precision * 100,4)) print("\nRecall,", round(Recall * 100,4)) print("\nF1-Score,", round(F1Score * 100,4)) print("\n") # 全量数据训练决策树 clf = DecisionTreeClassifier(random_state=1234) model = clf.fit(X, y) text_representation = tree.export_text(clf) print(text_representation) # -------------------新增GraphViz可视化逻辑------------------- dot_data = tree.export_graphviz( clf, out_file=None, feature_names=X.columns.tolist(), # 显示实际特征名 class_names=label_Label.inverse_transform(clf.classes_), # 显示原始分类标签 filled=True, # 节点按分类填充对应颜色 rounded=True, # 节点使用圆角样式 special_characters=True # 支持特殊字符正常显示 ) # 渲染并保存可视化结果 graph = graphviz.Source(dot_data) # 保存为PDF格式,同时生成dot源文件 graph.render("决策树可视化结果") # 如需保存为PNG格式,使用下行代码即可 # graph.render("决策树可视化结果", format="png")
注意事项
如果你的数据集特征较多、决策树深度过大,生成的可视化图会过于宽泛难以查看,可以在初始化DecisionTreeClassifier时添加max_depth参数限制树的最大深度,例如clf = DecisionTreeClassifier(random_state=1234, max_depth=5)。
内容的提问来源于stack exchange,提问作者Yawar Abbas
相关产品推荐
相关产品推荐

