使用Python怎么對不平衡的數(shù)據(jù)集進行處理?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),河北企業(yè)網(wǎng)站建設(shè),河北品牌網(wǎng)站建設(shè),網(wǎng)站定制,河北網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,河北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。所謂的數(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)重
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
所謂欠采樣,就是將數(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
所謂過采樣,就是將數(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
過采樣是針對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
這里的模型集成主要體現(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
對于很多用梯度下降方法來學(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)
本文題目:使用Python怎么對不平衡的數(shù)據(jù)集進行處理-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://jinyejixie.com/article22/dchscc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站設(shè)計公司、營銷型網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、虛擬主機、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容