XGBoost二分类模型中树的绘制

  • 一.graphviz安装与配置
  • 二.树模型绘制脚本
    • 2.1关于fmap文件的简单解释
    • 2.2绘制树的两个方法
    • 2.3树模型绘制的完整脚本
    • 2.4模型中第1颗树绘制图

背景介绍:
本文是 XGBoost模型调参、训练、评估、保存和预测文章的后续,这里详细解释graphviz软件的配置和模型中树的绘制。

一.graphviz安装与配置


不安装软件to_graphviz()和plot_tree()两个方法都无法使用,报错如上图。

安装步骤:
步骤1:下载对应系统版本的graphviz软件,graphviz官网下载链接

步骤2:EXE文件双击安装graphviz,但是需要注意勾选环境变量添加的安装方式,如果没添加则要手动在步骤2中补上,否则无法dot作图。

安装至anaconda的site-packages内,具体路径如下,下方路径就是环境变量的路径

步骤3:环境变量检查,如果步骤2选了add path那就是验证,否则就是手动添加,总之必须要有这两个环境变量。
右键“我的电脑”——“属性”——“高级系统设置”——“高级”——“环境变量”

用户环境变量:双击Path,没有这个环境变量就手动添加,位置与graphviz安装位置相同\bin

系统环境变量值:同样没有这个环境变量就手动添加,位置与graphviz安装位置相同\bin\dot.exe,如D:\anaconda3\Lib\site-packages\graphviz\bin\dot.exe

步骤4:graphviz安装成功验证,cmd执行dot -version,出现下图结果即安装成功

步骤5:pip install graphviz(如果提前安装了先pip uninstall graphviz卸载,重新按步骤执行)

如果没有pip安装会报下图错误

步骤6:运行脚本,执行绘制,如果依然报如下图错误(缺少环境变量),重启软件;重启软件不行就重启电脑(我在重启电脑这个环境卡了2个小时,一直在安装不同版本都是这个错误,重启电脑即可)

二.树模型绘制脚本

百度网盘提取本文数据和完整脚本(提取码:54ul)
下面2.1和2.2都是画图的参数指定,结合脚本看更容易理解

2.1关于fmap文件的简单解释

1.fmap文件是用于替换节点名称的文件(参数fmap='xgb.fmap')。如果没有指定这个文件,或文件中特征数量不够,节点名称会按照f1、f2、f3……依次展开。

2.fmap文件有特定结构,文件中每一行都是如下结构

[feature_id, feature_name, q or i or int]:
第1列为特征的id,第2列为特征的名称;第3列为数据类型
feature_id:从0开始直到len(feature)-1为止。
q:表示数值特征,xgb模型只能导入数值类特征,所以这里直接写了q
i:表示是二分类特征
int:决策边界将为整数

这里我试了q/i/int没差别,int绘制图依然条件是小数。

2.2绘制树的两个方法

1.xgb.to_graphviz(),必须指定模型;可以指定要绘制树的序号,默认0;可以指定fmap、条件节点颜色形状、叶子结点颜色形状。模型保存可以format指定格式,view保存到本地,如果format未指定格式则默认保存为pdf格式文件,优点:清晰度高。

2.xgb.plot_tree(),模型参数指定与to_graphviz()相同,其实底层都是通过graphviz软件来做,不过plot_tree()是通过plt.show()展示,清晰度较差,要想改变需要指定ax参数,这里不做展开了。通过for循环展示了每一颗树,绘制的树不做保存。

2.3树模型绘制的完整脚本

具体步骤都有注释,原理和用法上述内容均已解释,不再赘述。两段代码放在一起便可完整执行,数据自己随便造一份即可。

def model_plot_trees(clf, features, **n):"""绘制树模型"""# 保存特征名称到fmap文件,用于图形绘制with open('xgb.fmap', 'w', encoding="utf-8") as fmap:for k, ft in enumerate(features):fmap.write(''.join(str([k, ft, 'p']) + '\n'))# 构建条件节点和叶子节点的形状、填充颜色c_node_params = {'shape': 'box','style': 'filled,rounded','fillcolor': '#78bceb'}l_node_params = {'shape': 'box','style': 'filled','fillcolor': '#e48038'}# 树模型绘制:有向图# 绘制和保存第num_trees+1棵树,num_trees为树的序号digraph = xgb.to_graphviz(clf, num_trees=0, condition_node_params=c_node_params,leaf_node_params=l_node_params, fmap='xgb.fmap')# digraph.format = 'png'digraph.view('./oil_xgb_trees')# 分别绘制子图,不保存for i in range(n.get('n')):xgb.plot_tree(clf, num_trees=i, condition_node_params=c_node_params,leaf_node_params=l_node_params, fmap='xgb.fmap')plt.show()

这里的model_fit()模块是 XGBoost模型调参、训练、评估、保存和预测 中model_fit()模块的简化调用,此处省略了验证、评估等内容。

def model_fit():"""模型训练"""# XGBoost训练过程,为了便于解释下面调整下参数,树的个数为10,树的最大深度为5model = XGBClassifier(learning_rate=0.3, n_estimators=10, max_depth=5, min_child_weight=1,subsample=1, colsample_bytree=1, gamma=0.1, reg_alpha=0.01, reg_lambda=3)model.fit(X_train, y_train)# 模型保存为txt格式,便于分析、优化和提供可解释性clf = model.get_booster()clf.dump_model('dump_10tree.txt')# 绘制树模型:n <= n_estimatorsmodel_plot_trees(model, dataset.columns[:-1], n=50)return modelif __name__ == '__main__':import pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitimport xgboost as xgbfrom xgboost import XGBClassifierimport warningswarnings.filterwarnings('ignore')plt.rcParams['font.family'] = ['sans-serif']plt.rcParams['font.sans-serif'] = ['SimHei']# 数据集dataset = pd.read_csv('Oil_well_parameters_train.csv', engine='python')# 划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(dataset.iloc[:, :-1], dataset.iloc[:, -1], test_size=0.2,random_state=42)# 模型训练model_xgb_clf = model_fit()

