<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6114字,需瀏覽 13分鐘

           ·

          2021-01-06 19:53

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

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

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

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

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

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

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

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

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

          pip?install?-U?imbalanced-learn?

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

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

          先來(lái)看下數(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)的樣本進(jìn)行抽樣,使之?dāng)?shù)量與數(shù)量少的類別(minority)的數(shù)量相當(dāng),以此達(dá)到數(shù)量的平衡。

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

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

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

          基于此,有兩種思路來(lái)欠采樣

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

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

          這里重點(diǎn)講下TomekLinks, TomekLinks方法簡(jiǎn)單的說(shuō):對(duì)每一個(gè)minority樣本找1NN(最近的鄰居),如果最近的鄰居是majority, 就形成一個(gè)tome-links,該方法人為這個(gè)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個(gè)tomek-link被刪除,好像刪除還不夠多,可以測(cè)試下是否對(duì)分類結(jié)果有幫助。需要注意的因?yàn)樾枰?jì)算最近鄰,所以樣本屬性必須數(shù)值屬性,或者可以轉(zhuǎn)化為數(shù)值屬性。

          • 聚類

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

            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 過(guò)采樣

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

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

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

          • 選擇一個(gè)minority樣本,計(jì)算其KNN鄰居
          • 在K個(gè)鄰居中,隨機(jī)選擇一個(gè)近鄰
          • 修改某一個(gè)特征,偏移一定的大?。浩频拇笮樵搈inority樣本與該近鄰差距乘以一個(gè)小的隨機(jī)比率(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

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

          直觀上,對(duì)于C點(diǎn)我們不應(yīng)該去構(gòu)造新樣本,對(duì)B點(diǎn),構(gòu)造新樣本不會(huì)豐富minority類別的分布。只有A點(diǎn),如果構(gòu)造新樣本能夠使得A點(diǎn)從(DANGER)到(SAFE),加強(qiáng)minority類別的分類邊界。這個(gè)就是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方法從保持樣本分布的角度來(lái)確定生成數(shù)據(jù),生成數(shù)據(jù)的方式和SMOTE是一樣的,不同在于每個(gè)minortiy樣本生成樣本的數(shù)量不同。

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

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

          • 計(jì)算每個(gè)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提供的過(guò)采樣的方法如下(包括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 綜合采樣

          過(guò)采樣是針對(duì)minority樣本,欠采樣是針對(duì)majority樣本;而綜合采樣是既對(duì)minority樣本,又對(duì)majority樣本,同時(shí)進(jìn)行操作的方法。主要有SMOTE+Tomek-links和SMOTE+Edited Nearest Neighbours。

          綜合采樣的方法,是先進(jìn)行過(guò)采樣,在進(jìn)行欠采樣。

          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的樣本進(jìn)行欠采樣加上minority樣本)訓(xùn)練多個(gè)模型,然后進(jìn)行集成。imblearn.ensemble提供幾種常見(jiàn)的模型集成算法,如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)重

          對(duì)于很多用梯度下降方法來(lái)學(xué)習(xí)(使得某個(gè)損失Loss最?。┑臋C(jī)器學(xué)習(xí)的方法,可以通過(guò)調(diào)整類別權(quán)重或樣本權(quán)重的方式,來(lái)一定程度上平衡不平衡數(shù)據(jù)。如gbdt模型lightgbmclass_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é)

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

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

          4. 參考資料

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


          作者簡(jiǎn)介:wedo實(shí)驗(yàn)君, 數(shù)據(jù)分析師;熱愛(ài)生活,熱愛(ài)寫作


          贊 賞 作 者


          更多閱讀



          2020 年最佳流行 Python 庫(kù) Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          Top 10 沙雕又有趣的 GitHub 程序

          特別推薦





          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV无码成人精品区久 | www.久爱| 五月天黄色视频 | 久久久久久麻豆 | 人人摸人人撸 |