###### tags: `Data Processing` `Metric` # Imbalanced Data [imbalanced-learn](https://imbalanced-learn.readthedocs.io/en/stable/install.html) :::info * 問題根據難度從小到大排個序:<font color=red>大數據+分佈均衡<大數據+分佈不均衡<小數據+數據均衡<小數據+數據不均衡</font> * 如何解決二分類中正負樣本差兩個及以上數量級情況下的數據不平衡問題。(數量級即$10^n$,例如說兩數相差三個數量級,其實就是說一個數比另一個大 1000 倍。) * 訓練數據中每個類別有5000個以上樣本,數據量是足夠的,正負樣本差一個數量級以內是可以接受的,不太需要考慮數據不平衡問題(完全是經驗,沒有理論依據,僅供參考) ::: ## 解決方法 1. 獲取更多數據: 若數據具備時間性,則每一時期可能會有不同的趨勢,所以需要收集各時期的資料共同訓練。 2. 更換評估方法: 通常會用accuracy或cost評估模型,但是在不均衡數據的情況下,高準確率和低誤差變得沒那麼重要。因此,可以改用precision、recall、f1做為評估方法。 :::info **Accuracy Paradox** 在不均衡數據的情況下,Accuracy無法很好的體現TN=FN=0這種異常現象,也就是無法發現分類器並未打算預測negative。 **Solution** - Precision越大,返回的結果質量越高 - Recall越大,返回相關的數量越多 - F1綜合考量Precision和Recall,但若還是無法解決skewed distribution的問題。這時,就改用Matthews Correlation Coefficient,其本質上是一個觀察值和預測值之間的相關係數! ::: 3. 採樣: 3-1: 上採樣(Oversampling): 複製少數部分的樣本。缺點是數據會反覆出現某些樣本,所以模型會有一定的overfitting。因此,可以在新數據中隨機加入雜訊。 3-2: 下採樣(Undersampling): 刪除一些多數部分的樣本。缺點是訓練資料變少,所以模型只學到總體模式的一部分。因此,如何減少資訊的損失呢? - EasyEnsemble,利用模型融合的方法(Ensemble):多次下採樣(放回採樣,這樣產生的訓練集才相互獨立)產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。 - BalanceCascade,利用增量訓練的思想(Boosting):先通過一次下採樣產生訓練集,訓練一個分類器,對於那些分類正確的大眾樣本不放回,然後對這個更小的大眾樣本下採樣產生訓練集,訓練第二個分類器,以此類推,最終組合所有分類器的結果得到最終結果。 - 利用KNN試圖挑選那些最具代表性的大眾樣本,叫做NearMiss,這類方法計算量很大,感興趣的可以參考“Learning from Imbalanced Data”這篇綜述的3.2.1節。 4. 數據合成: 利用已有樣本生成更多樣本,這類方法在小數據場景下有很多成功案例,比如醫學圖像分析等。其中最常見的一種方法叫做SMOTE,它利用小眾樣本在特徵空間的相似性來生成新樣本。 5. 加權: 例如對不同類別分錯的cost不同 6. 一分類: 對於正負樣本極不平衡的場景,我們可以換一個完全不同的角度來看待問題:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在於捕捉類間的差別,而是為其中一類進行建模,經典的工作包括One-class SVM等。 7. 使用其他機器學習方法: Neural network不適用於不均衡數據。而decision tree就不會受到不均衡數據的影響。 8. 修改演算法  例如如果你用的是Sigmoid激勵函數,他會有一個預測門檻, 一般如果輸出結果落在門檻的這一段,預測結果為梨, 如果落在這一段, 預測結果為蘋果, 不過因為現在的梨是多數派, 我們得調整一下門檻的位置, 使得門檻偏向蘋果這邊, 只有很自信的時候, 模型才會預測這是蘋果. 讓機器學習,學習到更好的效果 ## 如何選擇 * 在正負樣本都非常之少的情況下,應該採用數據合成的方式。 * 在負樣本足夠多,正樣本非常之少且比例及其懸殊的情況下,應該考慮一分類方法。 * 在正負樣本都足夠多且比例不是特別懸殊的情況下,應該考慮採樣或者加權的方法。 ## 參考 [机器学习中的Evaluation Metrics](https://blog.csdn.net/aws3217150/article/details/50479457) [周莫煩](https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-07-imbalanced-data/) [數據不平衡](https://bigdatafinance.tw/index.php/tech/data-processing/353-2017-03-28-11-36-54) [演算法介紹](https://kknews.cc/zh-tw/tech/ylapn.html) [SVM-SMOTE實作](https://github.com/softnshare/datanmachlearn/issues/9)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up