連結:https://www.zhihu.com/question/372186043
編輯:深度學習與計算機視覺
聲明:僅做學術分享,侵刪
假設10000個數據,有100個1,200個2,其餘全是0,這種數據如何建模,普通模型會傾向所有數據都標註成0。
batch抽樣學習,每次從數據中抽樣,比如每次抽32個數據訓練,16個0,8個1,8個2,丟到模型裡面訓練,這麼做可以嗎?
作者:予以初始
https://www.zhihu.com/question/372186043/answer/1393735908
1.問題定義
這是典型的數據類型不平衡問題。比如對於一個二分類任務,訓練集中類別為0的負樣本佔樣本總數的90%,而正樣本只佔10%。那麼這樣的訓練集有什麼弊端呢?如果類別不平衡的樣本直接丟給模型學習,那麼很顯然模型會在負樣本上的學習效果更好,因為模型『看到』的負樣本更多。舉個慄子,就像你如果花9天時間去學習數學,花一天時間去學習語文,不出意外你會在數學考試中表現更好。做過視頻或者廣告點擊預估比賽的小夥伴應該經常遇到這種問題,這類比賽的訓練集一般都是非常不平衡的,正樣本的比例通常不足10%。這裡我總結了一些在比賽中用過的一些行之有效的處理方法,下面為大家逐一介紹。
Tips:是不是類別平衡的訓練集就一定更好呢?這個不能保證,但對於大多數情況,類別平衡的數據對模型來說是更友好的,至少模型不會傾向於數量多的那一類別。2.解決方法
2.1 採樣
這是解決數據類別不平衡的最簡單、最暴力的方法。
如果負樣本太多,那就對負樣本進行
欠採樣,就是隨機的從負樣本中抽取一部分樣本,然後與正樣本合併成訓練集丟給模型訓練。這樣有個很明顯的弊端,就是會造成嚴重的信息損失,數據收集不易,你還要丟棄一部分,很顯然不合理。如果正樣本太少,那就對正樣本進行
過採樣,就是對正樣本進行複製,或者如果是NLP、CV任務,可以做一些數據增強,以此來增加正樣本的數量。但是對於一般的任務來說,簡單的對正樣本進行複製,以此來達到增加正樣本數量的目的,這樣會使模型在這正樣本上過擬合,因為模型『看到』太多次這樣的樣本。就像你如果複習同一道題太多次,答案都背住了,所以看到類似的題就直接寫答案,不會變通顯然是不對的。所以採樣的方法不是解決類別不平衡問題的權宜之計,
慎用。
上面介紹了對正樣本進行過採樣,會使模型過擬合的問題,SMOTE也是基於採樣的方法,但是SMOTE可以降低過擬合的風險。
過採樣是直接對樣本進行複製,導致訓練集重複樣本太多,而SMOTE則不是直接複製,而是生成與正樣本相似並且訓練集中沒有的樣本。具體做法:
首先隨機選取一個正樣本,然後用K近鄰選取一個與其最相似的樣本,取兩樣本的中值或者均值,作為新樣本。這樣生成的樣本可一定程度降低模型過擬合的風險 (仍然可能過擬合) 。
Tips:如果你對K近鄰有些陌生,可以參考我的這篇文章做個簡單的回顧。https://zhuanlan.zhihu.com/p/160800727
2.3 閾值調整
調整閾值也是比較簡單而且有效的方法,這也是我在做比賽時經常會用到的方法。
對於二分類任務來說,一般會以0.5作為閾值來劃分正負樣本(比如邏輯回歸),預測概率值大於0.5則判定為正樣本,反之為負樣本。對於類別不平衡的訓練集來說,這個閾值就不再合適了,因為當使用負樣本來更新模型權重時,權重的更新會使模型的輸出儘量偏向於0,如果負樣本太多,那麼負樣本對於模型權重的更新量就比較多,使得模型輸出接近0的概率就比較大,所以可以根據正負樣本所佔的比例來調整閾值。比如正樣本只佔10%,則可以將閾值調整為0.1,輸出概率大於0.1的則判定為正樣本,這樣可以很好的解決類別不平衡問題,調整閾值是個簡單且高效的方法。感謝評論區
饅頭對解決方法的補充:可以在計算每個樣本的loss時,通過為正樣本增加權重的方式,來優化樣本不平衡問題。該方法原理跟劃分閾值類似,正樣本對權重的更新會使模型輸出儘可能偏向於1,但是正樣本太少,所以一方面可以降低劃分為正樣本的閾值,另一方面則可以在計算loss時,增加正樣本權重,從而增大正樣本對模型參數的更新量,提高模型輸出為1的概率。模型融合不僅可以提升預測的準確性,其實也可以解決類別不平衡問題。比如對於正樣本(10%)、負樣本(90%)的訓練集,可以將負樣本均等拆分為9份(注意一定要同分布拆分),然後每一份都與正樣本組合成為一個小訓練集,得到9份類別平衡的數據。然後用9個模型分別去訓練(可以使用有差異性的模型, 使預測精度更高),然後可以對9個模型的預測結果加權累加,作為最終的輸出。最優的權重通常難以抉擇,可以使用一個LR將9個模型的輸出作為輸入,通過訓練讓模型自己學習每個模型對應的權重即可。通過模型融合就可以保證每個模型的訓練數據都是類別平衡的數據,並且還能提升預測的準確性,一舉兩得。
Tips:做一個小小的總結,方法一簡單粗暴,方法二複雜、收益低,方法三和四是我最常用到的兩種,簡單且高效。當你遇到類別不平衡的數據時,可以參照以上幾種方法進行嘗試,至於哪種方法更有效還得通過實踐來證明。作者:莫名
https://www.zhihu.com/question/372186043/answer/10434903911.構造數據集。比如用半監督或度量學習做篩選/輔助標籤,大概率會比簡單的按數量比例要好一些。2.設計loss /loss weight,注意 細粒度,優化內容其它方案比如數據合成,GAN生成新樣本,我們做過實驗,沒有明顯提高,或者和強數據增強的效果差不多,但是成本就很高啦;多模型在工業項目是不划算的/沒有產品競爭力的,單模型都得各種修剪。當然這有個前提,哪怕是一個
很小的任務,數據總量都得在百萬級。否則,您要試驗的方法可多得去了,而且並不能超過數據量上升帶來的收益。
作者:蘇冠旭https://www.zhihu.com/question/372186043/answer/1140392823針對樣本不均衡問題,我專門做過試驗。一句話概括:隨機森林、GBDT等集成學習方法能夠顯著提高F1,而上抽樣、下抽樣、SMOTE等方法,在集成學習面前基本沒用。
作者:打鐵燒磚
https://www.zhihu.com/question/372186043/answer/1502141503這是一個經常會在各類明星公司的AI,機器學習以及數據面試中出現的問題。很多答主都談了一些比較新的方法。而最基本的三種方法可以歸納如下(面試的一個比較基本的答案):1.欠採樣(under-sampling),去除一些反例。2.過採樣,up-samplinh增加一些正例。比如data augmentation等方法。很多答主提到的SMOTE就是這種方法的典型代表。3.第三種方法叫閾值移動(threshold-moving),不動原始數據集,對預測值進行一些調整,也就是對算法本身進行一些改動。這方面也有不少的一些算法。比如有改版的SVM以及ensemble learning。在現在的其他一些研究領域比如AI的公平性研究(比如避免在銀行貸款算法中出現根據膚色來決定是否貸款的情況),類似的改動算法本身的參數的思想也有很大應用。
作者:Ming
https://www.zhihu.com/question/372186043/answer/1182965574面試DS的職位的時候,被面試官問道。回答了上採樣下採樣之後,面試官追問,沒有回答的很好(掩面)。然後面試官的回答是,在業內裡面,假如遇到了這種太稀疏的情況,可以構建一個白噪聲的分布,比如說 ,然後加上原數據構建新的數據來讓整體的數據變得平衡。或者用別的標準來看模型的好壞,比如說F1-Score。
作者:Yiiiiiii
https://www.zhihu.com/question/372186043/answer/1149397361個人覺得,高維不平衡數據集,就機器學習方法來說,ensemble+集成學習是個不錯的方案。還有現成的庫可以用。我在跑一個不平衡數據集的時候,用的是imblearn的balancedbaggingclassifier(),和balancedRandomforest()效果相當好。對於一個分布不明的數據集,建議不要過採樣。而ensemble方法可以保證欠採樣也不丟失信息。
作者:Xiecheng
https://www.zhihu.com/question/372186043/answer/1056969532如果是binary問題,需不需要做再平衡,取決於兩點,1.你的建模或者實驗目的;2.你的檢驗結果。不同的模型,對於非平衡標籤的容忍度是不一樣的。多做幾輪實驗,看下under sampling, over sampling 或者smote這類擬合仿真數據的方法下,檢驗結果的好壞,這個沒有統一的標準。重抽樣不是必須的。如果是multiclass的問題,我會建議必須做再平衡。因為這類問題通常需要模型回答正確分到哪個類。不做平衡容易導致結果傾斜到一個類上。Binary有一些不同。除了回答正確分類之外,也會經常用輸出的概率解決排序問題。
作者:adam86546853
https://www.zhihu.com/question/372186043/answer/1152217557目前工業界的角度來看,保留數據的原始分布是最可靠的,大廠基本都是擬合原始分布,一般不太會去採樣。自己原先也做過相關採樣實驗,會有信息損失,auc在千分點損失在實際線上效果都是可反映的。由於樣本多,所以一般是加大模型複雜度,nn模型增大特徵規模,儘量擬合真實分布。當然也有各種採樣理論以及修正,如果不計較精度,可以權衡準度和樣本規模。
作者:磐石
https://www.zhihu.com/question/372186043/answer/1432241043樓主的想法實際可以嘗試看看效果。技術層面很多樓主回答很詳細了,我就不在說了。從學習的角度來說,如果比較少的樣本存在這個標籤對應的模式,那麼使用一些學習技術很有意義。如果少量的樣本中無法學習得到這個標籤的模式,那麼意義也不大,因為可能網絡擬合的只是記憶樣本,無法學習到對應的範式,這樣泛化效果也不會好。如果看到這裡,說明你喜歡這篇文章,請轉發、點讚。微信搜索「uncle_pn」,歡迎添加小編微信「 mthler」,每日朋友圈更新一篇高質量博文。