轉自:https://zhuanlan.zhihu.com/p/28768447
機器學習模型的可解釋性是個讓人頭痛的問題。在使用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
// 重要性值是統計特征在所有樹中作為中間節點(分裂節點)的分裂特征且分裂增益為正的次數,可以理解成是對分裂作用越大的特征越重要