天天看點

如何解決機器學習中的資料不平衡問題?

在機器學習任務中,我們經常會遇到這種困擾:資料不平衡問題。

資料不平衡問題主要存在于有監督機器學習任務中。當遇到不平衡資料時,以總體分類準确率為學習目标的傳統分類算法會過多地關注多數類,進而使得少數類樣本的分類性能下降。絕大多數常見的機器學習算法對于不平衡資料集都不能很好地工作。

本文介紹幾種有效的解決資料不平衡情況下有效訓練有監督算法的思路:

可以使用不同的資料集。有兩種方法使不平衡的資料集來建立一個平衡的資料集——欠采樣和過采樣。

1.1. 欠采樣

欠采樣是通過減少豐富類的大小來平衡資料集,當資料量足夠時就該使用此方法。通過儲存所有稀有類樣本,并在豐富類别中随機選擇與稀有類别樣本相等數量的樣本,可以檢索平衡的新資料集以進一步模組化。

1.2. 過采樣

相反,當資料量不足時就應該使用過采樣,它嘗試通過增加稀有樣本的數量來平衡資料集,而不是去除豐富類别的樣本的數量。通過使用重複、自舉或合成少數類過采樣等方法(smote)來生成新的稀有樣品。

注意到欠采樣和過采樣這兩種方法相比而言,都沒有絕對的優勢。這兩種方法的應用取決于它适用的用例和資料集本身。另外将過采樣和欠采樣結合起來使用也是成功的。

值得注意的是,使用過采樣方法來解決不平衡問題時應适當地應用交叉驗證。這是因為過采樣會觀察到罕見的樣本,并根據分布函數應用自舉生成新的随機資料,如果在過采樣之後應用交叉驗證,那麼我們所做的就是将我們的模型過拟合于一個特定的人工引導結果。這就是為什麼在過度采樣資料之前應該始終進行交叉驗證,就像實作特征選擇一樣。隻有重複采樣資料可以将随機性引入到資料集中,以確定不會出現過拟合問題。

k-fold交叉驗證就是把原始資料随機分成k個部分,在這k個部分中選擇一個作為測試資料,剩餘的k-1個作為訓練資料。交叉驗證的過程實際上是将實驗重複做k次,每次實驗都從k個部分中選擇一個不同的部分作為測試資料,剩餘的資料作為訓練資料進行實驗,最後把得到的k個實驗結果平均。

對于二分類問題,如果正負樣本分布比例極不平衡,我們可以換一個完全不同的角度來看待問題:把它看做一分類(one class learning)或異常檢測(novelty detection)問題。這類方法的重點不在于捕捉類間的差别,而是為其中一類進行模組化,經典的工作包括one-class svm等,如下圖所示:

如何解決機器學習中的資料不平衡問題?

one class svm 是指你的訓練資料隻有一類正(或者負)樣本的資料, 而沒有另外的一類。在這時,你需要學習的實際上你訓練資料的邊界。而這時不能使用最大化軟邊緣了,因為你沒有兩類的資料。 是以呢,在這邊文章中,“estimating the support of a high-dimensional distribution”, sch?lkopf 假設最好的邊緣要遠離特征空間中的原點。左邊是在原始空間中的邊界,可以看到有很多的邊界都符合要求,但是比較靠譜的是找一個比較緊的邊界(紅色的)。這個目标轉換到特征空間就是找一個離原點比較遠的邊界,同樣是紅色的直線。當然這些限制條件都是人為加上去的,你可以按照你自己的需要采取相應的限制條件。比如讓你data 的中心離原點最遠。

說明:對于正負樣本極不均勻的問題,使用異常檢測,或者一分類問題,也是一個思路。

成功泛化模型的最簡單方法是使用更多的資料,問題是像邏輯回歸或随機森林這樣開箱即用的分類器,傾向于通過舍去稀有類來泛化模型。一個簡單的最佳實踐是建立n個模型,每個模型使用稀有類别的所有樣本和豐富類别的n個不同樣本。假設想要合并10個模型,那麼将保留例如1000例稀有類别,并随機抽取10000例豐富類别。然後,隻需将10000個案例分成10塊,并訓練10個不同的模型。

如何解決機器學習中的資料不平衡問題?

如果擁有大量資料,這種方法是簡單并且是可橫向擴充的,這是因為可以在不同的叢集節點上訓練和運作模型。集合模型也趨于泛化,這使得該方法易于處理。

方法4 可以很好地将稀有類别和豐富類别之間的比例進行微調,最好的比例在很大程度上取決于所使用的資料和模型。但是,不是在整體中以相同的比例訓練所有模型,是以值得嘗試合并不同的比例。如果10個模型被訓練,有一個模型比例為1:1(稀有:豐富)和另一個1:3甚至是2:1的模型都是有意義的。一個類别獲得的權重依賴于使用的模型。

如何解決機器學習中的資料不平衡問題?

方法5 雖然能夠選出最好的樣本資料比例。但是它的魯棒性不能夠保證:它的魯棒性取決于測試集樣本的選取。

為了解決上述方法的缺陷,增加模型魯棒性。為此,我本人在 随機森林算法 思想的啟發下,想出了在上述方法的基礎上,将不同比例下訓練出來的模型進行 多模型bagging 操作,具體的步驟如下:

1. 對兩類樣本選取 n 組不同比例的資料進行訓練并測試,得出模型預測的準确率: 

p={ pi | i=1,2,...n }

2. 對上述各模型的準确率進行歸一化處理,得到新的權重分布:

Ω={ ωi | i=1,2,...n }

其中:

如何解決機器學習中的資料不平衡問題?

3. 按權重分布 Ω 組合多個模型,作為最終的訓練器:

● 對于分類任務:

如何解決機器學習中的資料不平衡問題?

● 對于回歸任務:

如何解決機器學習中的資料不平衡問題?

sergey quora提出了一種優雅的方法,他建議不要依賴随機樣本來覆寫訓練樣本的種類,而是将r個群體中豐富類别進行聚類,其中r為r中的例數。每個組隻保留叢集中心(medoid)。然後,基于稀有類和僅保留的類别對該模型進行訓練。

7.1. 對豐富類進行聚類操作

首先,我們可以對具有大量樣本的豐富類進行聚類操作。假設我們使用的方法是 k-means聚類算法 。此時,我們可以選擇k值為稀有類中的資料樣本的個數,并将聚類後的中心點以及相應的聚類中心當做富類樣本的代表樣例,類标與富類類标一緻。

如何解決機器學習中的資料不平衡問題?

7.2. 聚類後的樣本進行有監督學習

經過上述步驟的聚類操作,我們對富類訓練樣本進行了篩選,接下來我們就可以将相等樣本數的k個正負樣本進行有監督訓練。如下圖所示:

如何解決機器學習中的資料不平衡問題?

所有之前的方法都集中在資料上,并将模型保持為固定的元件。但事實上,如果設計的模型适用于不平衡資料,則不需要重新采樣資料,著名的xgboost已經是一個很好的起點,是以設計一個适用于不平衡資料集的模型也是很有意義的。

通過設計一個代價函數來懲罰稀有類别的錯誤分類而不是分類豐富類别,可以設計出許多自然泛化為稀有類别的模型。例如,調整svm以懲罰稀有類别的錯誤分類。

如何解決機器學習中的資料不平衡問題?

====================================分割線================================

本文作者:ai研習社

繼續閱讀