对xgboost中dump_model生成的booster进行解析
xgboost原生包中有一个dump_model方法,这个方法能帮助我们看到基分类器的决策树如何选择特征进行分裂节点的,使用的基分类器有两个特点:
- 二叉树;
- 特征可以重复选择,来切分当前节点所含的数据集.
由dump_model生成的booster格式如下:

我们可以对该类型的树结构进行解析,得到这个基分类器中特征用来分裂的频率,简单的脚本如下:
# -*- coding: utf-8 -*-
import re
with open('./tree_like.txt', 'r') as f:
lines = f.readlines()
# 初步预处理
comp = []
for line in lines:
new_line = line.replace(' ', '*')
if line.find('leaf') < 0 and (line.startswith('*') or line.startswith('0')):
regular = re.sub(r'(\**)[0-9]{1,2}:\[([0-9]{3})<.*', r'\1\2', new_line).strip()
# print regular
comp.append(regular)
# 解析部分
i = 0
res = {}
for cur in comp:
cur_8 = cur.count('*')
if comp.index(cur, i, len(comp)) + 1 <= len(comp) - 1:
cur_8_next_index = comp.index(cur, i, len(comp)) + 1
cur_8_next = comp[cur_8_next_index]
if cur_8_next.count('*') > cur_8:
obj_1 = str(cur).replace("*", '') + "-" + str(cur_8_next).replace("*", '')
print obj_1
if res.has_key(obj_1):
res[obj_1] = res[obj_1] + 1
else:
res[obj_1] = 1
# print 'parent:' + str(cur) + ", left_child:" + str(cur_8_next)
for x in comp[cur_8_next_index + 1:]:
if x.count('*') < cur_8_next.count('*'):
break
if cur_8_next.count('*') == x.count('*'):
obj_2 = str(cur).replace("*", '') + "-" + str(x).replace("*", '')
print obj_2
if res.has_key(obj_2):
res[obj_2] = res[obj_2] + 1
else:
res[obj_2] = 1
# print 'parent:' + str(cur) + ", right_child:" + str(x)
break
i = i + 1
# print res
得到结果如下:

特征005-053组成子树的次数为3次,053-017组成子树的次数为2次,以此类推...
对xgboost中dump_model生成的booster进行解析的更多相关文章
- XGBoost中参数调整的完整指南(包含Python中的代码)
(搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日 介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...
- java中如何生成可执行的jar文件
java中如何生成可执行的jar文件 最简单的方法就是: jar -cfe Card.jar CardLayoutDemo CardLayoutDemo$1.class CardLayoutDemo$ ...
- keil MDK中如何生成*.bin格式的文件
在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...
- JVM中可生成的最大Thread数量
最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端.对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: ...
- PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法
1 PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法如下, 依次打开Tools -- Execute Commands -- Run Script,运 ...
- 在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序
在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序 本贴首发于: http://xuekaiyuan.com/forum.php?mod=vie ...
- (原创)如何在性能测试中自动生成并获取Oracle AWR报告
版权声明:本文为原创文章,转载请先联系并标明出处 由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意. 过去我们执行测试,都是执行开始和结束分别手动建立一个快照, ...
- IntelliJ IDEA 中自动生成 serialVersionUID 的方法
as, idea plugin中搜如下关键字,并安装该插件: GenerateSerialVersionUID 如上图所示,创建一个类并实现Serializable接口,然后按alt+Enter键,即 ...
- oracle中如何生成awr报告
oracle中如何生成awr报告 1.进入数据库 sqlplus / as sysdba 2.查看用户 show parameter db_name 3.开始压测后执行 exec DBMS_WOR ...
随机推荐
- c++ 字母排序
char a[123] = {'Z', 's', 'p', 'l', 'j', 'r', 'q', 'v', 'n', 'm', 'C', 'F', 'D', 'B', 'A', '2', '0', ...
- 如何编译生成 mkfs.ubifs、ubinize 工具
参考文档: 1.<CoM335X linux开发指南.pdf>的附件1 2.ubifs的制作,移植的重点详解(使用交叉编译器) 3.UBIFS文件系统简介 与 利用mkfs.ubifs和u ...
- .NET CORE 配置Swagger文档
1.先通过NuGet安装Swashbuckle.AspNetCore ,支持.NET core,版本是4.0.1,以上版本好像有些功能不支持 2.startup文件里注入swagger,Configu ...
- blueimp,预览遮罩范围控制
blueimg gallery github地址:https://github.com/blueimp/Gallery/blob/master/README.md 使用前提,引用css和js < ...
- SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-1 函数
6-1 各种各样的函数 ● 函数的种类很多,无需全都记住,只需要记住具有代表性的函数就可以了,其他的可以在使用时再进行查询. ■函数的种类所谓函数,就是输入某一值得到相应输出结果的功能,输入值称为参数 ...
- Nginx和php交互的两种方式
Unix socket 也叫IPC socket 也就是进程间通信套接字用于同一台主机上的不同进程间交换数据 TCP socket IP socket要利用主机的传输层(tcp),可以用于同一台主机 ...
- ftp主动和被动模式区别
转载自:http://www.west999.com/cms/wiki/server/2018-11-16/49417.html FTP是基于TCP的服务的,FTP不同之处在于FTP使用两个端口,一个 ...
- pip常见使用方法
pip可以理解类似yum管理rpm包的管理python包工具 pip参数解释 pip --help Usage: pip <command> [options] Commands: ins ...
- MVC——EF 回顾总结
回顾一下MVC的知识点. 其实开始 我在学校的知识对MVC 还是很模糊的一个概念.只是记得结合EasyUI 增删改查 和分页,代码都是模糊的 进过这段时间的学习,让我对MVC 有了一个很清楚的认识. ...
- App的布局管理
今天学习了布局管理器,格局自己的学习内容和课程,我主要学习了两种管理布局方式 一:LinearLayout线性布局 线性布局是指布局里面的内容成线性排列,有两种排列方式,横向排列和纵向排列,而排列方式 ...