機器學習超詳細實踐攻略(11):三板斧干掉樣本不均衡問題之1——過(欠)采樣

封面圖

想象一下丙笋,假如今天是你作為數(shù)據(jù)分析師入職的第一天捐凭,老板交給你一個數(shù)據(jù)分析任務:通過公司已經(jīng)有的信用卡用戶和交易信息淑廊,預測用戶未來是否會逾期還款。

這個問題看似簡單旧烧,實則隱藏了一個非常大的坑:據(jù)粗略估計影钉,全國的信用卡平均不良率只有不到1%,也就是說掘剪,銀行貸出100萬平委,可能只有1萬沒有辦法正常收回,這樣夺谁,如果你拿到一個信用卡還款數(shù)據(jù)集廉赔,很大可能是這個數(shù)據(jù)集里有99%的正樣本,1%的負樣本匾鸥,在預測的時候可能模型對于負樣本的特征表現(xiàn)并不敏感蜡塌。

同樣的,這樣的場景還有:檢測某平臺所有交易訂單中的欺詐訂單(畢竟大多數(shù)用戶都是正常交易的老實人)勿负、檢測銀行中的洗錢交易馏艾、預測大型企業(yè)客戶的流失等等。

我們常說的類別不平衡問題奴愉,就是數(shù)據(jù)集中存在某一類樣本琅摩,其數(shù)量遠多于或遠少于其他類樣本,從而導致一些機器學習模型失效的問題躁劣。

對于這種情況迫吐,在機器學習界,只要祭出三板斧账忘,就可以解決絕大部分的數(shù)據(jù)不平衡問題志膀,讓你的模型所向披靡,預測能力取得一個質(zhì)的飛躍鳖擒。這三板斧分別是:過采樣(欠采樣)溉浙、對不同類樣本設置不同的懲罰權重、集成學習中的bagging方法蒋荚。下面戳稽,我們首先學習第一大絕招:過采樣(欠采樣)的原理和實現(xiàn)。

無論是過采樣還是欠采樣期升,無非就是兩種思路:一是補惊奇,給樣本量少的那個類別增加樣本量;二是刪播赁,刪掉一部分樣本量多的類別颂郎。最終達到每個類別的樣本數(shù)量平衡的目的。

一容为、過采樣(over-sampling)

又稱上采樣乓序。過采樣繼承了“補”的思路寺酪,通過增加分類中少數(shù)類樣本的數(shù)量來實現(xiàn)樣本均衡。過采樣最直接的方法就是將少數(shù)類的樣本多復制幾份替劈。但是這種方法的缺點是:如果樣本特征太少寄雀,這些重復的樣本就可能導致過擬合的問題。一般情況下陨献,我們不是簡單復制幾份盒犹,而是在復制的同時加一些隨機噪聲、干擾數(shù)據(jù)等眨业,防止模型過擬合阿趁。

另一種解決方法就是通過特定的算法合成新的樣本。

其實這些算法執(zhí)行流程并沒有那么難理解坛猪,算法實現(xiàn)起來也并不是很難。以典型的過采樣算法smote算法為例皂股,算法流程如下:

假設有兩個class:class1 和 class2 墅茉,其中class1樣本數(shù)少。
步驟1:從class1中隨機選擇一個點C呜呐,找到該點的K個鄰居
步驟2:從K個鄰居中隨機選擇一個點C_ne
步驟3:連接C與C1就斤,在C與C_ne的連線上生成新的點C_new
步驟4:重復1-4 M步驟,可構造M個點

在Python中蘑辑,處理樣本不均衡問題我們需要用到一個包:imbalanced-learn洋机。

首先,安裝這個包:pip install imbalanced-learn

我們先用 https://zhuanlan.zhihu.com/p/95412564 中講的生成數(shù)據(jù)集的方法生成一個正負樣本量不均衡的數(shù)據(jù)集洋魂。

from sklearn import datasets
# 生成
X,Y = datasets.make_classification(n_samples = 20,
                                    n_features = 4,
                                    n_classes = 2,
                                    weights = [0.3,0.7])

print(X)
print(Y)

輸出結(jié)果如下:

[[ 1.21706083 1.12986 1.2998324 1.15376352] [ 1.17533636 -1.29561194 -0.28954016 1.00276647] [ 1.50145008 -0.06476093 0.65946499 1.35525496] [-0.69105133 -1.72583842 -1.4398602 -0.70573952] [ 0.52003318 -0.53992062 -0.10653626 0.44523502] [-1.2449438 1.44815687 0.35575841 -1.05861377] [-0.69626765 0.51388754 0.00736094 -0.60588014] [ 0.28817084 2.14562256 1.52336461 0.36087658] [-0.60796446 -0.04013406 -0.30997876 -0.55186576] [-1.50124558 2.42594496 0.86890189 -1.24482048] [ 0.4807009 -0.150123 0.12738589 0.42785389] [ 1.61349955 -1.76329405 -0.38756462 1.37731124] [ 1.52055699 1.23124411 1.50722703 1.43305357] [ 0.18461106 -0.67446852 -0.35030985 0.13551482] [ 1.10954433 1.00010374 1.16562311 1.05044065] [ 0.96242505 2.41142144 2.01037078 0.98324786] [-0.93460516 -1.2828331 -1.2668987 -0.90538419] [ 0.74531935 1.24987676 1.15714557 0.73260898] [ 0.65228896 -0.50904671 -0.02477175 0.56632109] [-0.06905236 -0.20338623 -0.16389815 -0.07196445]]
[1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1]

可以看到生成的標簽中绷旗,0標簽和1標簽的比例是3:7。

我們以SMOTE算法作為過采樣算法對不均衡樣本進行處理:


from imblearn.over_sampling import SMOTE # 導入過采樣處理庫SMOTE

# 使用SMOTE方法進行過采樣處理

smote = SMOTE() # 建立SMOTE模型對象

X_new, Y_new = smote.fit_sample(X, Y) # 輸入數(shù)據(jù)并作過采樣處理

print('Y_new:',Y_new)

print('Y_new長度:',len(Y_new))

輸出如下:

Y_new: [1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0]
Y_new長度: 28

可以看到副砍,算法補充了8個0樣本衔肢,使得0、1類別的比例變成了1:1

除此之外豁翎,還有這些過采樣函數(shù)可以調(diào)用:

  • over_sampling.ADASYN()
  • over_sampling.KMeansSMOTE()
  • over_sampling.RandomOverSampler()
  • over_sampling.SMOTE()
  • over_sampling.SMOTENC()
  • over_sampling.SVMSMOTE()

二角骤、欠采樣

又稱下采樣(under-sampling),這是繼承了“刪”的思路心剥,通過刪掉一部分多類樣本的數(shù)量來實現(xiàn)樣本均衡邦尊,最直接的方法是隨機去掉一些多數(shù)類樣本來減小多數(shù)類的規(guī)模。這樣做的缺點也很明顯优烧,可能刪得太過分蝉揍,把數(shù)量多的類別的樣本中一些重要的信息也刪除掉。

當然匙隔,為了避免這種情況疑苫,我們也可以采用一些成熟的欠采樣算法熏版,我們以RandomUnderSampler為例。


from imblearn.under_sampling import RandomUnderSampler # 導入欠采樣處理庫Random UnderSampler

# 使用RandomUnderSampler方法進行欠采樣處理

RandomUnderSampler = RandomUnderSampler() # 建立RandomUnderSampler模型對象

X_new, Y_new = RandomUnderSampler.fit_sample(X,Y) # 輸入數(shù)據(jù)并進行欠采樣處理

print('Y_new:',Y_new)

print('Y_new長度:',len(Y_new))

輸出如下:

Y_new: [0 0 0 0 0 0 1 1 1 1 1 1]
Y_new長度: 12

可以看到捍掺,算法舍棄了8個1樣本撼短,使得0、1類別得比例變成1:1挺勿。

不管是欠采樣還是過采樣曲横,如果想自己決定采樣數(shù)量,可以添加這個參數(shù):sampling_strategy = {類別:個數(shù)}:每個類別得采樣個數(shù)(在0.6版本以前是ratio參數(shù))不瓶。

還有這些欠采樣函數(shù)可以調(diào)用:

  • under_sampling.CondensedNearestNeighbour()
  • under_sampling.EditedNearestNeighbours()
  • under_sampling.RepeatedEditedNearestNeighbours()
  • under_sampling.AllKNN()
  • under_sampling.InstanceHardnessThreshold()
  • under_sampling.NearMiss()
  • under_sampling.NeighbourhoodCleaningRule()
  • under_sampling.OneSidedSelection()
  • under_sampling.RandomUnderSampler()
  • under_sampling.TomekLinks()

總體上禾嫉,過采樣和欠采樣更適合大數(shù)據(jù)分布不均衡的情況,尤其是過采樣方法蚊丐,應用極為廣泛熙参。

三、擴展閱讀

imbalanced-learn文檔鏈接:https://imbalanced-learn.readthedocs.io/en/stable/api.html

四麦备、本系列相關文章

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孽椰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凛篙,更是在濱河造成了極大的恐慌黍匾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛梆,死亡現(xiàn)場離奇詭異锐涯,居然都是意外死亡,警方通過查閱死者的電腦和手機填物,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門纹腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人融痛,你說我怎么就攤上這事壶笼。” “怎么了雁刷?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵覆劈,是天一觀的道長。 經(jīng)常有香客問我沛励,道長责语,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任目派,我火速辦了婚禮坤候,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘企蹭。我一直安慰自己白筹,他們只是感情好智末,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徒河,像睡著了一般系馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顽照,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天由蘑,我揣著相機與錄音,去河邊找鬼代兵。 笑死尼酿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的植影。 我是一名探鬼主播裳擎,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼思币!你這毒婦竟也來了句惯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤支救,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拷淘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體各墨,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年启涯,在試婚紗的時候發(fā)現(xiàn)自己被綠了贬堵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡结洼,死狀恐怖黎做,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情松忍,我是刑警寧澤蒸殿,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站鸣峭,受9級特大地震影響宏所,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摊溶,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一爬骤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莫换,春花似錦霞玄、人聲如沸骤铃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惰爬。三九已至,卻和暖如春听隐,著一層夾襖步出監(jiān)牢的瞬間补鼻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工雅任, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留风范,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓沪么,卻偏偏與公主長得像硼婿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禽车,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容