数据挖掘

Xgboost的可视化接口,特征重要性图以及画出决策树

2020-04-17  本文已影响0人  xiaogp

xgboost自带的特征重要性排名以及可视化: plot_importance

import xgboost
from xgboost import XGBClassifier
from sklearn.datasets import load_iris

iris = load_iris()
x, y = iris.data, iris.target
model = XGBClassifier()
model.fit(x, y)
# 如果输入是没有表头的array,会自动以f1,f2开始,需要更换表头
# 画树结构图的时候也需要替换表头
model.get_booster().feature_names = iris.feature_names
# max_num_features指定排名最靠前的多少特征
# height=0.2指定柱状图每个柱子的粗细,默认是0.2
# importance_type='weight'默认是用特征子树中的出现次数(被选择次数),还有"gain"和"cover"
xgboost.plot_importance(model, max_num_features=5)

# f_score就是feature score
image.png

plot_importance中的表头,实际上是调用的booster的get_score()的接口

model.get_booster().get_score()
# {'f2': 136, 'f3': 146, 'f0': 106, 'f1': 90}

修改表头

model.get_booster().feature_names = iris.feature_names
model.get_booster().get_score()
# {'petal length (cm)': 136,
#  'petal width (cm)': 146,
#  'sepal length (cm)': 106,
#  'sepal width (cm)': 90}

ubuntu系统下xgboost画出树结构: to_graphviz

需要下载graphviz
pip install graphviz
sudo apt-get install graphviz # ubuntu系统也需要安装graphviz

xgboost.to_graphviz(model, num_trees=2)  # 索引第2棵树
第2棵树.png

修改图形参数,设置leaf_node_params为不用文本框的纯文本

xgboost.to_graphviz(model, num_trees=1, leaf_node_params={'shape': 'plaintext'})
第1棵树.png

使用dump_model导出迭代工程,配合to_graphviz解释

model.get_booster().dump_model("model.txt")

第一个树的分割逻辑

booster[0]:
0:[petal length (cm)<2.45000005] yes=1,no=2,missing=1
1:leaf=0.430622011
2:leaf=-0.220048919

leaf_value转化为预测概率

leaf_value实际上是这个节点的交叉熵值: 1 / (1 + np.exp(-x))
以第2棵树为例, 第二层的叶子节点
左节点预测概率1 / (1 + np.exp(0.2198)) = 0.445,
右节点的预测概率1 / (1 + np.exp(-0.217)) = 0.554
0.445 + 0.554 = 1


windows系统下xgboost画出树结构: to_graphviz

pip install graphviz
pip install pydot
下载windows下graphviz的zip文件
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
代码中增加环境变量

import os
os.environ["path"] += os.pathsep + "E:\pge\pip_package\release\bin"
scr = xgboost.to_graphviz(model, num_trees=2)
# src.format = "jpg"
src.view("influence_factor/tree")  # 图片保存到位置

graphviz不能显示中文的解决方案
打开tree文件,在第二行 graph [ rankdir = TB ] 下面加入

node [fontname="FangSong"]

使用dot命令重新生成图片

dot Tjpg tree -o tree.jpg
上一篇下一篇

猜你喜欢

热点阅读