1. 程式人生 > >處理不平衡資料

處理不平衡資料

  • 我們做分類演算法訓練時,如果訓練集裡的各個類別的樣本數量不是大約相同的比例,就需要處理樣本不平衡問題。也許你會說,不處理會怎麼樣呢?如果不處理,那麼擬合出來的模型對於訓練集中少樣本的類別泛化能力會很差。
  • 如何解決這個問題呢?一般是兩種方法:權重法或者取樣法。
  • 權重法是比較簡單的方法,我們可以對訓練集裡的每個類別加一個權重class weight。如果該類別的樣本數多,那麼它的權重就低,反之則權重就高。如果權重法做了以後發現預測效果還不好,可以考慮取樣法。
  • 取樣法常用的也有兩種思路,一種是對類別樣本數多的樣本做欠取樣, 比如訓練集裡A類別樣本佔90%,B類別樣本佔10%。那麼我們可以對A類的樣本欠取樣,直到欠取樣得到的A類樣本數和B類別現有樣本一致為止,這樣我們就只用欠取樣得到的A類樣本數和B類現有樣本一起做訓練集擬合模型。
  • 第二種思路是對類別樣本數少的樣本做過取樣, 還是上面的例子,我們對B類別的樣本做過取樣,直到過取樣得到的B類別樣本數加上B類別原來樣本一起和A類樣本數一致,最後再去擬合模型。
  • 上述兩種常用的取樣法很簡單,但是都有個問題,就是取樣後改變了訓練集的分佈,可能導致泛化能力差。所以有的演算法就通過其他方法來避免這個問題,比如SMOTE演算法通過人工合成的方法來生成少類別的樣本。方法也很簡單,對於某一個缺少樣本的類別,它會隨機找出幾個該類別的樣本,再找出最靠近這些樣本的若干個該類別樣本,組成一個候選合成集合,然後在這個集合中不停的選擇距離較近的兩個樣本,在這兩個樣本之間,比如中點,構造一個新的該類別樣本。舉個例子,比如該類別的候選合成集合有兩個樣本(x1,y),(x2,y),那麼SMOTE取樣後,可以得到一個新的訓練樣本((x1+x2)/2,y),通過這種方法,我們可以得到不改變訓練集分佈的新樣本,讓訓練集中各個類別的樣本數趨於平衡。