1. 什么是Treelink
Treelink是阿里集團內部的叫法,其學術上的名稱是GBDT(Gradient Boosting Decision Tree,梯度提升決策樹)。GBDT是“模型組合+決策樹”相關算法的兩個基本形式中的一個,另外一個是隨機森林(Random Forest),相較於GBDT要簡單一些。
1.1 決策樹
應用最廣的分類算法之一,模型學習的結果是一棵決策樹,這棵決策樹可以被表示成多個if-else的規則。決策樹實際上是將空間用超平面進行划分的一種方法,每次分割的時候,都將當前的空間一分為二,比如說下面的決策樹:
這樣使得每一個葉子節點都是在空間中的一個不相交的區域。學習得到如上這棵決策樹之后,當輸入一個待分類的樣本實例進行決策的時候,我們就可以根據這個樣本的兩個特征(x, y)的取值來把這個樣本划分到某一個葉子節點,得到分類結果了,這就是決策樹模型的分類過程,決策樹的學習算法有ID3算法和C4.5算法等。
1.2 Boosting方法
Boosting是關於模型組合的一種思想(另一種重要的思想是Bagging)。Boosting算法總是一個迭代的過程,每一次新的訓練都是為了改進上一次的結果。原始Boosting算法是在算法開始的時候,為每一個樣本賦上一個權重值,初始的時候,大家都是一樣重要的。在每一步訓練中得到的模型,會使得數據點的估計有對有錯,因此,在每一步結束后,增加分錯的點的權重,減少分對的點的權重,這樣使得某些點如果老是被分錯,那么就會被“嚴重關注”,也就是被賦上一個很高的權重。那么,在進行了M次迭代之后,將會得到M個簡單的分類器(basic learner),然后我們將它們組合起來(比如說可以對它們進行加權、或者讓它們進行投票等),得到一個最終的模型。Boosting過程如圖所示:
圖中綠色的線表示目前取得的模型(由前m次得到的模型組合而成),虛線表示當前這次basic learner。每次分類的時候,模型會更關注分錯的數據。圖中紅色和藍色的點代表數據,點越大表示權重越高,當m=150的時候,獲取的模型已經幾乎能夠將紅色和藍色的點區分開了。Boosting也可以用下面的公式來表示:
式中YM(X)為學習得到的最終模型。總之,Boosting算法的最大特點就是:“知錯就改”!
1.3 Gradient Boosting
Gradient Boosting是一種Boosting的方法,其與傳統的Boosting的區別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boosting中,每個新的模型的建立是為了使得之前模型的殘差往梯度方向減少,與傳統Boosting對正確、錯誤樣本進行加權有着很大的區別。
1.4 Treelink模型
Treelink不像決策樹模型那樣僅由一棵決策樹構成,而是由多棵決策樹構成,通常都是上百棵樹,而且每棵樹規模都較小(即樹的深度會比較淺)。模型預測的時候,對於輸入的一個樣本實例,首先會賦予一個初值,然后會遍歷每一棵決策樹,每棵樹都會對預測值進行調整修正,最后得到預測的結果:
F0是設置的初值, Ti是一棵一棵的決策樹。對於不同的問題(回歸問題或者分類問題)以及選擇不同的損失函數,初值的設定是不同的。比如回歸問題並且選擇高斯損失函數,那么這個初值就是訓練樣本的目標的均值。
Treelink自然包含了boosting的思想:將一系列弱分類器組合起來,構成一個強分類器。它不要求每棵樹學到太多的東西,每顆樹都學一點點知識,然后將這些學到的知識累加起來構成一個強大的模型。
Treelink模型的學習過程,就是多顆決策樹的構建過程。在樹的構建過程中,最重要的就是尋找分裂點(某個特征的某個取值)。在Treelink算法我們通過損失函數的減小程度用來衡量特征分裂點的樣本區分能力,Loss減小得越多,分裂點就越好。即以某個分裂點划分,把樣本分成兩部分,使得分裂后樣本的損失函數值減小的最多。
Treelink訓練:
1.估算初值;
2.按如下方式創建M棵樹:
–更新全部樣本估計值;
–隨機選取一個樣本子集;
–按如下方式創建J個葉子;
•對當前所有葉子
–更新估計值、計算梯度、最優划分點、最優增長量以及增益(損失函數減少量);
–選擇增益最大的葉子及其划分點,進行分裂,同時分裂樣本子集;
–將增長量刷新到葉子;
Treelink預測:
將目標估計值賦估值;
•對M棵樹:
–根據輸入數據的特征(x),按照決策樹的路徑查找到葉子節點;
–用葉子節點上的增長量更新目標估計值;
•輸出結果;
例如,GBDT得到了三棵決策樹,一個樣本點在預測的時候,也會掉入3個葉子節點上,其增益分別為(假設為3分類的問題):
(0.5, 0.8, 0.1), (0.2, 0.6, 0.3), (0.4, 0.3, 0.3),
那么這樣最終得到的分類為第二個,因為選擇分類2的決策樹是最多的。
2. Treelink二元分類性能測試
2.1 實驗目的及數據准備
利用成交情況歷史數據,通過treelink預測某個賣家的成交情況,即是否有成交,轉化為二元分類問題。
數據格式: target feature1 feature2 … feature13,其中target只有兩個值:0代表無成交,1代表有成交,0代表沒有成交,每個sample由13個feature進行描述。在樣本數據中,正例(target=1)樣本數為23285,負例樣本數為20430,比率為1.14:1。所有樣本數據被分到訓練集和測試集兩個集合:訓練集包括33715個樣本,測試集包括10000個樣本。
2.2 模型參數設置
測試環境利用MLLib 1.2.0工具包中的Treelink模塊進行,主要工作是在訓練過程中根據損失函數的下降趨勢和預測准確率對treelink的各項參數進行調節,最終找到一個最優的參數組合。涉及到的配置文件包括:
mllib.conf:
[data]
filter=0
sparse=0
weighted=0
[model]
cross_validation=0
evaluation_type=3
variable_importance_analysis=1
cfile_name=
model_name=treelink
log_file=日志文件保存路徑
model_file=模型文件保存路徑
param_file=treelink配置文件保存路徑
data_file=樣本數據文件保存路徑
result_file=分類結果文件保存路徑
treelink.conf:
[treelink]
tree_count=500
max_leaf_count=4
max_tree_depth=4
loss_type=logistic
shrinkage=0.15
sample_rate=0.66
variable_sample_rate=0.8
split_balance=0
min_leaf_sample_count=5
discrete_separator_type=leave_one_out
fast_train=0
tree_count:決策樹的個數,越大學習越充分,但太大也會造成過度擬合,而且也消耗訓練和預測的時間。可以先選擇比較大的樹個數,然后觀察訓練過程中的損失減少趨勢,損失減少比較平緩時,樹個數就比較合適了。tree_count和shrinkage也有關系,shrinkage越大,學習越快,需要的樹越少。
shrinkage:步長,代表學習的速度,越小表示學習越保守(慢),越大則表示學習越冒進(快)。通常可以把Shrinkage設小一點,把樹的個數設大一點。
sample_rate:樣本采樣率,為了構造具有不同傾向性的模型,需要使用樣本的子集來進行訓練,過多的樣本會造成更多的過擬合和局部極小問題。這個采樣的比例一般選擇50%-70%比較合適。
variable_sample_rate:特征采樣率,是指從樣本的所有特征中選取部分的特征來學習,而不使用全部特征。當發現訓練出來的模型,某一兩個特征非常強勢,重要性很大,而造成其他特征基本學不到的時候,可以考慮設置一下把這個參數設置成<1的數。
loss_type:設置該參數的時候要格外注意,務必要使優化目標與損失函數保持一致,否則損失函數在訓練過程中不但不減小,反而會增大。
其他參數的詳細含義可以參見mlllib user manual。
2.3 實驗結果
本次試驗利用Lift,F_1和AUC三個指標對treelink模型的分類性能進行評估。
Lift:該指標衡量的是與不利用模型相比,模型的“預測”能力變好了多少。模型的lift(提升指數)越大,模型的運行效果更好。Lift=1表示模型沒有任何提升。
F_1:是覆蓋率與准確率的綜合指標,隨着precision和coverage的同時增大而增大,公式如下:
AUC:Area Under ROC Curve,其值等於ROC曲線下的面積,介於0.5到1之間。較大的AUC代表了較好的performance。關於AUC的計算有多種方法,本實驗中采用的方法如下:
設正例樣本數為M,負例樣本數為N,樣本數n=M+N。首先對score從大到小排序,然后令最大score對應的sample的rank為n,第二大score對應的sample的rank為n-1,以此類推。然后把所有的正例樣本的rank值相加,再減去正例樣本的score為最小的那M個值的情況。得到的就是所有樣本中有多少正例樣本的score大於負例樣本的score,最后除以M×N。需要特別注意的地方是,在存在score相等的情況時,需要賦予相同的rank值,具體操作是把所有這些score相同的樣本的rank取平均。
注:Lift,F_1,ROC曲線可以通過R語言環境機器學習包求得,AUC的計算沒有找到常用工具,因此利用python編程實現。
模型評估結果:
AUC=0.9999,Lift=1.9994,F_1=0.9999
注:以上評估結果為經過長時間參數調整后treelink的分類性能,結果過於理想,目前尚不能判斷是否出現過擬合,需在利用其它數據經過多次實驗后方能驗證。