2.4模型中第1颗树绘制图


运行脚本后,全部树的结构会保存到dump.txt文件,下图为第1颗树的文本结构。对照上图可知,第1颗树编号[0],根据最顶端根节点0的条件划分为1和2两个条件节点,再根据两个条件节点分别划分了编号为3,4,5,6的叶子节点,叶子节点带有结果权值。(其中missing是对缺失值的划分标准)

限于篇幅过长,关于绘制的树的更多分析见另一文章 Graphviz绘制模型树2——XGBoost模型的可解释性,这篇文章将从模型中的树着手解释XGBoost模型,并用EXCEL构建出模型。


声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,可收藏可转发但请勿转载,如有雷同纯属巧合。

Graphviz绘制模型树1——软件配置与XGBoost树的绘制相关推荐

  1. Graphviz绘制模型树2——XGBoost模型的可解释性

    从二分类模型中的树重新理解XGBoost算法 一.对绘制的树简单解释 1.1类别判断 1.2树的最大层级 1.3效果较差情况 二.从数据来解释一棵树 2.1EXCEL构建第1颗树 2.2第1棵树的数据 ...

  2. R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理、比较误分类率指标

    R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理.比较误分类率指标 目录

  3. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)

    ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...

  4. Python计算树模型(随机森林、xgboost等)的特征重要度及其波动程度:基于熵减的特征重要度计算及可视化、基于特征排列的特征重要性(feature permutation)计算及可视化

    Python计算树模型(随机森林.xgboost等)的特征重要度及其波动程度:基于熵减的特征重要度计算及可视化.基于特征排列的特征重要性(feature permutation)计算及可视化 目录

  5. 决策树模型回归可视化分析_回归树分析与sklearn决策树案例!

    文 | 菊子皮 (转载请注明出处)同名B站:AIAS编程有道 「摘要:」 决策树是非常基础的算法,其不仅能够进行分类还可以进行回归处理,也就是回归树.要想提高决策树的性能还需要做好剪枝的工作. 「关键 ...

  6. 3-6 决策树、CART树、GBDT、xgboost、lightgbm一些关键点梳理

    目录 1.决策树 2.CART树 2.1 CART分类树-输入样本特征:输出样本对应的类别(离散型) 2.2 CART回归树-输入样本特征:输出样本的回归值(连续型) 3.GBDT 3.1 提升树 3 ...

  7. R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充、缺失值标识、离散变量独热onehot编码)、构建出生体重的xgboost模型回归模型

    R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充.缺失值标识.离散变量独热onehot编码).构建出生体重的xgboost模型回归模型 目录

  8. R语言Logistic回归模型亚组分析森林图(forest plot)绘制

    R语言Logistic回归模型亚组分析森林图(forest plot)绘制 目录 R语言Logistic回归模型亚组分析森林图(forest plot)R语言Logistic回归模型亚组分析森林图

  9. OpenCASCADE绘制测试线束:OCAF 命令之树属性命令

    OpenCASCADEE绘制测试线束:OCAF 命令之树属性命令 树属性命令 RootNode SetNode AppendNode PrependNode InsertNodeBefore Inse ...

最新文章

  1. Android 悬浮窗口
  2. 微盟创始人孙涛勇回应员工删库;字节跳动推“头条搜索”独立 App;C++ 20 规范完成| 极客头条...
  3. 10行代码带你搞定目标检测(附代码)
  4. 软件需求管理用例方法三
  5. mysql 单列转换为行,mysql行转换为列
  6. 查询oracle中所有用户信息
  7. 有子对象的派生类的构造函数
  8. 怎么把springboot部署到阿里云_听说“一分钟就能部署阿里云ECS集群”?
  9. 搭建git服务器(权限管理)
  10. idea 版本控制忽略文件、文件夹设置
  11. Spring 实践 -AOP
  12. nginx php7 fastcgi,[Mac php7 nginx]解决nginx FastCGI sent in stderr: “Primary script unknown”
  13. 专有网络 VPC > VPC与外部网络连接 > 连接VPC
  14. python plt 色卡
  15. 12.sql语句增删改查快速回顾
  16. 开发APP不搞清楚这20个问题,必然沦为一场灾难
  17. cmpp协议对服务器资源消耗大吗,cmpp协议采用什么安全算法 CMPP协议有啥用?
  18. LR杂记--Loadrunner分析系统资源
  19. Linux 容器化技术详解(虚拟化、容器化、Docker)
  20. 在iPad上使用Office 365

热门文章

  1. 阿里云海外服务器网络评测
  2. 中国银联mPOS通用技术安全分析和规范解读
  3. GTO、GTR、MOSFET和IGBT的区别及应用
  4. 给OneNote2016安装NoteHighlight2016, 插件无法加载问题【已解决】
  5. rm -rfi 防止误删除数据
  6. 宽带和光纤宽带的区别
  7. 数学在计算机密码学中的运用,数学在密码学中的应用浅析
  8. storm mysql trident_Trident简介
  9. React-18--css in js
  10. CSS-Less简介