葉 楓 朱彩霞
(浙江工業大學 管理學院,浙江 杭州 310023)
本文在多個金融數據集上將該算法與原始Stacking算法、其他結合過采樣處理的Stacking算法和其他傳統的集成算法的結果進行比較,結果表明此算法提高了不平衡數據的分類效果。
Stacking 算法是由Wolpert在 1992 年提出的一種集成學習算法,又稱為堆疊算法。與 Boosting和Bagging 相比,堆疊算法在較多的情況下進行多個學習器訓練,能夠結合多個不同的分類算法。堆疊算法核心是將算法分成兩層,第一層是基學習器,第二層是元學習器。如圖1所示,將訓練數據集輸入基學習器中,得到基學習分類結果;再將輸出結果進行組合,作為元學習器的輸入,從而使得下層學習能夠被充分應用于上層學習,糾正基學習算法中的分類偏差。

圖1 Stacking算法框架
給定T個樣本的數據集,表示為D0={(xi,yi),i=1,2,…,T},其中xi為輸入樣本的特征向量,yi為標簽label。通過k折交叉驗證法,將數據集隨機劃分為m個大小基本相等的數據Dj(j=1,2,…,m)。選擇m個基學習器Lj(j=1,2,…,m),在訓練集Dj上訓練第m個學習器,這些基學習器訓練共獲得m個分類模型,表示為Xj(j=1,…,m),并得到訓練的最終結果Cj(j=1,…,m)。在進行交叉檢驗之后,m個分類器結果與yi進行組合得到新的數據集D1={(C1,C2,…,Cj,yi),j=1,2,…,m,i=1,2,…,T)。D1數據集也就是圖1中的數據組合,進一步利用分類算法得到最終分類模型M′,由M′給出最終分類結果。
通過Stacking算法我們可以發現這種算法能夠融合任何分類算法,具有較強的融合性和擴展性,疊加的層次可以從一層到多層向上延伸,每一層模型之中,可以融合不同的算法進行分類器構造,通過測試不同分類算法之間的組合,確定最優算法組合。
經典的k-means算法從提出到現在已超過60年,目前依舊是被運用最廣泛的聚類算法之一。k-means算法的基本原理主要是以歐氏距離作為相似度指標,在迭代過程中根據相似度將樣本分成不同的簇,同一簇相似度高,不同簇之間相似度低。
定義1 設j=1,2,…,k,Y=(y1,y2,…,yn),X與Y的歐氏距離定義為:
(1)
k-means算法流程如下:
輸入:樣本集D={x1,x2,…,xn},聚類簇數k
輸出:聚類結果C
Step 1:從數據集中隨機選擇k個樣本作為初始聚類中心點{μ1,μ1,…,μk};
Step 2:對于i=1,2,…,n,計算樣本點xi和各個聚類中心點的距離,將樣本集中其他樣本分配到離它最近的簇中心所在的簇;
Step 3:對于i=1,2,…,k,在每個簇中,計算簇中所有數據對象的均值,從而得到新的簇中心;
Step 4:重復Step 2、Step 3,直至聚類中心不再發生變化;
Step 5:輸出結果C。
過采樣的主要思想就是通過一系列方法合成新的少數類樣本,以達到均衡數據集的目的。過采樣的方法有很多種,不同的方法有各自的優缺點。過采樣方法中最簡單的是隨機過采樣(Random-Over-Sampling),它主要是隨機復制少數類樣本以使少數類樣本和多數類樣本比例均衡。隨機過采樣雖然方法簡單,能在一定程度上提高少數類樣本的分類正確率,但是由于新增的少數類樣本是直接復制原有的少數類樣本,所以這種算法容易造成過擬合。
針對隨機過采樣的局限性,Chawla等提出SMOTE方法,它是在每個少數類樣本與其相鄰的k個少數類樣本之間進行線性插值,合成新的少數類樣本,如圖2所示。SMOTE的基本步驟如下:

