成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Python處理不平衡數(shù)據(jù)集

開發(fā) 后端
所謂的數(shù)據(jù)不平衡(imbalanced data)是指數(shù)據(jù)集中各個類別的數(shù)量分布不均衡;不平衡數(shù)據(jù)在現(xiàn)實任務中十分的常見

[[373489]]

1. 什么是數(shù)據(jù)不平衡

所謂的數(shù)據(jù)不平衡(imbalanced data)是指數(shù)據(jù)集中各個類別的數(shù)量分布不均衡;不平衡數(shù)據(jù)在現(xiàn)實任務中十分的常見。如

  •  信用卡欺詐數(shù)據(jù):99%都是正常的數(shù)據(jù), 1%是欺詐數(shù)據(jù)
  •  貸款逾期數(shù)據(jù)

不平衡數(shù)據(jù)一般是由于數(shù)據(jù)產(chǎn)生的原因?qū)е碌模悇e少的樣本通常是發(fā)生的頻率低,需要很長的周期進行采集。

在機器學習任務(如分類問題)中,不平衡數(shù)據(jù)會導致訓練的模型預測的結果會偏向于樣本數(shù)量多的類別,這個時候除了要選擇合適的評估指標外,想要提升模型的性能,就要對數(shù)據(jù)和模型做一些預處理。

處理數(shù)據(jù)不平衡的主要方法:

  •  欠采樣
  •  過采樣
  •  綜合采樣
  •  模型集成
  •  調(diào)整類別權重或者樣本權重

2. 數(shù)據(jù)不平衡處理方法

imbalanced-learn庫提供了許多不平衡數(shù)據(jù)處理的方法,本文的例子都以imbalanced-learn庫來實現(xiàn)。

  1. pip install -U imbalanced-learn  

https://github.com/scikit-learn-contrib/imbalanced-learn

本文例子的數(shù)據(jù)來自進行中的比賽山東省第二屆數(shù)據(jù)應用創(chuàng)新創(chuàng)業(yè)大賽-日照分賽場-公積金貸款逾期預測

先來看下數(shù)據(jù) 

  1. import pandas as pd  
  2. train_data = './data/train.csv'  
  3. test_data = './data/test.csv'  
  4. train_df = pd.read_csv(train_data)  
  5. test_df = pd.read_csv(test_data)  
  6. print(train_df.groupby(['label']).size())  
  7. # label為是否違約, 1為違約, 0為非違約  
  8. #     label  
  9. # 0    37243  
  10. # 1     2757 

2.1 欠采樣

所謂欠采樣,就是將數(shù)量多類別(記為majority)的樣本進行抽樣,使之數(shù)量與數(shù)量少的類別(minority)的數(shù)量相當,以此達到數(shù)量的平衡。

由于欠采樣是丟失了一部分數(shù)據(jù),不可避免的使得數(shù)量多類別樣本的分布發(fā)生了變化(方差變大)。好的欠采樣策略應該盡可能保持原有數(shù)據(jù)分布。

欠采樣是刪除majority的樣本,那哪些樣本可以刪除呢?

  •  一種是overlapping的數(shù)據(jù),就是多余的數(shù)據(jù)
  •  一種是干擾的數(shù)據(jù),干擾minority的分布

基于此,有兩種思路來欠采樣

  • 邊界相鄰匹配,考慮在近鄰空間內(nèi)刪除majority樣本,方法如TomekLinks, NearMiss

下面這張圖,展示6NN(6個最近鄰居)

這里重點講下TomekLinks, TomekLinks方法簡單的說:對每一個minority樣本找1NN(最近的鄰居),如果最近的鄰居是majority, 就形成一個tome-links,該方法人為這個majority是干擾的,將它刪除。

 

  1. from imblearn.under_sampling import TomekLinks  
  2. X_train = train_df.drop(['id', 'type'], axis=1 
  3. y = train_df['label']  
  4. tl = TomekLinks()  
  5. X_us, y_us = tl.fit_sample(X_train, y)  
  6. print(X_us.groupby(['label']).size())  
  7. # label  
  8. # 0    36069  
  9. # 1     2757 

從上可知, 有1174個tomek-link被刪除,好像刪除還不夠多,可以測試下是否對分類結果有幫助。需要注意的因為需要計算最近鄰,所以樣本屬性必須數(shù)值屬性,或者可以轉(zhuǎn)化為數(shù)值屬性。

  •  聚類

          這類方法通過多個聚類,把原始樣本劃分成多個聚類簇,然后用每個聚類簇的中心來代替這個聚類簇的特性,完成采樣的目的。可知,這種采樣的樣本不是來自原始樣本集,而是聚類生成              的。   

  1. from imblearn.under_sampling import ClusterCentroids   
  2.     cc = ClusterCentroids(random_state=42 
  3.     X_res, y_res = cc.fit_resample(X_train, y)  
  4.     X_res.groupby(['label']).size()  
  5.     # label  
  6.     # 0    2757  
  7.     # 1    2757 

im-balance提供的欠采樣的方法如下:

  •  Random majority under-sampling with replacement
  •  Extraction of majority-minority Tomek links
  •  Under-sampling with Cluster Centroids
  •  NearMiss-(1 & 2 & 3)
  •  Condensed Nearest Neighbour
  •  One-Sided Selection
  •  Neighboorhood Cleaning Rule
  •  Edited Nearest Neighbours
  •  Instance Hardness Threshold
  •  Repeated Edited Nearest Neighbours
  •  AllKNN

2.2 過采樣

所謂過采樣,就是將數(shù)量少的類別(minority)的樣本進行copy,使之數(shù)量與數(shù)量多的類別(majortity)的數(shù)量相當,以此達到數(shù)量的平衡。由于復制了多份minoruty樣本,過采樣會改變minority方差。

過采樣一種簡單的方式是隨機copy minority的樣本;另外一種是根據(jù)現(xiàn)有樣本生成人造樣本。這里介紹人造樣本的經(jīng)典算法SMOTE(Synthetic Minority Over-sampling Technique)。

SMOTE基于minority樣本相似的特征空間構造新的人工樣本。步驟如下:

  •  選擇一個minority樣本,計算其KNN鄰居
  •  在K個鄰居中,隨機選擇一個近鄰
  •  修改某一個特征,偏移一定的大小:偏移的大小為該minority樣本與該近鄰差距乘以一個小的隨機比率(0, 1), 就此生成新樣本

 

  1. from imblearn.over_sampling import SMOTE  
  2. smote = SMOTE(k_neighbors=5random_state=42 
  3. X_res, y_res = smote.fit_resample(X_train, y)  
  4. X_res.groupby(['label']).size()  
  5. # label  
  6. # 0    37243  
  7. # 1    37243 

對于SMOTE方法,對每一個minority都會構造新樣本。但是并不總是這樣的,考慮下面A,B,C三個點。從數(shù)據(jù)分布來看,C點很可能是一個異常點(Noise),B點是正常分布的點(SAFE),而A點分布在邊界位置(DANGER);直觀上,對于C點我們不應該去構造新樣本,對B點,構造新樣本不會豐富minority類別的分布。只有A點,如果構造新樣本能夠使得A點從(DANGER)到(SAFE),加強minority類別的分類邊界。這個就是Borderline-SMOTE

 

  1. from imblearn.over_sampling import BorderlineSMOTE  
  2. bsmote = BorderlineSMOTE(k_neighbors=5random_state=42 
  3. X_res, y_res = bsmote.fit_resample(X_train, y)  
  4. X_res.groupby(['label']).size()  
  5. # label  
  6. # 0    37243  
  7. # 1    37243 

ADASYN方法從保持樣本分布的角度來確定生成數(shù)據(jù),生成數(shù)據(jù)的方式和SMOTE是一樣的,不同在于每個minortiy樣本生成樣本的數(shù)量不同。

  •  先確定要生成樣本的數(shù)量 beta為[0, 1]   

  •  對每個每個minortiy樣本,確定有它生成樣本的比例。先找出K最近鄰,計算K最近鄰中屬于majority的樣本比例(即分子),Z是歸一化因子,保證所有的minortiry的比例和為1,可以認為是所有分子的和。  

  •  計算每個minortiy生成新樣本的數(shù)量

  •  按照SMOTE方式生成樣本 
  1. from imblearn.over_sampling import ADASYN   
  2. adasyn = ADASYN(n_neighbors=5random_state=42 
  3. X_res, y_res = adasyn.fit_resample(X_train, y)  
  4. X_res.groupby(['label']).size()  
  5. # label  
  6. # 0    37243  
  7. # 1    36690 

im-balance提供的過采樣的方法如下(包括SMOTE算法的變種):

  •  Random minority over-sampling with replacement
  •  SMOTE - Synthetic Minority Over-sampling Technique
  •  SMOTENC - SMOTE for Nominal Continuous
  •  bSMOTE(1 & 2) - Borderline SMOTE of types 1 and 2
  •  SVM SMOTE - Support Vectors SMOTE
  •  ADASYN - Adaptive synthetic sampling approach for imbalanced learning
  •  KMeans-SMOTE
  •  ROSE - Random OverSampling Examples

2.3 綜合采樣

過采樣是針對minority樣本,欠采樣是針對majority樣本;而綜合采樣是既對minority樣本,又對majority樣本,同時進行操作的方法。主要有SMOTE+Tomek-links和SMOTE+Edited Nearest Neighbours。

綜合采樣的方法,是先進行過采樣,在進行欠采樣。 

  1. from imblearn.combine import SMOTETomek  
  2. smote_tomek = SMOTETomek(random_state=0 
  3. X_res, y_res = smote_tomek.fit_sample(X_train, y)  
  4. X_res.groupby(['label']).size()  
  5. # label  
  6. # 0    36260  
  7. # 1    36260 

2.4 模型集成

這里的模型集成主要體現(xiàn)在數(shù)據(jù)上,即用眾多平衡的數(shù)據(jù)集(majortiry的樣本進行欠采樣加上minority樣本)訓練多個模型,然后進行集成。imblearn.ensemble提供幾種常見的模型集成算法,如BalancedRandomForestClassifier 

  1. from imblearn.ensemble import BalancedRandomForestClassifier  
  2. from sklearn.datasets import make_classification  
  3. X, y = make_classification(n_samples=1000n_classes=3 
  4.                            n_informative=4weights=[0.2, 0.3, 0.5],  
  5.                            random_state=0 
  6. clf = BalancedRandomForestClassifier(max_depth=2random_state=0 
  7. clf.fit(X, y)    
  8. print(clf.feature_importances_)    
  9. print(clf.predict([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
  10.                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])) 

im-balance提供的模型集成的方法如下

  •  Easy Ensemble classifier
  •  Balanced Random Forest
  •  Balanced Bagging
  •  RUSBoost

2.5 調(diào)整類別權重或者樣本權重

對于很多用梯度下降方法來學習(使得某個損失Loss最小)的機器學習的方法,可以通過調(diào)整類別權重或樣本權重的方式,來一定程度上平衡不平衡數(shù)據(jù)。如gbdt模型lightgbm 中 class_weight 

  1. import lightgbm as lgb  
  2. clf = lgb.LGBMRegressor(num_leaves=31,   
  3.                         min_child_samplesnp.random.randint(20,25),  
  4.                         max_depth=25 
  5.                         learning_rate=0.1,   
  6.                         class_weight={0:1, 1:10},  
  7.                         n_estimators=500,   
  8.                         n_jobs=30

3. 總結

本文分享了常見的幾種處理不平衡數(shù)據(jù)集的方法,并且提供imbalanced-learn的簡單例子。總結如下:

  •  欠采樣: 減少majoritry樣本
  •  過采樣:增加minority樣本
  •  綜合采樣:先過采樣,在欠采樣
  •  模型集成:制造平衡數(shù)據(jù)(majoritry樣本欠采樣+minority樣本),多次不同的欠采樣,訓練不同的模型,然后融合
  •  不管是欠采樣和過采樣,都一定程度的改變了原始數(shù)據(jù)的分布,可能造成模型過擬合。需要去嘗試哪種方法,符合實際的數(shù)據(jù)分布。當然不一定有效果,去勇敢嘗試吧 just do it! 

 

責任編輯:龐桂玉 來源: Python中文社區(qū) (ID:python-china)
相關推薦

2016-12-13 11:48:05

數(shù)據(jù)處理不平衡數(shù)據(jù)

2023-09-29 22:51:22

數(shù)據(jù)不平衡Python機器學習

2018-04-20 11:33:22

不平衡數(shù)據(jù)數(shù)據(jù)集模型

2019-02-25 08:35:22

機器學習數(shù)據(jù)模型

2018-09-11 13:47:35

數(shù)據(jù)不平衡數(shù)據(jù)分布數(shù)據(jù)集

2024-10-18 07:10:43

2023-12-26 15:32:25

不平衡數(shù)據(jù)過采樣機器學習

2016-09-07 13:26:25

R語言不平衡數(shù)據(jù)

2020-10-06 10:44:16

機器學習不平衡數(shù)據(jù)算法

2017-03-28 09:40:23

機器學習數(shù)據(jù)不平衡

2018-06-11 16:20:22

數(shù)據(jù)不平衡數(shù)據(jù)集算法

2019-03-27 08:51:38

機器學習類失衡算法

2017-06-16 22:14:45

機器學習數(shù)據(jù)不平衡

2021-06-06 22:41:30

人才技術預測不平衡

2022-05-06 09:48:56

機器學習樣本不平衡

2017-03-20 09:25:10

機器學習采樣數(shù)據(jù)合成

2025-01-20 09:00:00

2020-09-21 09:02:56

AI機器學習類不平衡

2015-01-22 10:13:33

App StoreApp審核

2024-04-01 08:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲品质自拍视频网站 | 亚洲一区二区三区免费在线观看 | 欧美国产91 | 亚洲综合首页 | 欧美日韩国产精品一区 | 亚洲精品电影网在线观看 | 黄色片视频网站 | 国产福利在线视频 | 男人天堂99 | 日本电影一区二区 | 国产成人免费视频 | 在线视频国产一区 | 久久综合一区 | 欧美一级大片 | av网址在线 | 精品成人免费视频 | 亚洲国产激情 | 日韩在线不卡 | 丝袜美腿一区 | 欧美 日韩 国产 一区 | 九九av| 亚洲精品成人av久久 | 午夜一级黄色片 | 国产亚洲精品美女久久久久久久久久 | 色婷婷综合久久久中字幕精品久久 | 天天色天天射天天干 | 亚洲精品一区二区在线 | 久久国产区| 日韩视频专区 | 中文字幕在线看 | 国产传媒| av在线成人| 一级黄a视频 | 97久久久久久久久 | 一区二区免费高清视频 | 91久久久久久久久久久 | 97免费视频在线观看 | caoporn视频在线 | 亚洲精品久久久久久久久久久 | 久久大香 | 欧美三级在线 |