6-機器學習-樣本類別分佈不均衡處理之過抽樣和欠抽樣
阿新 • • 發佈:2020-07-27
總結
樣本類別分佈不均衡處理(處理過擬合和欠擬合問題)
- 過抽樣(上取樣):通過增加分類中少數類樣本的數量來實現樣本均衡
- 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