當我們處理機器學習分類時,我們會遇到很多問題。其中之一是類不平衡:一個類的樣本數量過多,而另一個類的樣本數量非常少。這個問題出現在許多研究領域,例如,當我們試圖診斷一種罕見的疾病或檢測欺詐交易時就會出現這個問題。在這篇文章中,我將介紹如何處理分類項目中的類不平衡問題。
通常,當我們的類比例低於10/90時,我們可以說我們面臨著類不平衡問題。在某些情況下,情況可能更嚴重。有一個分類項目,試圖預測在絲芙蘭銷售的哪一款美容產品贏得了Allure Beauty Award。在檢查這個機器學習數據後,你會發現有1920個產品沒有獲獎,只有81個獲獎。註:有更多的獲獎產品,但只有81個在絲芙蘭銷售。
傳統方法
為了創建一個二元分類模型,假定你採用一種簡單的方法:在沒有任何操作的情況下運行邏輯回歸。預期結果:模型執行的準確性為96%,但沒有召回率。這意味著,這種方法將所有未被充分代表的類視為背景噪音,或者簡單地說,只是假設所有的產品都沒獲獎,正確率為96%。
如果我們談論的是獲得獎項的美容產品,這還好,但如果我們試圖診斷一種致命疾病呢?我們需要消除type II error。
解決類不平衡問題有兩種著名的傳統方法:使用TOMEK links進行欠採樣和使用SMOTE進行過採樣。
在第一種情況中,我們檢測兩個類的實例之間的links,這兩個類彼此很接近。在項目中,可能有兩個非常相似的產品(相同的價格,相似的評級等),但其中一個獲獎了,另一個沒有獲獎。我們可以在這些實例之間創建一個link並刪除它們,儘可能地將這兩個類分隔開。
對於SMOTE(Synthetic Minority Oversampling Technique),我們採用不同的方法。我們不是減少數據點的數量,而是創建未充分表示的類的合成實例。同樣,在我的例子中,我們僅分析代表Allure獲勝者的價格,評級和其他預測指標,並使用這些特徵創建更多實例。
在執行項目時,我嘗試了這兩種方法,但是我建立的所有機器學習模型(邏輯回歸,Naive Bayes,XGBoost)的準確率均未超過78%,並且無法提高召回率。
解決方法
首先,我需要創建兩個data frames,對應獲獎和未獲獎
df_lose = df[df[『Allure』] == 0]df_win = df[df[『Allure』] == 1]
接下來,要確保我的欠採樣是無偏的,我們需要對未獲獎data frame(df_lose)進行shuffle:
df_lose = shuffle(df_lose)
接下來,我們需要截斷該data frame以匹配df_win的尺寸(請記住,我們只有81個獲獎者):
df_lose_81 = df_lose[:81]
最後,我們把它們連接在一起,然後再次shuffle
twodf = [df_win, df_lose_81]edf = pd.concat(twodf, ignore_index=True)edf = shuffle(edf)
現在,我們可以查看新數據框數據
最後,我們可以運行我們的機器學習分類模型。最好的模型是XGBoost,驗證準確度為96.97%,召回率為0.93。