Windows python3 sklearn 决策树可视化参数及中文乱码

需要安装graphviz,简单的pip install 之后,执行却一直报“无法找到文件”
最后只好手动安装,在graphviz官网(https://graphviz.gitlab.io/_pages/Download/Download_windows.html) 找到windows的对应版本wheel文件,安装后修改系统用户变量path,将安装路径:F:\graphviz\bin 添加到path变量中;
然后得安装pygraphviz,一开始是用pip install,但是一直报错,是unicode相关的错误,修改了pip的init文件也还是不行,网上解释是没有对应的windows版本,只能在linux上安装
于是到官网下载python3版本可用的wheel文件,然后到安装地址下执行命令:pip install XXXX.wheel
之后就可以将树可视化了:
这里的feature_names来自tfidf模型的tfidf_model.get_feature_names()
class_name是有顺序的,最好用树的class_属性,否则输出的顺序是乱的

    dot_data = StringIO()
    tree.export_graphviz(clf,
                         out_file=dot_data,
                         feature_names=feature_names,
                         class_names=clf.classes_,
                         filled=True, rounded=True, max_depth=10,
                         impurity=False)

    graph = pydot.graph_from_dot_data(dot_data.getvalue())
    # 输出pdf,显示整个决策树的思维过程
    graph[0].write_pdf("viz.pdf", encoding='utf-8')

我这个中文乱码问题折腾了好久了,一直不行,最后是这样的:
将直接输出的文件用代码生成utf-8格式的,并将字体转为支持中文的字体,代码如下(忘记是参考的哪个博客了不好意思)

txt_dir = r'dot_data.txt'
txt_dir_utf8 = r'dot_data_utf8.txt'

with codecs.open(txt_dir, 'r',encoding='utf-8') as f, codecs.open(txt_dir_utf8, 'w', encoding='utf-8') as wf:
    for line in f:
        lines = line.strip().split('\t')
        print(lines)
        if 'label' in lines[0]:
            newline = lines[0].replace('\n', '').replace(' ', '')
        else:
            newline = lines[0].replace('\n','').replace('helvetica', 'Microsoft YaHei')
        wf.write(newline + '\t')

这么替换后可能字体那里少了引号会报错,所以在最前面Microsoft Yahei 那里修改一下,前后加上引号:fontname=“Microsoft YaHei”
然后再转化发现是报错如下:
在这里插入图片描述
然后在开头空了两格,也就是diagraph tree前面加了两个空格,然后就好了……好了……了……
如果png超出内存,pdf截断,可以转成svg格式用chrome打开

### Python 中实现决策树可视化的常见方法 #### 方法一: 使用 `sklearn` 的 `export_graphviz` 函数 `sklearn.tree.export_graphviz` 是一种常用的方法来导出决策树模型并生成 `.dot` 文件。随后可以通过 `graphviz` 库将该文件渲染成图像。 以下是具体代码示例: ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, export_graphviz import graphviz # 加载数据集 iris = load_iris() clf = DecisionTreeClassifier(random_state=1234) model = clf.fit(iris.data, iris.target) # 导出 .dot 文件 dot_data = export_graphviz( model, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True ) # 渲染为图形 graph = graphviz.Source(dot_data) graph.render("decision_tree_output") # 输出到当前目录下的 decision_tree_output.pdf 或其他格式 ``` 这种方法的优点在于其灵活性以及能够轻松调整参数以优化可视化效果[^3]。 --- #### 方法二: 使用 `dtreeviz` 工具库 `dtreeviz` 是一个专门设计用于增强决策树可解释性的工具,支持高分辨率的交互式图表,并允许标注单个样本径。 安装方式如下: ```bash pip install dtreeviz ``` 下面是具体的代码实现: ```python from sklearn.datasets import load_wine from sklearn.tree import DecisionTreeClassifier from dtreeviz.trees import dtreeviz wine = load_wine() # 构建模型 clf = DecisionTreeClassifier(max_depth=3, random_state=42) clf.fit(wine.data, wine.target) # 可视化 viz = dtreeviz( clf, x_data=wine.data, y_data=wine.target, target_name='class', feature_names=wine.feature_names, class_names=list(wine.target_names), title="Wine Dataset Decision Tree" ) # 显示或保存图片 viz.view() # 打开浏览器窗口显示 viz.save("wine_decision_tree.svg") # 将结果保存为 SVG 文件 ``` 此方法特别适合于需要更直观理解模型行为的情况,尤其是当关注某个特定实例的预测过程时[^2]。 --- #### 方法三: 基于 `pybaobabdt` 实现高级定制化绘图 对于追求更高美观度或者特殊需求的应用场景,可以考虑使用第三方包 `pybaobabdt` 来完成更加精美的决策树绘制工作。 安装命令: ```bash pip install pybaobabdt ``` 实际应用样例如下所示: ```python import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from pybaobabdt import drawTree # 数据准备 X_train, X_test, y_train, y_test = train_test_split( df[features], df[target], test_size=0.2, random_state=0 ) # 训练模型 model = DecisionTreeClassifier(max_depth=5).fit(X_train, y_train) # 调用 pybaobabdt 进行可视化 ax = drawTree(model, size=10, dpi=300, features=features.tolist()) plt.show() ``` 它提供了丰富的自定义选项以便满足不同用户的审美偏好和业务逻辑表达需求[^4]。 --- #### 解决中文乱码问题的小贴士 如果遇到因字体配置不当而导致的中文字符无法正常显示的问题,则可通过替换默认字体解决: ```python import re with open("tree.dot", "r+", encoding="utf-8") as f: content = re.sub(r'fontname\s*=\s*"Helvetica"', 'fontname="SimSun"', f.read()) with open("fixed_tree.dot", "w", encoding="utf-8") as fw: fw.write(content) ``` 这样即可有效规避由于编码差异引发的一系列麻烦事[^5]。 --- ### 总结 以上介绍了三种主流技术线及其对应的实际操作指南,每种方案各有侧重领域,在选择合适的技术手段前需综合考量项目背景和个人喜好等因素再做决定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值