圖2 SMOTE插值說明
(1)首先依次選取每一個少數類樣本xi作為新生成樣本的原樣本;
(2)使用KNN算法找到少數類樣本xi的同類別的k(k取值一般默認為5)個鄰近樣本,記為y1,y2,…,yk;
(3)根據采樣倍率N%,在xi的k個鄰近樣本中隨機選擇N個樣本點;
(4)根據以下公式進行線性插值,生成新的少數類樣本xs:
xs=xi+rand(0,1)×(yi-xi)
(2)
其中,s=1,2,…,N;j=1,2,…,k;rand(0,1)表示0到1的隨機數;
(5)新生成的少數類樣本添加到原始訓練數據集中,平衡數據集。
本研究在Stacking算法框架下,將k-means++聚類算法和過采樣方法應用到分類器中,提出結合聚類過采樣的Stacking算法。本文算法基本思想就是利用k-means++的無監督算法特點,對基學習算法產生的分類結果進行聚類,從而使得分類結果相一致的訓練樣本能夠聚類至同一個簇中;然后對聚類結果進行SMOTE過采樣處理,均衡樣本集;最后進行回歸訓練,得到最終分類結果。該方法將每個基分類器分類概率作為特征集進行聚類,將基分類器的分類結果一致的樣本更好地聚集在一個簇類中,以聚類后的簇類中心代表原多數類數據和少數類數據一起構成新的數據集。SMOTE過采樣增加人工合成的少數類樣本使數據分類平衡,減少了過擬合的可能性,提高了分類器在測試集上的泛化性。另一方面,堆疊算法形成的數據集能夠大大降低聚類算法的運算速度。
傳統的k-means算法只能進行局部最優解,初始化中心的選擇將在很大程度上影響找到的最優解的好壞。因此,為更好地找到初始化中心,Arthur和Vassilvitskii提出了k-means++聚類算法。該算法的初始質心選取的基本思路就是,初始的聚類中心之間的相互距離要盡可能遠,提高在大規模數據中選擇中心的效率。k-means++的具體步驟如下:
(1)從數據集中隨機選取一個樣本作為初始聚類中心c1;

(3)重復第2步直到選出k個聚類中心;
(4)繼續使用k-means算法求出聚類結果。
本文算法就是,不同基學習器產生的分類概率作為特征集通過k-means++的無監督算法進行聚類,k-means++算法能顯著減少分類結果的最終誤差,從而使得分類結果相一致的訓練樣本能夠聚類至同一個簇中。聚類產生的新的簇類分別作為多數類樣本和少數類樣本。聚類結果作為標簽,結合分類概率的特征集進行SMOTE過采樣處理,從而使作為元分類器的輸入數據達到均衡。k-means++聚類過采樣的具體步驟如下:
(1)將Stacking基學習器輸出的分類概率作為新的樣本集;
(2)樣本集通過k-means++的聚類方法重新聚類,得到新的分類結果,將分類結果作為標簽target;
(3)將樣本集和標簽target結合成為新的樣本集,進行SMOTE過采樣處理,合成新的少數類樣本,平衡樣本集;
(4)平衡后的樣本集,去掉標簽target,作為元分類器的輸入數據。
集成算法(Ensemble Method)是通過一定策略將多個學習器結合起來。按個體學習器之間的關系,可以分為Bagging、Boosting和Stacking三大類。Bagging和Boosting框架使用同類型的基學習器進行構建,Stacking則是將不同類型的基學習器進行組合構建,因為不同類型基學習器可以從不同的角度觀察數據特征,更加全面地學習數據,從而得到一個更準確的結果。其核心思想是對基學習器進行交叉驗證訓練,然后在基學習器輸出結果的基礎上,構建二級特征用于訓練元學習器。
本研究在Stacking算法框架下,將k-means++聚類算法應用到基分類器分類結果中,提出結合聚類過采樣的Stacking算法。本文算法基本思想就是,通過Stacking算法,多種基學習算法可以從不同角度分析訓練得到分類概率,根據k-means++的無監督算法特點,使各個基學習算法產生的分類概率作為各個樣本的新的特征值進行聚類,從而得到新的簇類作為多數類樣本數據和少數類樣本數據,然后對聚類結果進行SMOTE過采樣處理,均衡樣本集;最后將平衡后的數據集作為輸入數據進入元分類器回歸分析,得到最終分類結果。該方法通過k-means++聚類使得不同基學習器分類的概率作為特征集進行聚類,提高被錯分的少數類樣本正確分類的概率;再結合SMOTE過采樣處理平衡進入元分類器訓練的數據集,彌補數據不平衡帶來的缺陷。另一方面,堆疊算法形成的數據集是由n個學習器所得到的維度為n的數據,能夠大大降低聚類算法的運算速度。算法的具體步驟如下:首先通過Stacking集成算法的基學習算法對訓練集S1進行訓練,產生分類概率組合得到數據集data。然后隨機選取一個樣本點作為初始聚類中心c1,遍歷數據集,利用歐式距離計算出樣本點與目前的聚類中心的距離D(x),計算每個樣本點被選為下一個聚類中心的概率,按照輪盤法選擇出下一個聚類中心。作為初始聚類簇中心,對data 進行k-means 聚類,得到聚類結果。將聚類結果的label標簽與數據集data結合,形成新的數據集new_data。對new_data數據集進行SMOTE過采樣處理,合成新的少數類樣本,均衡數據集,形成新的數據集final_data。最后對final_data中的特征值data進行回歸分類,得到最終分類結果。算法偽代碼如下所示。
Input:
原始數據集D0(類別標簽0多于1)
基學習分類算法Lj(j=1,2,…,m)
k-means++聚類算法
Logistic算法
Output:
分類結果數據集 result
Begin
Step1k折交叉驗證法將D0隨機劃分為m個大小基本相等的數據集Dj(i=1,2,…,m)。
Step2Cj:利用基學習算法Lj對Dj進行訓練及預測,得到分類結果集Cj與分類器Xj。
Step3將結果Cj按列組合,得到新的數據集data。
Step4遍歷數據集data,根據歐式距離,對數據集 data 進行k-means++ 聚類,初始聚類簇為d1、d2,組合聚類結果,標簽為label。
Step5將data 數據和聚類結果label結合,形成新的數據集new_data。對數據集new_data進行SMOTE過采樣處理,合成新的少數類樣本,得到新的平衡的數據集final_data,標簽為final_label。
Step6對數據集final_data用 logistic方法進行回歸分析,得到最終的分類結果數據集result。
End
聚類過采樣Stacking算法流程如圖3所示。
為了確保實驗結果的可靠性,采用不同實際應用的金融數據來進行檢驗。本文選取1個Kaggle數據集、2個UCI數據進行測試。表1是用于實驗的數據信息,包括樣本數量、特征數、標簽統計數。

圖3 聚類過采樣Stacking算法流程
從表1可以看出,數據集擁有足夠大的樣本數量。數據集都源自金融方面,從標簽0和1的統計比例上能夠明顯看出這3個數據集都是不平衡數據,可以良好地檢驗算法的效果,能夠幫助對比后續的實驗算法。

表1 實驗數據
對于平衡數據,一般采用分類精度作為評價指標。然而,對于不平衡數據而言,以分類精度作為算法的評估標準是不合理的。例如,以金融貸款為例,約1%的信用卡交易存在欺詐行為。因此,在預測中,所有的交易模型具有高達99%的準確率。而實際上,這樣并沒有實際意義,它幾乎無法檢測出任何欺詐交易。在處理不平衡的分類問題上,目前大多采用混淆矩陣(見表2)。其中,TP表示被分類器正確分類的正類數,TN表示被分類器正確分類的負類數,而FN表示被分類器錯誤分類的負類數,FP表示被分類器錯誤分類的正類數。

表2 二分類混淆矩陣
相關的評價指標計算如下:




文獻[18]中用ROC曲線來評價不平衡數據的分類算法。橫坐標是FPR,縱坐標是TPR。
AUC是ROC曲線面積,是用來度量分類模型好壞的一個標準。AUC的大小能夠更加直觀地體現結果的好壞。AUC越大,模型越好,分類器分類效果越好。AUC=1,是完美的分類器,效果最好。
本文算法性能用AUC的值、F1值和G-mean值作為衡量結果好壞的指標:
測試都在windows 10系統下運行,處理器Intel(R)Core(TM)i5-5200UCPU@2.20GHz2.20GHz,內存12GB。用python 3.7版本,采用Pyc.harm編譯器進行運行測試。
為了保證數據的合理以及后續可持續性的測試,將原數據分為訓練集和測試集,數據比例為9∶1,從而能夠得到合理的數據驗證。本文選用Bagging的代表算法隨機森林和極端隨機數、Boosting的代表算法CatBoost算法和LightGBM算法作為初級分類算法,Logistic 回歸算法作為次級分類算法。

圖4 Data1數據集在不同Stacking算法下的ROC曲線

圖5 Data2數據集在不同Stacking算法下的ROC曲線

圖6 Data3數據集在不同Stacking算法下的ROC曲線
為了驗證聚類過采樣對Stacking算法處理不平衡數據有優化作用,分別使用傳統Stacking算法、對原始數據進行SMOTE處理后的Stacking算法(SMO-Stacking)和對基分類器分類概率只使用原始標簽進行SMOTE過采樣處理的Stacking算法(Y-SMO-Stacking)與本文算法(K-SMO-Stacking)進行對比。

表3 每個數據集在不同Stacking算法下的AUC值

表4 每個數據集在不同Stacking算法下的F1值

表5 每個數據集在不同Stacking算法下的G-mean值
圖4、圖5、圖6表示三個數據集在不同Stacking算法下的ROC曲線,表3、表4和表5中第五列是聚類過采樣Stacking算法(K-SMO-Stacking)的結果。從實驗結果上可以發現,本文算法的AUC值幾乎都略高于其他的Stacking算法,本文算法的F1值和G-mean值都高于其他Stacking算法,證明對基學習器的分類概率進行聚類過采樣的方法比原始的Stacking算法處理復雜特征值的海量數據集有一定優勢。這充分說明了整體分類效果有了明顯提高,算法得到了實際結果的認可。尤其是在F1值和G-mean值上,本文算法的值遠高于原始Stacking算法,說明對于傳統的Stacking算法的結構,將聚類過采樣融合到Stacking結構后對處理不平衡數據更加有效。通過表4、表5的第4列和第5列對比可知,本文算法將基分類器輸出的分類概率通過k-means++的聚類算法重新聚類得到新的聚類標簽,將新的聚類后的數據集通過SMOTE過采樣合成新的少數類樣本再進行回歸訓練得到分類結果,比起將基分類器輸出的分類結果和原始數據集的標簽相結合進行SMOTE過采樣處理,可以更好地均衡數據集,提高少數類數據的分類準確率,提高對不平衡數據集的分類效果。

圖7 Data1數據集在不同集成算法下的ROC曲線
將聚類過采樣Stacking算法和其他傳統集成算法進行對比,得到的結果如圖7~9,表6~8所示。除了在data3數據集上表現不佳,在其他數據集上,本文算法在AUC值、F1值和G-mean值上均遠高于其他傳統算法。這也能證明相比于其他傳統的集成算法,本文算法在處理不平衡數據時效果顯著。

圖8 Data2數據集在不同集成算法下的ROC曲線

圖9 Data3數據集在不同集成算法下的ROC曲線

表6 每個數據集在不同集成算法下的AUC值

表7 每個數據集在不同集成算法下的F1值

表8 每個數據集在不同集成算法下的G-mean值
不平衡數據在實際金融項目中普遍存在,這使得不平衡數據在機器學習中成為研究的熱點。本文在Stacking集成框架的基礎上,通過將k-means++聚類算法和過采樣方法相結合,利用k-means++聚類和過采樣進行對數據集的優化,使少數類樣本增多且更密集,對均衡的數據進行訓練。本文在具有大量樣本的金融數據集上進行實驗研究,證明了結合聚類過采樣的Stacking算法比原始Stacking算法、其他結合過采樣的Stacking算法和其他傳統集成算法有了進一步的提高,在AUC值提高效果相近的情況下,在F1值和G-mean值上有明顯提高。
雖然相比于其他算法,本文算法在F1值和G-mean值上都有更好的結果,但在AUC結果上提高的程度還是有所不足。為了進一步提高精度,在生成次級分類器時應當適當增加原始數據集中重要的維度數據,或者增加重要的基學習算法訓練數據,以此來提高精度。下一步工作將重點研究基學習算法訓練結果如何選擇組合重要信息來提高分類精度。