1. 程式人生 > 實用技巧 >6-機器學習-樣本類別分佈不均衡處理之過抽樣和欠抽樣

6-機器學習-樣本類別分佈不均衡處理之過抽樣和欠抽樣

總結

樣本類別分佈不均衡處理(處理過擬合和欠擬合問題)

  • 過抽樣(上取樣):通過增加分類中少數類樣本的數量來實現樣本均衡
    • from imblearn.over_sampling import SMOTE
  • 欠抽樣(下采樣):通過減少分類中多數類樣本的數量來實現樣本均衡 (可能造成樣本資料大量丟失)
    • from imblearn.under_sampling import RandomUnderSampler 

樣本類別分佈不均衡處理

什麼是樣本類別分佈不均衡

  • 舉例說明,在一組樣本中不同類別的樣本量差異非常大,比如擁有1000條資料樣本的資料集中,有一類樣本的分類只佔有10條,此時屬於嚴重的資料樣本分佈不均衡。

樣本類別分佈不均衡導致的危害

  • 樣本類別不均衡將導致樣本量少的分類所包含的特徵過少,並很難從中提取規律;即使得到分類模型,也容易產生過度依賴與有限的資料樣本而導致過擬合問題,當模型應用到新的資料上時,模型的準確性會很差。
  • 解決方法:
    • 通過過抽樣和欠抽樣解決樣本不均衡
      • 也可以叫做上取樣,和下采樣

過抽樣(over-sampling)

  • from imblearn.over_sampling import SMOTE
  • 通過增加分類中少數類樣本的數量來實現樣本均衡,比較好的方法有SMOTE演算法。
  • SMOTE演算法原理介紹:
    • 簡單來說smote演算法的思想是合成新的少數類樣本,合成的策略是對每個少數類樣本a,從它的最近鄰中隨機選一個樣本b,然後在a、b之間的連線上隨機選一點作為新合成的少數類樣本。
    • 引數:k_neighbors
      • 找出類別少的樣本點周圍最近的k個鄰居
  • 環境安裝:
    • pip install imblearn
# 資料來源生成
import pandas as pd
import numpy as np
x = np.random.randint(0,100,size=(100,3))
y = pd.Series(data=np.random.randint(0,1,size=(95,)))
y = y.append(pd.Series(data=[1,1,1,1,1]),ignore_index=False).values
y = y.reshape((-1,1))
all_data_np 
= np.concatenate((x,y),axis=1) np.random.shuffle(all_data_np) df = pd.DataFrame(all_data_np) df.head() df.shape # (100, 4) df[3].value_counts() # 樣本分類不均衡 0 95 1 5 Name: 3, dtype: int64 X = df[[0,1,2]] y = df[3] from imblearn.over_sampling import SMOTE s = SMOTE(k_neighbors=3) feature,target = s.fit_sample(X,y) # 返回一個元組 feature.shape # 原來100行增加到190 # (190, 3) target.shape # (190,) target.value_counts() 1 95 0 95 Name: 3, dtype: int64

欠抽樣(under-sampling)

  通過減少分類中多數類樣本的數量來實現樣本均衡(可能造成樣本資料大量丟失)

  • from imblearn.under_sampling import RandomUnderSampler
from imblearn.under_sampling import RandomUnderSampler
r = RandomUnderSampler()  # 沒有那個n_neighbors引數

a,b = r.fit_sample(X,y)

a.shape  # (10, 3)
b.shape  # (10,)

b.value_counts()
1    5
0    5
Name: 3, dtype: int64