龔奎 孫宇
(廣西大學計算機與電子信息學院 廣西壯族自治區南寧市 530004)
XGBoost[1]是2016年陳天奇發布的基于分類與回歸樹的提升樹系統,在很多針對結構化數據的機器學習任務中,它達到了前沿水平。XGBoost 對于特征相互獨立的數據集具有極好的效果,得到了廣泛使用。XGBoost 發布后,不少學者也在探索對XGBoost 進行改進,Chen 等采用將LSTM 與XGBoost 預測結果聯合預測的方法,提出LSTM-XGBoost 模型[2],并證明該方法優于單一組合模型。岳鵬等提出使用Stacking 方法集成XGBoost,CatBoost,LightGBM等的XLC-Stacking 方法[3],提高了模型的最終預測精度。
目前改進XGBoost 的方法大多采用集成其他算法的方案,對于XGBoost 和數據本身的探索尚不充分。對于數據集本身存在的在特征之間互相干涉的情況下,基于樹的模型有可能過學習訓練數據,容易在樹中出現過擬合的噪音結構。在2018年,XGBoost 增加了特征交互約束參數[4](Feature Interaction Constraints)以抑制這一問題,該參數可以將預先知道的具有交互作用的特征集作為參數傳遞給模型。
但XGBoost 并沒有提供獲取特征交互約束參數的方法,需要對于領域本身已經有足夠的了解,或者需要針對性對于數據進行預先分析處理,這些問題限制了該參數的普遍使用。本文通過對XGBoost 模型信息的分析挖掘,直接從模型中提取潛在的交互特征并應用于下一輪訓練,實驗表明,提取的信息有助于預測效果提升。
XGBoost 的訓練方式是一顆回歸樹訓練結束后,下一顆樹以上一顆樹的預測值與實際值之間的殘差作為輸入進行訓練,通過迭代提升訓練,減少最終回歸偏差。模型可表示為:

對于每一顆樹,訓練中需要評估殘差,得到殘差最小的樹。評估殘差的目標函數由損失函數和正則化項組成。XGBoost 允許自定義損失函數,損失函數須可以二階導。評估樹的殘差的目標函數為:

其中Obj(t)是第t 顆樹的目標函數,是用于衡量yi和差異的損失函數,Ω(ft)是正則化項,n 是樣本數量。

其中,ft (Xi)是正在訓練的第t 顆樹的預測結果,y(t-1)表示前面t - 1 輪的預測結果,在當前樹生成過程中是常量。
將目標函數進行泰勒二階展開,可以得到公式:

當訓練第t 顆樹時,y(t-1)已經確定,屬于常量。移除常量,可得簡化后的目標函數:

函數ft(x)是每顆樹計算預測值的函數,可以重新定義為:

其中,ω 是葉節點的權重,q(x)是把樣本x 映射到對應葉節點的函數。
在XGBoost 中,正則項可以定義為:

其中,T 是葉節點數量,γ 和λ 是對應項的權重,作為參數傳遞給模型。
為了度量一顆樹的好壞,代入以上公式到目標函數轉換得到:其中,Ij是分配到第j 個葉節點的樣本集合。

再定義Gj=∑i∈Ijgi,Hj=∑i∈Ijhi以上公式可簡化為:

設第j 個葉節點最優葉節點權重為ωj*,由上式可得最優葉節點權重計算公式:

在能評估一棵樹的好壞之后,就可以確定樹的節點如何分裂。XGBoost 采用貪心策略[5],每次選取所有特征,用于分裂當前同一深度節點。度量分裂時分別計算左子樹和右子樹的G 和H,則增益定義為:

僅在增益大于0 時才發生分裂,也即分裂收益大于γ 時進行分裂。
在訓練后的模型中,包含每棵回歸樹的每個節點的下列信息:
(1)分裂特征與分裂條件:分裂條件為真走yes 方向,分裂條件為假走no 方向,特征值缺失走missing 方向;
(2)節點增益gain;
(3)分類到葉節點上的訓練數據的二階梯度之和cover。
也可以看到看到每個葉節點的以下信息:
(1)葉節點權重值leaf;
(2)分類到葉節點上的訓練數據的二階梯度之和cover。
對于函數Y=f(X1,X2),假如Y 隨X1變化受X2值的影響,則說X1和X2是交互特征[6],也即存在特征交互[7]。具有特征交互的特征之間可能是任意的函數關系。特征交互典型的例子是異或[8]。

表1:異或問題
從表1 中可以看到,X1和X2分別對于Y 線性無關,無法單獨根據X1或X2獲取有助于判斷Y 值的信息。但是在X1和X2聯合的情況下,可以對Y 值給出有效判斷。
在最小化目標函數的時候,對于具有特征交互作用的數據集,訓練回歸樹會得到不反應真實規律的結構關系。2018年,XGBoost項目貢獻者討論并實現了特征交互約束參數,發布在0.81 版的XGBoost 中。特征交互參數允許用戶根據預先得知的交互特征,帶入模型訓練。
將真實存在的特征約束關系作為特征交互約束參數傳入訓練有助于得到更加穩定和準確的結果。對模型的具體約束是指,如果約束列表中的參數作為特征用于分裂回歸樹,則其子樹的節點只能從此列表中取得。特征約束的原理是,如果多個特征聯合進行預測具有更好的效果,那么就應該在構建樹的過程中,將交互特征作為直接上下級聯合一起對樣本進行預測,從而避免因特征交互產生的噪音節點得到更好的結果。
XGBoost 的模型包含所有節點的增益,因此可以統計出各節點特征的增益之和,和所有處于同一分支并且相連的節點組合的增益之和。節點的增益之和除以節點出現次數,可以得到單個節點的平均增益;節點組合的增益之和除以同一組合的出現次數,可以得到組合的平均增益。如果發現某特征組合的平均增益,大于對應特征單獨計算的增益平均值之和,則可以認為模型中,特征組合情況下的獲得的增益高于非組合情況下的增益,可以將其帶入特征交互參數重新訓練,從而檢驗是否能提高模型性能。考慮到會有平均增益大于單個增益和的特征組合數量較大的情況,為了控制時間復雜度,這里將平均增益除以單個增益和,逆序排序,取前N 項。
計算過程可以分成3 部分,以下列為算法1,算法2,算法3,位于前面的算法是后面算法的基礎。算法1,用于統計所有從根節點到葉節點的路徑和路徑的所有連通子集,算法2,用于獲取平均增益比率最高的前N 個特征集合,算法3,帶入特征集合到模型重新訓練,取得效果最好的模型。
步驟1:定義路徑列表P,P 為節點對象的集合,節點對象包含增益與編號信息;
步驟2:定義遞歸方法F,參數為根節點R 和節點列表L,L初始值為空;
步驟3:如果根節點R 是空,返回;
步驟4:節點列表L 添加根節點R 的增益與編號,L 為當前已遍歷路徑節點;
步驟5:如果根節點左子樹和右子樹均為空,則遍歷此時的節點列表L,取得路徑L 的所有連通子集,將編號與增益之和添加到路徑列表P 中;
步驟5.1:以方法F 遍歷根節點R 的左子樹,以R 的左子樹為根節點參數,L 為節點列表參數;
步驟5.2:以方法F 遍歷根節點R 的右子樹,以R 的右子樹為根節點參數,L 為節點列表參數。
步驟1:輸入模型樹的集合和特征集合數量N;
步驟2:循環取每一顆樹,帶入算法1,取得所有路徑;
步驟3:對以上過程獲得的路徑列表,統計相同路徑出現次數,對于節點完全相同的路徑,累加增益;
步驟4:對各路徑用增益除以出現次數,得到平均增益;
步驟5:對平均增益從大到小排序,輸出前N 個路徑的列表。
步驟1:初次訓練;
步驟2:訓練得到的模型M1 帶入算法2,得到路徑列表;
步驟3:分別將路徑列表轉為特征交互約束參數,分別加入參數中訓練得到多個模型,取效果最好的模型MB;
步驟4:將M1 與MB 比較,取效果較好的模型作為最終輸出。
實驗數據集來自UCI 數據集[9]、OpenML 數據集和Kaggle 數據集,表2 描述了實驗所用數據集。數據集按訓練集和測試集各50%,以類別等比例隨機劃分。
對于二分類任務的評估標準設為AUC(Area Under roc Curve),對于多分類的評估標準設為Kappa 系數。

表2:數據集信息

表3:實驗結果對照表
3.2.1 AUC
在輸出為類別概率的二分類問題中,設TP(True Positive)表示將正類預測為正類的樣本數量,TN(False Negative)表示將負類預測為負類的樣本數量,FP(False Negative)表示將負類預測為正類的樣本數量,FN(False Negative)表示將正類預測為負類的樣本數量,定義真陽率TPR(True Positive Rate):

假陽率FPR(False Positive Rate):

使用FPR 作為橫坐標,TPR 作為縱坐標得到ROC 曲線(receiver operating characteristic curve)。AUC 即ROC 曲線下的面積。AUC范圍是[0,1],越大預測結果越好。對于隨機的預測結果,值期望接近0.5,對于高度準確的結果,值接近1。
3.2.2 Kappa 系數
對多分類問題,得出預測結果和真實結果的混淆矩陣[11],即可計算Kappa 系數。計算公式為:

其中,p0是每一類正確分類的樣本數量之和除以總樣本數,pe是所有類別分別對應的“實際與預測數量的乘積”。Kappa 系數范圍是 [-1,1],越大預測越準確。對于隨機的預測結果,值期望接近0,對于高度準確的結果,值接近1。
實驗硬件電腦CPU 配置為Intel 酷睿i7 處理器,16G 內存。軟件采用Anaconda 構建虛擬Python 環境,conda 版本4.5.11,Python版本3.7.9,XGBoost 版本0.81。
實驗對照組采用默認參數,其特征交互參數默認為空。對比實驗采用統計得到的特征交互列表作為特征交互參數,其他參數與對照組一樣,實驗組取具有最佳效果的特征交互的模型預測結果。
為顯示效果改變程度,實驗僅對尋找具有最優預測結果的特征交互過程進行測試,所有結果取4 位小數。
實驗結果如表3 所示,對于4 個二分類問題,AUC 均得到提升,對于4 個多分類問題,Kappa 系數有3 個得到了提升,1 個下降。
實驗表明,采用算法在多個數據集上有效取得精度提升。但是對于部分問題,找到的特征交互信息在對照組導致精度下降。事實上,并不是所有數據集的特征之間都具有特征交互關系,特征交互約束僅當客觀存在才能提高精度,如果特征之間相互獨立,那么預測效果無法得到通過尋找特征交互得到有效改善。
因此,為了確保模型精度不下降,應該將所有訓練后模型結果在同一評價指標下進行對比,僅在取得提升時采用特征交互約束,最終選擇精度最高的模型作為輸出模型。
該方法的優勢在于不影響原有訓練過程,在訓練時間允許的情況下,可以有效探索對模型精度的進一步提高和數據內在關系的發現,更加充分利用了XGBoost 模型本身提供的信息。
還需要進一步探索的是,特征交互約束允許以多個集合的方式傳入模型,本文為了降低復雜度,僅對單一特征集合傳入實驗。如果采用多個集合同時傳入,效果有進一步提升的空間。