gbdt可视化
gbdt的最大优点,和决策树一样,高度可解释,最喜欢的分类模型:)
#!/usr/bin/env python
#coding=gbk
# ==============================================================================
# \file print-fastreank-tree.py
# \author chenghuige
# \date 2014-10-04 00:34:59.825146
# \Description
# ==============================================================================
import sys,os
from gflags import *
from gezi import *
from libmelt import *
from BinaryTree import *
from TreeWriter import *
DEFINE_string('model', './model/model.json', '')
DEFINE_string('feature', '', '')
DEFINE_integer('tree', 0, '-1 means print all trees')
DEFINE_boolean('use_invisable_node', False, '')
DEFINE_string('outfile', 'tree.png', '')
def get_tree_(node_idx, fe, tree, fnames, is_inpath):
node = Node()
node.attr = {'color' : ".7 .3 1.0", 'style' : 'filled'}
node.leftEdgeAttr = {'color' : 'blue', 'penwidth' : '2.5', 'label' : '<='}
node.rightEdgeAttr = {'color' : 'green', 'penwidth' : '2.5', 'label' : '>'}
if is_inpath:
node.attr['color'] = '#40e0d0'
if node_idx < 0:
node.attr['shape'] = 'box'
node.attr['label'] = str(tree.leafValue[-node_idx - 1])
if is_inpath:
print node.attr['label']
return node
name = fnames[tree.splitFeature[node_idx]]
label = '%s\l%f <= %f?\l[%f]'%(name, fe[tree.splitFeature[node_idx]], tree.threshold[node_idx], tree.previousLeafValue[node_idx])
node.attr['label'] = label
if is_inpath:
l = fe[tree.splitFeature[node_idx]] <= tree.threshold[node_idx]
r = 1 - l
if l:
node.leftEdgeAttr['color'] = 'black'
else:
node.rightEdgeAttr['color'] = 'black'
else:
l = r = 0
node.left = get_tree_(tree.lteChild[node_idx], fe, tree, fnames, l)
node.right = get_tree_(tree.gtChild[node_idx], fe, tree, fnames, r)
return node
def get_tree(model, fe, index):
tree = model.trees[index]
fnames = model.Predictor.featureNames
btree = BinaryTree()
node_idx = 0
btree.root = get_tree_(node_idx, fe, tree, fnames, 1)
return btree
def main(argv):
try:
argv = FLAGS(argv) # parse flags
except gflags.FlagsError, e:
print '%s\nUsage: %s ARGS\n%s' % (e, sys.argv[0], FLAGS)
sys.exit(1)
model = jsonfile2obj(FLAGS.model)
fe = Vector(FLAGS.feature)
tree = get_tree(model, fe, FLAGS.tree)
writer = TreeWriter(tree)
if FLAGS.use_invisable_node:
writer.use_invisable_node = True
writer.Write(FLAGS.outfile)
if __name__ == "__main__":
main(sys.argv)
#!/usr/bin/env python
#coding=gbk
# ==============================================================================
# \file TreeWriter.py
# \author chenghuige
# \date 2014-10-02 20:32:25.744069
# \Description
# ==============================================================================
import sys
from BinaryTree import *
import pygraphviz as pgv
'''
treeWriter with func wite can write a binary tree to tree.png or user spcified
file
'''
class TreeWriter():
def __init__(self, tree):
self.num = 1 #mark each visible node as its key
self.num2 = -1 #makk each invisible node as its key
self.tree = tree
self.use_invisable_node = False
def Write(self, outfile = 'tree.png'):
def writeHelp(root, A):
if not root:
return
p = str(self.num)
self.num += 1
A.add_node(p, **root.attr)
q = None
r = None
if root.left:
q = writeHelp(root.left, A)
A.add_edge(p, q, **root.leftEdgeAttr)
if root.right:
r = writeHelp(root.right, A)
A.add_edge(p, r, **root.rightEdgeAttr)
if not self.use_invisable_node:
return p
if q or r:
if not q:
q = str(self.num2)
self.num2 -= 1
A.add_node(q, style = 'invis')
A.add_edge(p, q, style = 'invis')
if not r:
r = str(self.num2)
self.num2 -= 1
A.add_node(r, style = 'invis')
A.add_edge(p, r, style = 'invis')
l = str(self.num2)
self.num2 -= 1
A.add_node(l, style = 'invis')
A.add_edge(p, l, style = 'invis')
B = A.add_subgraph([q, l, r], rank = 'same')
B.add_edge(q, l, style = 'invis')
B.add_edge(l, r, style = 'invis')
return p #return key root node
self.A = pgv.AGraph(directed=True,strict=True)
writeHelp(self.tree.root, self.A)
self.A.graph_attr['epsilon']='0.001'
#self.A.layout(prog='dot')
#print self.A.string() # print dot file to standard output
self.A.layout('dot') # layout with dot
self.A.draw(outfile) # write to file
if __name__ == '__main__':
tree = BinaryTree()
tree.CreateTree(-1)
tree.InorderTravel()
writer = TreeWriter(tree)
if len(sys.argv) > 1:
outfile = sys.argv[1]
writer.Write(outfile) #write result to outfile
else:
writer.Write() #write result to tree.png
gbdt可视化的更多相关文章
- 笔记︱决策树族——梯度提升树(GBDT)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记来源于CDA DSC,L2-R语言课程所 ...
- RF, GBDT, XGB区别
GBDT与XGB区别 1. 传统GBDT以CART作为基分类器,xgboost还支持线性分类器(gblinear),这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回 ...
- 决策树(中)-集成学习、RF、AdaBoost、Boost Tree、GBDT
参考资料(要是对于本文的理解不够透彻,必须将以下博客认知阅读): 1. https://zhuanlan.zhihu.com/p/86263786 2.https://blog.csdn.net/li ...
- 机器学习入门:极度舒适的GBDT原理拆解
机器学习入门:极度舒适的GBDT拆解 本文旨用小例子+可视化的方式拆解GBDT原理中的每个步骤,使大家可以彻底理解GBDT Boosting→Gradient Boosting Boosting是集成 ...
- 机器学习系列:LightGBM 可视化调参
大家好,在100天搞定机器学习|Day63 彻底掌握 LightGBM一文中,我介绍了LightGBM 的模型原理和一个极简实例.最近我发现Huggingface与Streamlit好像更配,所以就开 ...
- iOS可视化动态绘制连通图
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- 发布:.NET开发人员必备的可视化调试工具(你值的拥有)
1:如何使用 1:点击下载:.NET可视化调试工具 (更新于2016-12-29 19:11:00) (终于彻底兼容了部分VS环境下无法使用的问题) 2:解压RAR后执行:CYQ.VisualierS ...
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
随机推荐
- Java BigDecimal详解
借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 较为精确的快速近 ...
- python入门教程链接
python安装 选择 2.7及以上版本 linux: 一般都自带 windows: https://www.python.org/downloads/windows/ mac os: https:/ ...
- 中文的加密传输(python版)
信息传输过程中,可能会被各种监听. 这里介绍一种简单的加密算法(可逆). 正向加密: 字符串 -> 字节(char->int转换) -> 异或每个字节某个KEY ->字节(i ...
- MYSQL 的错误Incorrect information in file: '.\test\stuff.frm
用eos 重新数据库初始化 会出现这个错误 然后 把 mysql 的 两个日志文件删除就行.第一次不知道怎么g搞,花了一下午的时间重装了mysql.5.0. 删除文件 >>>> ...
- 关于Jquery学习的几点反思
1.应用的API插件时,先看说明文档,仔细看,多花点时间也没关系. 2.写出你要完成工作的几个步骤,细化你的工作.保证每一步结果都是正确(特别是在用你不会的东西的时候),这样看起来是在浪费时间,但是最 ...
- SQL 执行计划(二)
最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经 ...
- 2小时入门Robot Framework
1.介绍 1.1.介绍Robot Robot Framework是一个基于关键字驱动的自动化测试框架.通过该框架,测试人员可使用python封装关键字,并在非代码环境下使用关键字构建可被执行的测试用例 ...
- iOS CLLocationManager 定位
今天写个定位,本来很简单,但是在填写plist时,通过系统提示,只能看到NSLocationUsageDescription项目,根本不提示 (1)NSLocationAlwaysUsageDescr ...
- [Linux]安装phpredis扩展
1.下载phpredis,解压并进入目录,在目录下运行phpize /usr/local/php/bin/phpize ./configure --enable-redis-igbinary --wi ...
- Match:Seek the Name, Seek the Fame(POJ 2752)
追名逐利 题目大意:给定一个字符串S,要你找到S的所有前缀后缀数组 还是Kmp的Next数组的简单应用,但是这一题有一个BUG,那就是必须输出字符串的长度(不输出就WA),然而事实上对于abcbab, ...