不平衡數據的處理


傳統處理方法

1.加權

即其對不同類別分錯的代價不同,這種方法的難點在於設置合理的權重,實際應用中一般讓各個分類間的加權損失值近似相等。當然這並不是通用法則,還是需要具體問題具體分析。和代價敏感類似

  有如下加權方法:

  概率權重法:當數量差距不那么懸殊時,把各類標簽的實例出現的頻率比作權重,此特征權重來源於數據本身,能夠較好的適應數據集的改變;

2.采樣

采樣方法是通過對訓練集進行處理使其從不平衡的數據集變成平衡的數據集,在大部分情況下會對最終的結果帶來提升。

采樣分為過采樣和欠采樣,過采樣是把小眾類復制多份,欠采樣是從大眾類中剔除一些樣本,或者說只從大眾類中選取部分樣本。隨機采樣最大的優點是簡單,但缺點也很明顯。過采樣后的數據集中會反復出現一些樣本,訓練出來的模型會有一定的過擬合;而欠采樣的缺點顯而易見,那就是最終的訓練集丟失了數據,模型只學到了總體模式的一部分。過采樣會把小眾樣本復制多份,一個點會在高維空間中反復出現,這會導致一個問題,那就是運氣好就能分對很多點,否則分錯很多點。為了解決這一問題,可以在每次生成新數據點時加入輕微的隨機擾動,經驗表明這種做法非常有效。

因為下采樣會丟失信息,如何減少信息的損失呢?第一種方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采樣(放回采樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。第二種方法叫做BalanceCascade,利用增量訓練的思想(Boosting):先通過一次下采樣產生訓練集,訓練一個分類器,對於那些分類正確的大眾樣本不放回,然后對這個更小的大眾樣本下采樣產生訓練集,訓練第二個分類器,以此類推,最終組合所有分類器的結果得到最終結果。第三種方法是利用KNN試圖挑選那些最具代表性的大眾樣本,叫做NearMiss,這類方法計算量很大,感興趣的可以參考“Learning from Imbalanced Data”這篇綜述的3.2.1節。

傳統的欠采樣方法有:smote,smote—borderline,Adasyn等

 

3.數據合成

數據合成方法是利用已有樣本生成更多樣本,這類方法在小數據場景下有很多成功案例,比如醫學圖像分析等。

4.如何選擇

解決數據不平衡問題的方法有很多,上面只是一些最常用的方法,而最常用的方法也有這么多種,如何根據實際問題選擇合適的方法呢?接下來談談一些我的經驗。

1、在正負樣本都非常之少的情況下,應該采用數據合成的方式;

2、在負樣本足夠多,正樣本非常之少且比例及其懸殊的情況下,應該考慮一分類方法;

3、在正負樣本都足夠多且比例不是特別懸殊的情況下,應該考慮采樣或者加權的方法。

4、采樣和加權在數學上是等價的,但實際應用中效果卻有差別。尤其是采樣了諸如Random Forest等分類方法,訓練過程會對訓練集進行隨機采樣。在這種情況下,如果計算資源允許上采樣往往要比加權好一些。

5、另外,雖然上采樣和下采樣都可以使數據集變得平衡,並且在數據足夠多的情況下等價,但兩者也是有區別的。實際應用中,我的經驗是如果計算資源足夠且小眾類樣本足夠多的情況下使用上采樣,否則使用下采樣,因為上采樣會增加訓練集的大小進而增加訓練時間,同時小的訓練集非常容易產生過擬合。

6、對於欠采樣,如果計算資源相對較多且有良好的並行環境,應該選擇集成 Ensemble方法。

5.Ensemble方法

通過聚合多個分類器的預測來提高分類的准確率,這種技術稱為組合方法(ensemble method) 。組合方法由訓練數據構建一組基分類器,然后通過對每個基分類器的預測進行權重控制來進行分類。

Ensemble技術在數據挖掘的三個方向

1.在樣本上做文章,基分類器為同一個分類算法,主要的技術有bagging,boosting;

2.在分類算法上做工作,即用於訓練基分類器的樣本相同,基分類器的算法不同,

3.在樣本屬性集上做文章,即在不同的屬性空間上構建基分類器,比較出名的是randomforestTree算法,這個在weka中也有實現。

Ensemble Methods大致包括三種框架——Bagging,Boosting,Stacking。

對於Bagging來說,添加隨機變量的學習器反而能夠提高整體的效果。這三種方法中,Boosting是表現最好的模型,它與有着廣泛研究基礎的加性模型(addictive models)的統計技術有着相近的關系。

在驗證數據集上找到表現最好的模型作為最終的預測模型

1)對多個模型的預測結果進行投票或者取平均值;

對於數據集訓練多個模型,對於分類問題,可以采用投票的方法,選擇票數最多的類別作為最終的類別,而對於回歸問題,可以采用取均值的方法,取得的均值作為最終的結果。在這樣的思路里最著名的是Bagging方法.Bagging即BoostrapAggregating,其中,Boostrap是一種有放回的抽樣方法,其抽樣策略是簡單的隨機抽樣。每次的訓練集由初始的訓練集中隨機取出的訓練樣本組成,初始的訓練樣本在某次的訓練集中可能出現多次或者根本不出現。

2)對多個模型的預測結果做加權平均;

在上述的Bagging方法中,其特點在於隨機化抽樣,通過反復的抽樣訓練新的模型,最終在這些模型的基礎上取平均。而在對多個模型的預測結果做加權平均則是將多個弱學習模型提升為強學習模型,這就是Boosting的核心思想。Boosting算法中,初始化時對每個訓練樣本賦予相等的權重,如frac{1}{n},然后用該學習算法對訓練集訓練G輪,每次訓練后,對訓練失敗的訓練樣本賦予更大的權重,也就是讓學習算法在后續的學習中幾種對比較難學的訓練樣本進行學習,從而得到一個預測函數序列left { h_1,cdots ,h_G right},其中每個h_i都有一個權重,預測效果好的預測函數的權重較大。

組合分類器優於單一分類器的必須滿足條件:

基分類器之間是相互獨立的

基分類器應當好於隨機猜測分類器

強弱可學習算法

在概率近似正確(probably approximately correct,PAC)學習的框架中,一個概念(一個類),如果存在一個多項式的學習算法能夠學習它,並且正確率很高,那么就稱這個概念是強可學習的。一個概念,如果存在一個多項式的學習算法能夠學習它,學習正確率僅比隨機猜測略好,那么就稱這個概念是弱可學習的。Schapire指出在PAC學習框架下,一個概念是強可學習的充分必要條件是這個概念是弱可學習的。那么對於一個學習問題,若是找到“弱學習算法”,那么可以將弱學習方法變成“強學習算法”。

提升學習方法有兩個問題:

1. 每一輪如何改變訓練數據的權重或概率分布

2. 如何將弱分類器整合為強分類器。

①提高被前一輪弱分類器錯誤分類的權值,而降低那些被正確分類樣本權值,這樣導致結果就是那些沒有得到正確分類的數據,由於權值加重受到后一輪弱分類器的更大關注。

②adaboost采取加權多數表決方法,加大分類誤差率小的弱分類器的權值,使其在表決中起到較大的作用,相反減小誤差率的弱分類的權值,使其在表決中較小的作用。

 

具體說來,整個Adaboost 迭代算法就3步:

1)初始化訓練數據的權值分布。如果有N個樣本,則每一個訓練樣本最開始時都被賦予相同的權重:1/N。

2)訓練弱分類器。具體訓練過程中,如果某個樣本點已經被准確地分類,那么在構造下一個訓練集中,它的權重就被降低;相反,如果某個樣本點沒有被准確地分類,那么它的權重就得到提高。然后,權重更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。

3)將各個訓練得到的弱分類器組合成強分類器。各個弱分類器的訓練過程結束后,加大分類誤差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定作用,而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定作用。換言之,誤差率低的弱分類器在最終分類器中占的權重較大,否則較小。

6.模型算法

Cost-Sensitive 算法

  paper: The Foundations of Cost-Sensitive Learning

MetaCost算法

  

paper: https://homes.cs.washington.edu/~pedrod/papers/kdd99.pdf “MetaCost”
github: https://github.com/Treers/MetaCost “MetaCost-Python-Coding”

步驟為:

  1. 在訓練集中多次采樣,生成多個模型。

  2. 根據多個模型,得到訓練集中每條記錄屬於 每個類別的概率。

  3. 計算訓練集中每條記錄的屬於每個類的代價, 根據最小代價,修改類標簽。

  4. 訓練修改過的數據集,得到新的模型。

  5.  

     



Focal Loss

paper: Focal Loss for Dense Object Detection

Focal loss 是在標准交叉熵損失基礎上修改得到的,通過減少易分類樣本的權重,使得模型在訓練時更專注於難分類的樣本。

 

 

 7.數據增強

UDA (Unsupervised Data Augmentation)
paper: Unsupervised Data Augmentation For Consistency Training
github: Unsupervised Data Augmentation

一個半監督的學習方法,減少對標注數據的需求,增加對未標注數據的利用。

 

 

 

 

 

 

 

 

 

 

UDA使用的語言增強技術——Back-translation:回譯能夠在保存語義不變的情況下,生成多樣的句式。

 

 

那么如何添加噪聲ϵ ,來得到增強的數據集x ^ ?

文章給出3類noise:

valid noise: 可以保證原始未標注數據和擴展的未標注數據的預測具有一致性。
diverse noise: 在不更改標簽的情況下對輸入進行大量修改,增加樣本多樣性,而不是僅用高斯噪聲進行局部更改。
targeted inductive biases: 不同的任務需要不同的歸納偏差。


UDA論文中對圖像分類、文本分類任務做了實驗,分別用到不同的數據增強策略:

Image Classification: RandAugment
Text Classification: Back-translation回譯,保持語義,利用機器翻譯系統進行多語言互譯,增加句子多樣性。
Text Classification: Word replacing with TF-IDF ,回譯可以保證全局語義不變,但無法控制某個詞的保留。對於主題分類任務,某些關鍵詞在確定主題時具有更重要的信息。新的增強方法:用較低的TF-IDF分數替換無信息的單詞,同時保留較高的TF-IDF值的單詞。

EDA (Easy Data Augmentation)
國內中文EDA代碼實現:https://link.csdn.net/?target=https%3A%2F%2Fgithub.com%2Fzhanlaoban%2FEDA_NLP_for_Chinese
EDA paper:https://link.csdn.net/?target=https%3A%2F%2Farxiv.org%2Fabs%2F1901.11196
EDA GitHub:https://link.csdn.net/?target=https%3A%2F%2Fgithub.com%2Fjasonwei20%2Feda_nlp

EDA 的4個數據增強操作:

同義詞替換(Synonym Replacement, SR):從句子中隨機選取n個不屬於停用詞集的單詞,並隨機選擇其同義詞替換它們;
隨機插入(Random Insertion, RI):隨機的找出句中某個不屬於停用詞集的詞,並求出其隨機的同義詞,將該同義詞插入句子的一個隨機位置。重復n次;
隨機交換(Random Swap, RS):隨機的選擇句中兩個單詞並交換它們的位置。重復n次;
隨機刪除(Random Deletion, RD):以 p的概率,隨機的移除句中的每個單詞;
使用EDA需要注意:控制樣本數量,少量學習,不能擴充太多,因為EDA操作太過頻繁可能會改變語義,從而降低模型性能

 

二:新方法

1.雙鄰域:通過雙鄰域機制判斷查詢鄰域中少數類實例的稀疏性,並利用傾向權重機制為易誤判的少數類實例加權,由此來提高算法對少數類的敏感性,最后根據加權投票規則完成分類;

2.基於懲罰函數:基於不平衡度提出懲罰函數計算出最大的信息損失量,計算出最多消除多少實例。通過計算每個實例的貢獻度來決定消除那個實例。

3.在多分類問題中,可以通過把少數類結合,使他們在數量上與多數類相近,最后變成二分類問題。

4.嘗試一個新的角度理解問題:

  我們可以從不同於分類的角度去解決數據不均衡性問題,我們可以把那些小類的樣本作為異常點(outliers),因此該問題便轉化為異常點檢測(anomaly detection)與變化趨勢檢測問題(change detection)。 
  異常點檢測即是對那些罕見事件進行識別。如通過機器的部件的振動識別機器故障,又如通過系統調用序列識別惡意程序。這些事件相對於正常情況是很少見的。 
  變化趨勢檢測類似於異常點檢測,不同在於其通過檢測不尋常的變化趨勢來識別。如通過觀察用戶模式或銀行交易來檢測用戶行為的不尋常改變。 
  將小類樣本作為異常點這種思維的轉變,可以幫助考慮新的方法去分離或分類樣本。這兩種方法從不同的角度去思考,讓你嘗試新的方法去解決問題。

5.嘗試創新 
  仔細對你的問題進行分析與挖掘,是否可以將你的問題划分成多個更小的問題,而這些小問題更容易解決。你可以從這篇文章In classification, how do you handle an unbalanced training set?中得到靈感。例如: 

    • 將你的大類壓縮成小類;
    • 使用One Class分類器(將小類作為異常點);
    • 使用集成方式,訓練多個分類器,然后聯合這些分類器進行分類;

6.設超大類中樣本的個數是極小類中樣本個數的L倍,那么在隨機梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一個極小類中樣本進行訓練時,訓練L次。

7.將大類中樣本划分到L個聚類中,然后訓練L個分類器,每個分類器使用大類中的一個簇與所有的小類樣本進行訓練得到。最后對這L個分類器采取少數服從多數對未知類別數據進行分類,如果是連續值(預測),那么采用平均值。

8.設小類中有N個樣本。將大類聚類成N個簇,然后使用每個簇的中心組成大類中的N個樣本,加上小類中所有的樣本進行訓練

9.在最近的ICML論文中,表明增加數據量使得已知分布的訓練集的誤差增加了,即破壞了原有訓練集的分布,從而可以提高分類器的性能。這篇論文與類別不平衡問題不相關,因為它隱式地使用數學方式增加數據而使得數據集大小不變。但是,我認為破壞原有的分布是有益的

10.http://web.stanford.edu/~sidaw/cgi-bin/home/lib/exe/fetch.php?media=papers:fastdropout.pdf

 

三,相關文獻

論文

網頁

https://blog.csdn.net/u012744245/article/details/108602036?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-8-108602036.nonecase&utm_term=%E6%AD%A3%E4%BE%8B%E5%92%8C%E8%B4%9F%E4%BE%8B%E6%95%B0%E6%95%B0%E6%8D%AE%E9%9B%86%E7%9A%84%E4%BF%A1%E6%81%AF%E9%87%8F&spm=1000.2123.3001.4430

https://www.cnblogs.com/yuesi/articles/9236796.html

https://www.cnblogs.com/dyl222/p/11055756.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM