机器学习模型的可解释性是个让人头痛的问题。在使用LightGBM模型的肯定对生成的GBDT的结构是好奇的,我也好奇,所以就解析一个LightGBM的模型文件看看,通过这个解析,你可以看懂GBDT的结构。


训练配置:


6307410个样本做训练集


num_trees = 2 // 树的棵树


categorical_feature=1,2,3,5,6,8,299 //类别特征编号


num_leaves = 6 // 每棵树的叶子数


max_depth = 3 // 树的深度


learning_rate = 0.1 // 学习率


bagging_fraction = 0.8 // 样本采样比例






训练出的LightGBM模型文件及其含义解析:




tree // 模型中子模型的名字,gbdt的子模型是tree


num_class=1 // 类别数量,二分类问题变成了概率问题


label_index=0 // lable所在列


max_feature_idx=1365 //最大的特征index, 0~1365,LightGBM认为特征从0开始编码


objective=binary //学习目标


sigmoid=1 //结果输出时sigmoid的参数 output[0] = 1.0f / (1.0f + std::exp(-sigmoid_ * input[0]));,越大sigmoid越陡峭




feature_names=Column_0 Column_1 Column_2 ... Column_1363 Column_1364 Column_1365 // 特征名字,就是”Column_” + 数据中特征index




feature_infos=none 0:1 [0:10742] 1487112:0 [0:3999191] ...


// 没有“[]”的是category 特征的bin中的特征取值


// 有“[]”是数值特征的bin中的最小、最大值


// none表示此特征没有使用






// 第1棵树


Tree=0 // 树的编号,从0开始


num_leaves=6 // 树中叶子的数量


split_feature=150 197 381 63 197 //6个叶子,分裂5次,有5个内部节点和分裂特征,这个特征编号是在原样本中的特征编号


split_gain=579239.62681873201 101591.49813184602 78186.521895228478 75276.734034747526 57589.418844881991 // 每次分裂的增益


threshold=0.028499999999999998 0.016500000000000001 554.04549999999995 3.1340000000000003 0.043499999999999997 // 分裂特征的特征值分界点


decision_type=0 0 0 0 0 //5个内部节点的判定类型值,判定类型值是int8_t,以bit形式,第一低位存储是否是category特征,第二低位存储是否使用左子节点作为默认去向,第三、第四低位存储是None(0)、Zero(1)、NaN(2)中的哪种


left_child=1 3 -2 -1 -4


right_child=2 -3 4 -5 -6


leaf_parent=3 2 1 4 3 4


// 树的结构


// 有5个内部节点,默认编号是:0、1、2、3、4


// 有6个叶子节点,编号分别是:-1、-2、-3、-4、-5、-6


// left_child表示这5个内部节点的左子节点,正值表示内部节点的节点编号,负值表示叶子节点的节点编号


// right_child表示这5个内部节点的左子节点


// leaf_parent 表示-1、-2、-3、-4、-5、-6这6个叶子节点的父节点编号


// 于是这个树的结构就是这样







leaf_value=0.013151525839652695 -0.0031140914212769983 -0.017382907119786403 0.038475160439658297 -0.10110187665371873 0.091299535945193661 //各个叶子节点的预测值


leaf_count=171831 511580 1078379 893167 1432378 958588 // 各个叶子节点的样本数量,这里总共有5045923个


internal_value=0 -0.55733646225250466 0.54728595683818304 -0.85735596237957235 0.67893796844992116 // 各个中间节点的预测值


internal_count=5045923 2682588 2363335 1604209 1851755 // 各个中间节点的样本数,1604209[中间节点3的样本数] = 171831 [叶子节点-1的样本数] + 1432378[叶子节点-5的样本数]


//可以看出这棵树的训练只用了5045923个样本,而实际训练集样本有6307410个,这是因为在模型配置文件中设置了采样比例为0.8


shrinkage=0.1 // 设定的学习率




// 第二棵树,含义参考第一棵树


Tree=1


num_leaves=6


split_feature=145 161 198 11 381


split_gain=474253.30131810816 93455.112333323515 62969.704987476958 55878.668231101008 32961.303899061735


threshold=0.026500000000000003 0.018500000000000003 0.043499999999999997 8.4154999999999998 663.125


decision_type=0 0 0 0 0


left_child=1 3 4 -1 -2


right_child=2 -3 -4 -5 -6


leaf_parent=3 4 1 2 3 4


leaf_value=0.010494795842311992 -0.024170274578830017 -0.010405728632592726 0.075110240965977765 -0.08865782202254327 0.038228215007066219


leaf_count=167445 301508 975432 1063548 1556038 981952


internal_value=0 -0.50125289035240339 0.49837677764421778 -0.76617891719378095 0.25393645325883307


internal_count=5045923 2698915 2347008 1723483 1283460


shrinkage=0.1




// 特征重要性


feature importances:


Column_197=2 // 特征197,重要性排最高,重要性值为2,表示在所有树中有两次作为中间节点的分裂特征


Column_381=2 // 所有树中有两次作为中间节点的分裂特征


Column_11=1 // 所有树中有一次作为中间节点的分裂特征


Column_63=1


Column_145=1


Column_150=1


Column_161=1


Column_198=1


// 重要性值是统计特征在所有树中作为中间节点(分裂节点)的分裂特征且分裂增益为正的次数,可以理解成是对分裂作用越大的特征越重要


转自:https://zhuanlan.zhihu.com/p/28768447