python中graphviz画决策树

1.安装

需要先安装graphviz软件并配置环境变量后再安装graphviz包。

a) 软件下载并安装:链接:https://pan.baidu.com/s/1hw-AaPmyLf2V2BpXUvD1nQ 提取码:5sz0 

b) 配置环境变量,(我的安装路径为C:\Program Files (x86)\Graphviz2.38):

① 在用户变量的path中新增 C:\Program Files (x86)\Graphviz2.38\bin

② 在系统环境变量的path中新增 C:\Program Files (x86)\Graphviz2.38\bin\dot.exe

③ 配置完成后可在命令行输入dot -version观察安装效果,如输出如下图所示即安装成功。

c) 安装pyphon包:pip install graphviz

2.使用

#使用红酒数据集观察
from sklearn import tree 
from sklearn.datasets import load_wine 
from sklearn.model_selection import train_test_split 
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

clf = tree.DecisionTreeClassifier(criterion="entropy",max_depth=5)
clf = clf.fit(Xtrain, Ytrain) 
score = clf.score(Xtest, Ytest) 

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚',
                '类黄酮','非黄烷类酚类','花青素','颜色强度',
                '色调','稀释葡萄酒','脯氨酸']
import graphviz
dot_data = tree.export_graphviz(clf
                                ,out_file = None
                                ,feature_names= feature_name
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                                )
graph = graphviz.Source(dot_data)
graph.save('D:/fhchen/wine_tree.dot') #保存决策树

需要注意的是,此时保存的决策树是一个dot文件,要转换成图片格式可以用如下命令进行转换

dot -Tpng D:\fhchen\wine_tree.dot -o D:\fhchen\wine_tree.png

如果节点中包括中文,则转换后的图片会出现乱码,如下图所示

这是因为生成的dot文件中默认字体格式为helvetica,找到生成的dot文件,打开并编辑,将

digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname=helvetica] ;
edge [fontname=helvetica] ;

替换为

digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname=SimHei] ;
edge [fontname=SimHei] ;

其中字体可以自己选择,如想要宋体可以将SimHei替换为 NSimSun。

最终生成的决策树如下:

 

3.xgboost画出子树

import pandas as pd
from xgboost.sklearn import XGBClassifier
import xgboost as xgb
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #windows下用来正常显示中文
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()

Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = XGBClassifier(
    n_estimators=30,#三十棵树
    learning_rate =0.3,
    max_depth=4,
    min_child_weight=1,
    gamma=0.3,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=12,
    scale_pos_weight=1,
    reg_lambda=1,
    seed=27)

'''
在xgboost的新版本(0.8)中,已无需生成fmap来获取列名。
只需要在训练的时候将数据转换为DataFrame且列名标记为特征即可
'''

clf.fit(pd.DataFrame(Xtrain,columns=wine.feature_names), Ytrain)  
#中间节点形状
condition_node_params = {'shape':'box',
                         'style':'filled,rounded',
                         'fillcolor':'#78bceb'
                         }
#叶子节点形状
leaf_node_params = {'shape':'box',
                    'style':'filled',
                    'fillcolor':'#e48038'
                    }
graph = xgb.to_graphviz(clf,num_trees=1,condition_node_params=condition_node_params,leaf_node_params=leaf_node_params,**{'size':str(12)})
graph.render('xgboost1') #输出pdf文件

目前没找到解决to_graphviz输出的图中中文乱码的办法,就先用英文了。

生成结果如下:

参考文献:

https://blog.youkuaiyun.com/HNUCSEE_LJK/article/details/86772806

https://blog.youkuaiyun.com/pipixiu/article/details/79057885

### 解决方案 在 PyCharm 中遇到无法成功配置 Python 3.8 SDK 的问题可能由多种原因引起,以下是详细的分析和解决方案: #### 1. **确认 Python 安装路径的有效性** 如果 Python 3.8 的安装文件被意外删除或损坏,则可能导致 IDE 报错“此 SDK 似乎无效”。建议重新验证 Python 是否正常安装。可以通过命令行运行以下代码来测试: ```bash python --version ``` 或者指定完整路径执行: ```bash E:\homestead\py_xiaoxiaole\venv\Scripts\python.exe --version ``` 如果返回版本号 `Python 3.8.x` 则说明安装无误;否则需重新下载并安装 Python 3.8[^1]。 #### 2. **虚拟环境的兼容性检查** 当使用虚拟环境时,可能存在不兼容的情况。例如,在 A 电脑上创建的虚拟环境复制到 B 电脑后可能会因系统差异而失效。此时可以尝试重建虚拟环境: ```bash python -m venv E:\homestead\py_xiaoxiaole\venv ``` 之后再于 PyCharm 中重新添加该虚拟环境作为解释器[^4]。 #### 3. **IDE 配置缓存清理** 有时 PyCharm 缓存中的旧数据会干扰新的 SDK 添加操作。可通过以下方式清除缓存: - 关闭当前项目; - 进入菜单栏选择 `File -> Invalidate Caches / Restart...`; - 勾选所有选项点击 `Invalidate and Restart`. 完成重启后再试一次设置 Python SDK 操作[^3]。 #### 4. **调整 JDK 版本(针对特定情况)** 对于某些高级功能依赖的具体 Java Development Kit (JDK),也可能影响插件加载以及外部工具调用效果。虽然这通常不是主要原因之一,但如果上述办法均未奏效的话,可考虑升级至最新稳定版 JetBrains Runtime 或 OpenJDK 来匹配官方推荐标准[^2]。 --- ### 示例代码片段 下面展示一段简单的脚本来检测是否存在基础库缺失状况,并自动修复部分常见问题: ```python import sys try: import pygame except ImportError as e: print(f"模块导入失败: {e}") response = input("是否现在通过pip安装pygame?(y/n): ") if response.lower() == 'y': subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", "pip"]) subprocess.check_call([sys.executable, "-m", "pip", "install", "pygame"]) else: print("已找到所需的所有模块.") ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值