亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年01月04日 11:37:28   作者:wedo實驗君  
這篇文章主要介紹了如何用 Python 處理不平衡數(shù)據(jù)集,幫助大家更好的利用python進行數(shù)據(jù)分析,感興趣的朋友可以了解下

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

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

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

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

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

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

  • 欠采樣
  • 過采樣
  • 綜合采樣
  • 模型集成

調(diào)整類別權(quán)重或者樣本權(quán)重

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

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

pip install -U imbalanced-learn 

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

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

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

import pandas as pd
train_data = './data/train.csv'
test_data = './data/test.csv'
train_df = pd.read_csv(train_data)
test_df = pd.read_csv(test_data)

print(train_df.groupby(['label']).size())
# label為是否違約, 1為違約, 0為非違約
#     label
# 0    37243
# 1     2757

2.1 欠采樣

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

由于欠采樣是丟失了一部分數(shù)據(jù),不可避免的使得數(shù)量多類別樣本的分布發(fā)生了變化(方差變大)。好的欠采樣策略應(yīng)該盡可能保持原有數(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是干擾的,將它刪除。

from imblearn.under_sampling import TomekLinks

X_train = train_df.drop(['id', 'type'], axis=1)
y = train_df['label']
tl = TomekLinks()
X_us, y_us = tl.fit_sample(X_train, y)
print(X_us.groupby(['label']).size())
# label
# 0    36069
# 1     2757

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

  • 聚類

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

from imblearn.under_sampling import ClusterCentroids 

cc = ClusterCentroids(random_state=42)
X_res, y_res = cc.fit_resample(X_train, y)
X_res.groupby(['label']).size()
# label
# 0    2757
# 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,使之?dāng)?shù)量與數(shù)量多的類別(majortity)的數(shù)量相當(dāng),以此達到數(shù)量的平衡。由于復(fù)制了多份minoruty樣本,過采樣會改變minority方差。

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

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

  • 選擇一個minority樣本,計算其KNN鄰居
  • 在K個鄰居中,隨機選擇一個近鄰
  • 修改某一個特征,偏移一定的大?。浩频拇笮樵搈inority樣本與該近鄰差距乘以一個小的隨機比率(0, 1), 就此生成新樣本

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

對于SMOTE方法,對每一個minority都會構(gòu)造新樣本。但是并不總是這樣的,考慮下面A,B,C三個點。從數(shù)據(jù)分布來看,C點很可能是一個異常點(Noise),B點是正常分布的點(SAFE),而A點分布在邊界位置(DANGER);

直觀上,對于C點我們不應(yīng)該去構(gòu)造新樣本,對B點,構(gòu)造新樣本不會豐富minority類別的分布。只有A點,如果構(gòu)造新樣本能夠使得A點從(DANGER)到(SAFE),加強minority類別的分類邊界。這個就是Borderline-SMOTE

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

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

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

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

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

  • 按照SMOTE方式生成樣本
from imblearn.over_sampling import ADASYN 
adasyn = ADASYN(n_neighbors=5, random_state=42)
X_res, y_res = adasyn.fit_resample(X_train, y)
X_res.groupby(['label']).size()

# label
# 0    37243
# 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。

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

from imblearn.combine import SMOTETomek

smote_tomek = SMOTETomek(random_state=0)
X_res, y_res = smote_tomek.fit_sample(X_train, y)
X_res.groupby(['label']).size()
# label
# 0    36260
# 1    36260

2.4 模型集成

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

from imblearn.ensemble import BalancedRandomForestClassifier
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_classes=3,
                           n_informative=4, weights=[0.2, 0.3, 0.5],
                           random_state=0)
clf = BalancedRandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X, y)  

print(clf.feature_importances_)  
print(clf.predict([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    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)整類別權(quán)重或者樣本權(quán)重

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

import lightgbm as lgb
clf = lgb.LGBMRegressor(num_leaves=31, 
                        min_child_samples= np.random.randint(20,25),
                        max_depth=25,
                        learning_rate=0.1, 
                        class_weight={0:1, 1:10},
                        n_estimators=500, 
                        n_jobs=30)

3. 總結(jié)

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

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

4. 參考資料

  • Learning from Imbalanced Data
  • Two Modifications of CNN(Tomek links,CNN乍一看還以為卷積神經(jīng)網(wǎng)絡(luò),其實是condensed nearest-neighbor)
  • imbalanced-learn API:https://imbalanced-learn.org/stable/

以上就是如何用 Python 處理不平衡數(shù)據(jù)集的詳細內(nèi)容,更多關(guān)于Python 處理不平衡數(shù)據(jù)集的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python讀取hdfs上的parquet文件方式

    python讀取hdfs上的parquet文件方式

    這篇文章主要介紹了python讀取hdfs上的parquet文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 在Python 字典中一鍵對應(yīng)多個值的實例

    在Python 字典中一鍵對應(yīng)多個值的實例

    今天小編就為大家分享一篇在Python 字典中一鍵對應(yīng)多個值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python函數(shù)sort()與sorted()的區(qū)別及key=lambda?x:x[]的理解

    Python函數(shù)sort()與sorted()的區(qū)別及key=lambda?x:x[]的理解

    這篇文章主要介紹了Python函數(shù)sort()與sorted()的區(qū)別及key=lambda?x:x[]的理解方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python自動打印被調(diào)用函數(shù)變量名及對應(yīng)值?

    Python自動打印被調(diào)用函數(shù)變量名及對應(yīng)值?

    這篇文章主要介紹了Python自動打印被調(diào)用函數(shù)的變量名及對應(yīng)的值,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價,需要的朋友可以參考一下?
    2022-07-07
  • Python3.6基于正則實現(xiàn)的計算器示例【無優(yōu)化簡單注釋版】

    Python3.6基于正則實現(xiàn)的計算器示例【無優(yōu)化簡單注釋版】

    這篇文章主要介紹了Python3.6基于正則實現(xiàn)的計算器,涉及Python基于正則表達式的算術(shù)式遍歷、查找及數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實例教程

    Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實例教程

    wxPython是一款集成了Python的圖形化類庫的工具,而py2exe是一款將Python程序轉(zhuǎn)換為exe可執(zhí)行文件的程序,二者搭配可以輕松地在Windows中創(chuàng)建圖形化程序,這里我們就來學(xué)習(xí)Windows中使用wxPython和py2exe開發(fā)Python的GUI程序的實例教程:
    2016-07-07
  • 詳解pygame中Rect對象

    詳解pygame中Rect對象

    Rect是pygame中的一個創(chuàng)建矩形的對象,它包含一些屬性主要是兩塊:坐標(biāo)和長寬,Pygame?通過?Rect?對象存儲和操作矩形區(qū)域,這篇文章主要介紹了pygame中Rect對象,需要的朋友可以參考下
    2022-07-07
  • 使用Python進行數(shù)據(jù)可視化實現(xiàn)引人注目的視覺效果

    使用Python進行數(shù)據(jù)可視化實現(xiàn)引人注目的視覺效果

    這篇文章主要介紹了使用Python進行數(shù)據(jù)可視化實現(xiàn)引人注目的視覺效果,您將了解基本的數(shù)據(jù)可視化概念,以及如何創(chuàng)建各種引人注目的圖表和圖形,從而更好地理解和呈現(xiàn)數(shù)據(jù)
    2023-04-04
  • Python爬取qq music中的音樂url及批量下載

    Python爬取qq music中的音樂url及批量下載

    這篇文章主要給大家介紹了利用Python爬取qq music中的音樂url及實現(xiàn)批量下載的相關(guān)資料,文中給出了詳細的介紹和示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Python新手最容易踩的坑及避坑指南

    Python新手最容易踩的坑及避坑指南

    學(xué)習(xí)Python時新手可能會遇到縮進錯誤、忘記引入模塊、使用未定義的變量、變量作用域理解不當(dāng)、字符串格式化錯誤等問題,本文詳細介紹了這些常見陷阱及其解決方案,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10

最新評論