考慮一個簡單的例子來演示GBDT算法原理
下面是一個二分類問題,1表示可以考慮的相親對象,0表示不考慮的相親對象
特征維度有3個維度,分別對象 身高,金錢,顏值
cat dating.txt
#id,label,hight,money,face
_0,1,20,80,100
_1,1,60,90,25
_2,1,3,95,95
_3,1,66,95,60
_4,0,30,95,25
_5,0,20,12,55
_6,0,15,14,99
_7,0,10,99,2
這個例子僅僅為了試驗,數據量很小沒有更多統計意義。
0,1,2,3對應可以考慮的相親對象
4,5,6,7 對應不考慮的相親對象
先看一下gbdt訓練的結果
mlt dating.txt -cl gbdt -ntree 2 -nl 3 -lr 0.1 -mil 1 -c train -vl 1 -mjson=1
設置2棵樹,葉子節點最多3個 也就是最多2次分裂,learning rate設置為0.1, 葉子節點中的最少樣本數設置為1(僅供試驗,一般不會設置為1,避免過擬合)
為了打印二叉樹設置輸出json格式的模型
Per feature gain:
0:face 1
1:hight 0.730992
2:money 0.706716
Sigmoid/PlattCalibrator calibrating [ 8 ] (0.00011 s)100% |******************************************|
I0324 16:57:53.240083 17630 time_util.h:113] Train! finished using: [1.486 ms] (0.001486 s)
I0324 16:57:53.240094 17630 time_util.h:102] Test itself! started
TEST POSITIVE RATIO: 0.5000 (4/(4+4))
Confusion table:
||===============================||
|| PREDICTED ||
TRUTH || positive | negative || RECALL
||===============================||
positive|| 4 | 0 || 1.0000 (4/4)
negative|| 0 | 4 || 1.0000 (4/4)
||===============================||
PRECISION 1.0000 (4/4) 1.0000(4/4)
LOG LOSS/instance: 0.2981
TEST-SET ENTROPY (prior LL/in): 1.0000
LOG-LOSS REDUCTION (RIG): 70.1854%
OVERALL 0/1 ACCURACY: 1.0000 (8/8)
POS.PRECISION: 1.0000
PPOS.RECALL: 1.0000
NEG.PRECISION: 1.0000
NEG.RECALL: 1.0000
F1.SCORE: 1.0000
AUC: [1.0000]
對應這個例子,訓練結果是perfect的,全部正確, 特征權重可以看出,對應這個例子訓練結果顏值的重要度最大,看一下訓練得到的樹。
print-gbdt-tree.py --tree -1
Tree 0:
Tree 1: