在機器學(xué)習(xí)任務(wù)中,我們經(jīng)常會遇到這種困擾:數(shù)據(jù)不平衡問題。
數(shù)據(jù)不平衡問題主要存在于有監(jiān)督機器學(xué)習(xí)任務(wù)中。當(dāng)遇到不平衡數(shù)據(jù)時,以總體分類準(zhǔn)確率為學(xué)習(xí)目標(biāo)的傳統(tǒng)分類算法會過多地關(guān)注多數(shù)類,從而使得少數(shù)類樣本的分類性能下降。絕大多數(shù)常見的機器學(xué)習(xí)算法對于不平衡數(shù)據(jù)集都不能很好地工作。
本文介紹幾種有效的解決數(shù)據(jù)不平衡情況下有效訓(xùn)練有監(jiān)督算法的思路:
1、重新采樣訓(xùn)練集
可以使用不同的數(shù)據(jù)集。有兩種方法使不平衡的數(shù)據(jù)集來建立一個平衡的數(shù)據(jù)集——欠采樣和過采樣。
1.1. 欠采樣
欠采樣是通過減少豐富類的大小來平衡數(shù)據(jù)集,當(dāng)數(shù)據(jù)量足夠時就該使用此方法。通過保存所有稀有類樣本,并在豐富類別中隨機選擇與稀有類別樣本相等數(shù)量的樣本,可以檢索平衡的新數(shù)據(jù)集以進一步建模。
1.2. 過采樣
相反,當(dāng)數(shù)據(jù)量不足時就應(yīng)該使用過采樣,它嘗試通過增加稀有樣本的數(shù)量來平衡數(shù)據(jù)集,而不是去除豐富類別的樣本的數(shù)量。通過使用重復(fù)、自舉或合成少數(shù)類過采樣等方法(SMOTE)來生成新的稀有樣品。
注意到欠采樣和過采樣這兩種方法相比而言,都沒有絕對的優(yōu)勢。這兩種方法的應(yīng)用取決于它適用的用例和數(shù)據(jù)集本身。另外將過采樣和欠采樣結(jié)合起來使用也是成功的。
2、使用K-fold交叉驗證
值得注意的是,使用過采樣方法來解決不平衡問題時應(yīng)適當(dāng)?shù)貞?yīng)用交叉驗證。這是因為過采樣會觀察到罕見的樣本,并根據(jù)分布函數(shù)應(yīng)用自舉生成新的隨機數(shù)據(jù),如果在過采樣之后應(yīng)用交叉驗證,那么我們所做的就是將我們的模型過擬合于一個特定的人工引導(dǎo)結(jié)果。這就是為什么在過度采樣數(shù)據(jù)之前應(yīng)該始終進行交叉驗證,就像實現(xiàn)特征選擇一樣。只有重復(fù)采樣數(shù)據(jù)可以將隨機性引入到數(shù)據(jù)集中,以確保不會出現(xiàn)過擬合問題。
K-fold交叉驗證就是把原始數(shù)據(jù)隨機分成K個部分,在這K個部分中選擇一個作為測試數(shù)據(jù),剩余的K-1個作為訓(xùn)練數(shù)據(jù)。交叉驗證的過程實際上是將實驗重復(fù)做K次,每次實驗都從K個部分中選擇一個不同的部分作為測試數(shù)據(jù),剩余的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)進行實驗,最后把得到的K個實驗結(jié)果平均。
3、轉(zhuǎn)化為一分類問題
對于二分類問題,如果正負樣本分布比例極不平衡,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在于捕捉類間的差別,而是為其中一類進行建模,經(jīng)典的工作包括One-class SVM等,如下圖所示:

One Class SVM 是指你的訓(xùn)練數(shù)據(jù)只有一類正(或者負)樣本的數(shù)據(jù), 而沒有另外的一類。在這時,你需要學(xué)習(xí)的實際上你訓(xùn)練數(shù)據(jù)的邊界。而這時不能使用最大化軟邊緣了,因為你沒有兩類的數(shù)據(jù)。 所以呢,在這邊文章中,“Estimating the support of a high-dimensional distribution”, Sch?lkopf 假設(shè)最好的邊緣要遠離特征空間中的原點。左邊是在原始空間中的邊界,可以看到有很多的邊界都符合要求,但是比較靠譜的是找一個比較緊的邊界(紅色的)。這個目標(biāo)轉(zhuǎn)換到特征空間就是找一個離原點比較遠的邊界,同樣是紅色的直線。當(dāng)然這些約束條件都是人為加上去的,你可以按照你自己的需要采取相應(yīng)的約束條件。比如讓你data 的中心離原點最遠。
說明:對于正負樣本極不均勻的問題,使用異常檢測,或者一分類問題,也是一個思路。
4、組合不同的重采樣數(shù)據(jù)集
成功泛化模型的最簡單方法是使用更多的數(shù)據(jù),問題是像邏輯回歸或隨機森林這樣開箱即用的分類器,傾向于通過舍去稀有類來泛化模型。一個簡單的最佳實踐是建立n個模型,每個模型使用稀有類別的所有樣本和豐富類別的n個不同樣本。假設(shè)想要合并10個模型,那么將保留例如1000例稀有類別,并隨機抽取10000例豐富類別。然后,只需將10000個案例分成10塊,并訓(xùn)練10個不同的模型。

如果擁有大量數(shù)據(jù),這種方法是簡單并且是可橫向擴展的,這是因為可以在不同的集群節(jié)點上訓(xùn)練和運行模型。集合模型也趨于泛化,這使得該方法易于處理。
5、用不同比例重新采樣
方法4 可以很好地將稀有類別和豐富類別之間的比例進行微調(diào),最好的比例在很大程度上取決于所使用的數(shù)據(jù)和模型。但是,不是在整體中以相同的比例訓(xùn)練所有模型,所以值得嘗試合并不同的比例。如果10個模型被訓(xùn)練,有一個模型比例為1:1(稀有:豐富)和另一個1:3甚至是2:1的模型都是有意義的。一個類別獲得的權(quán)重依賴于使用的模型。

6、多模型Bagging
方法5 雖然能夠選出最好的樣本數(shù)據(jù)比例。但是它的魯棒性不能夠保證:它的魯棒性取決于測試集樣本的選取。
為了解決上述方法的缺陷,增加模型魯棒性。為此,我本人在 隨機森林算法 思想的啟發(fā)下,想出了在上述方法的基礎(chǔ)上,將不同比例下訓(xùn)練出來的模型進行** 多模型Bagging** 操作,具體的步驟如下:
1. 對兩類樣本選取 N 組不同比例的數(shù)據(jù)進行訓(xùn)練并測試,得出模型預(yù)測的準(zhǔn)確率:
P={ Pi | i=1,2,...N }
2. 對上述各模型的準(zhǔn)確率進行歸一化處理,得到新的權(quán)重分布:
Ω={ ωi | i=1,2,...N }
其中:
3. 按權(quán)重分布 Ω 組合多個模型,作為最終的訓(xùn)練器:
● 對于分類任務(wù):
● 對于回歸任務(wù):
7、集群豐富類
Sergey Quora提出了一種優(yōu)雅的方法,他建議不要依賴隨機樣本來覆蓋訓(xùn)練樣本的種類,而是將r個群體中豐富類別進行聚類,其中r為r中的例數(shù)。每個組只保留集群中心(medoid)。然后,基于稀有類和僅保留的類別對該模型進行訓(xùn)練。
7.1. 對豐富類進行聚類操作
首先,我們可以對具有大量樣本的豐富類進行聚類操作。假設(shè)我們使用的方法是 K-Means聚類算法 。此時,我們可以選擇K值為稀有類中的數(shù)據(jù)樣本的個數(shù),并將聚類后的中心點以及相應(yīng)的聚類中心當(dāng)做富類樣本的代表樣例,類標(biāo)與富類類標(biāo)一致。
7.2. 聚類后的樣本進行有監(jiān)督學(xué)習(xí)
經(jīng)過上述步驟的聚類操作,我們對富類訓(xùn)練樣本進行了篩選,接下來我們就可以將相等樣本數(shù)的K個正負樣本進行有監(jiān)督訓(xùn)練。如下圖所示:
8、設(shè)計適用于不平衡數(shù)據(jù)集的模型
所有之前的方法都集中在數(shù)據(jù)上,并將模型保持為固定的組件。但事實上,如果設(shè)計的模型適用于不平衡數(shù)據(jù),則不需要重新采樣數(shù)據(jù),著名的XGBoost已經(jīng)是一個很好的起點,因此設(shè)計一個適用于不平衡數(shù)據(jù)集的模型也是很有意義的。
通過設(shè)計一個代價函數(shù)來懲罰稀有類別的錯誤分類而不是分類豐富類別,可以設(shè)計出許多自然泛化為稀有類別的模型。例如,調(diào)整SVM以懲罰稀有類別的錯誤分類。