數據預處理 | python 第三方庫 imblearn 處理樣本分布不均衡問題


說明:目前 只記錄了 過采樣 和 欠采樣 的代碼部分

 

1 樣本分布不均衡描述:

主要出現在與分類相關的建模問題上,不均衡指的是不同類別的樣本量差異非常大

樣本量差距過大會影響到建模結果

 

2 出現的場景:

異常檢測:如惡意刷單、黃牛,這些數據樣本所占的比例通常是整體樣本中很少的一部分

客戶流失:大型企業的流失客戶相對於整體客戶通常是少量的

偶發事件:個案較少,通常無法預判。如 由於某網絡大V無意中轉發了企業的一條趣味廣告,導致用戶流量明顯提升

低頻事件:預期或計划性事件,但是發生頻率非常低。如 “雙11”

 

3 處理方法:

3.1 抽樣:

過抽樣:

from imblearn.over_sampling import SMOTE

又稱上采樣(over-sampling),通過增加分類中少數類樣本的數量來實現樣本均衡

欠抽樣:

from imblearn.under_sampling import RandomUnderSampler

又稱下采樣(under-sampling),其通過減少分類中多數類樣本的數量來實現樣本均衡

 

注意 使用 imblearn 時 數據中不能有缺失值,否則會報錯

 

1 導入數據

import pandas as pd

# 導入數據文件
df = pd.read_table('data.txt', sep='\t')

 

 2 查看數據分布,發現分布不均衡

df.groupby('label').count()

 

 3 切片,分開 特征x 和 目標y

x, y = df.iloc[:,:-1], df.iloc[:,-1]

 

4 使用 SMOTE 進行過抽樣處理

# 導包
from imblearn.over_sampling import SMOTE
# 建立模型
smote_model = SMOTE()
# 進行過抽樣處理
x_smote, y_smote = smote_model.fit_sample(x, y)
# 將特征值和目標值組合成一個DataFrame
smote_df = pd.concat([x_smote,y_smote], axis=1)

  處理完成,查看分布情況

 

5 使用 RandomUnderSampler 方法進行欠抽樣處理

from imblearn.under_sampling import RandomUnderSampler
# 建立模型
under_model = RandomUnderSampler()
# 欠抽樣處理
x_under, y_under = under_model.fit_sample(x,y)
# 合並數據
under_df = pd.concat([x_under, y_under],axis=1)

  處理完成,查看分布情況

 

3.2 正負樣本的懲罰權重

在算法實現過程中,對於分類中不同樣本數量的類別分別賦予不同的權重,然后進行計算和建模。一般思路分類中的小樣本量類別權重高,大樣本量類別權重低。

 

3.3 組合/集成

每次生成訓練集時,使用所有分類中的小樣本量 及 大樣本量中隨機抽取的數據,思路類似於隨機森林。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM