<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í)戰(zhàn)反欺詐模型

          共 6511字,需瀏覽 14分鐘

           ·

          2020-11-06 04:53

          三本點(diǎn)擊上方“早起Python”,關(guān)注并“星標(biāo)

          每日接收Python干貨!



          本文含?6192?,15?圖表截屏
          建議閱讀 20分鐘


          本文將基于不平衡數(shù)據(jù),使用Python進(jìn)行反欺詐模型數(shù)據(jù)分析實(shí)戰(zhàn),模擬分類(lèi)預(yù)測(cè)模型中因變量分類(lèi)出現(xiàn)不平衡時(shí)該如何解決,具體的案例應(yīng)用場(chǎng)景除反欺詐外,還有客戶(hù)違約和疾病檢測(cè)等。只要是因變量中各分類(lèi)占比懸殊,就可對(duì)其使用一定的采樣方法,以達(dá)到除模型調(diào)優(yōu)外的精度提升。主要將分為兩個(gè)部分:

          • 原理介紹

          • Python實(shí)戰(zhàn)

          原理介紹

          與其花大量的時(shí)間對(duì)建好的模型進(jìn)行各種調(diào)優(yōu)操作,不如在一開(kāi)始就對(duì)源數(shù)據(jù)進(jìn)行系統(tǒng)而嚴(yán)謹(jǐn)?shù)奶幚?。而?shù)據(jù)處理背后的算法原理又常是理解代碼的支撐。所以本節(jié)將詳細(xì)介紹不平衡采樣的多種方法。

          在以往的學(xué)習(xí)中,數(shù)據(jù)大多是對(duì)稱(chēng)分布的,就像下圖一樣,即正負(fù)樣本的數(shù)量相當(dāng)。這樣可以更好的把注意力集中在特定的算法上,而不被其他問(wèn)題干擾。以分離算法為例,它的目標(biāo)是嘗試學(xué)習(xí)出一個(gè)能夠分辨二者的分離器(分類(lèi)器)。根據(jù)不同的數(shù)學(xué)、統(tǒng)計(jì)或幾何假設(shè),達(dá)成這一目標(biāo)的方法很多:邏輯回歸,嶺回歸,決策樹(shù),和各種聚類(lèi)算法等。

          但當(dāng)我們開(kāi)始面對(duì)真實(shí)的、未經(jīng)加工過(guò)的數(shù)據(jù)時(shí),很快就會(huì)發(fā)現(xiàn)這些數(shù)據(jù)要嘈雜且不平衡得多。真實(shí)數(shù)據(jù)看起來(lái)更像是如下圖般毫無(wú)規(guī)律且零散。對(duì)于不平衡類(lèi)的研究通常認(rèn)為 “不平衡” 意味著少數(shù)類(lèi)只占 10% ~ 20%。但其實(shí)這已經(jīng)算好的了,在現(xiàn)實(shí)中的許多例子會(huì)更加的不平衡(1~2%),如規(guī)劃中的客戶(hù)信用卡欺詐率,重大疾病感染率等。就像下圖一樣

          如果我們拿到像上圖那樣的數(shù)據(jù),哪怕經(jīng)過(guò)了清洗,已經(jīng)非常整潔了,之后把它們直接丟進(jìn)邏輯回歸或者決策樹(shù)和神經(jīng)網(wǎng)絡(luò)模型里面的話,效果一定會(huì)見(jiàn)得好嗎?。以根據(jù)患者體征來(lái)預(yù)測(cè)其得某種罕見(jiàn)病為例:可能模型在預(yù)測(cè)該患者不得病上特準(zhǔn),畢竟不得病的數(shù)據(jù)占到了98%,那把剩下的得病的那 2% 也都預(yù)測(cè)成了不得病的情況下模型的整體準(zhǔn)確度還是非常高...但整體準(zhǔn)確度高并不代表模型在現(xiàn)實(shí)情況就能有相同的優(yōu)良表現(xiàn),所以最好還是能夠拿到 1:1 的數(shù)據(jù),這樣模型預(yù)測(cè)出來(lái)的結(jié)果才最可靠。

          所以對(duì)于這類(lèi)數(shù)據(jù),常見(jiàn)而有效的處理方式有基本的數(shù)據(jù)處理、調(diào)整樣本權(quán)重與使用模型等三類(lèi)。

          本文將專(zhuān)注于從數(shù)據(jù)處理的角度來(lái)解決數(shù)據(jù)不平衡問(wèn)題,后續(xù)推文會(huì)涉及使用模型來(lái)處理。

          注意事項(xiàng):

          • 評(píng)估指標(biāo):使用精確度(Precise Rate)、召回率(Recall Rate)、Fmeasure或ROC曲線、準(zhǔn)確度召回曲線(precision-recall curve);不要使用準(zhǔn)確度(Accurate Rate)
          • 不要使用模型給出的標(biāo)簽,而是要概率估計(jì);得到概率估計(jì)之后,不要盲目地使用0.50的決策閥值來(lái)區(qū)分類(lèi)別,應(yīng)該再檢查表現(xiàn)曲線之后再自己決定使用哪個(gè)閾值。

          問(wèn):為什么數(shù)據(jù)處理的幾種采樣方法都只對(duì)訓(xùn)練集進(jìn)行操作?

          :因?yàn)樵紨?shù)據(jù)集的 0-1 比為 1:99,所以隨即拆分成的訓(xùn)練集和測(cè)試集的 0-1 比也差不多是 1:99,又因?yàn)槲覀冇糜?xùn)練集來(lái)訓(xùn)練模型,如果不對(duì)訓(xùn)練集的數(shù)據(jù)做任何操作,得出來(lái)模型就會(huì)在預(yù)測(cè)分類(lèi)0的準(zhǔn)度上比1高,而我們希望的是兩者都要兼顧,所以我們才要使用欠采樣或者過(guò)采樣對(duì)訓(xùn)練集進(jìn)行處理,使訓(xùn)練集的 0-1 比在我們之前聊到的 1:1 ~ 1:10 這個(gè)比較合適的區(qū)間,用這樣的訓(xùn)練集訓(xùn)練出來(lái)的模型的泛化能力會(huì)更強(qiáng)。以打靶作為比喻,靶心面積很小,對(duì)應(yīng)了占比小的違約客戶(hù)群體。在 0-1 比為 1:99 的測(cè)試集的嚴(yán)酷考驗(yàn)下,模型打中靶心(成功預(yù)測(cè)違約客戶(hù))與打中靶心周?chē)ǔ晒︻A(yù)測(cè)履約客戶(hù))的概率都得到了保證。

          欠采樣與過(guò)采樣

          過(guò)采樣會(huì)隨機(jī)復(fù)制少數(shù)樣例以增大它們的規(guī)模。欠采樣則隨機(jī)地少采樣主要的類(lèi)。一些數(shù)據(jù)科學(xué)家(天真地)認(rèn)為過(guò)采樣更好,因?yàn)槠鋾?huì)得到更多的數(shù)據(jù),而欠采樣會(huì)將數(shù)據(jù)丟掉。但請(qǐng)記住復(fù)制數(shù)據(jù)不是沒(méi)有后果的——因?yàn)槠鋾?huì)得到復(fù)制出來(lái)的數(shù)據(jù),它就會(huì)使變量的方差表面上比實(shí)際上更小。而過(guò)采樣的好處是它也會(huì)復(fù)制誤差的數(shù)量:如果一個(gè)分類(lèi)器在原始的少數(shù)類(lèi)數(shù)據(jù)集上做出了一個(gè)錯(cuò)誤的負(fù)面錯(cuò)誤,那么將該數(shù)據(jù)集復(fù)制五次之后,該分類(lèi)器就會(huì)在新的數(shù)據(jù)集上出現(xiàn)六個(gè)錯(cuò)誤。相對(duì)地,欠采樣會(huì)讓獨(dú)立變量(independent variable)的方差看起來(lái)比其實(shí)際的方差更高。

          Tomek Link 法欠采樣

          上圖為 Tomek Link 欠采樣法的核心。不難發(fā)現(xiàn)左邊的分布中 0-1 兩個(gè)類(lèi)別之間并沒(méi)有明顯的分界。Tomek Link 法處理后,將占比多的一方(0),與離它(0)最近的一個(gè)少的另一方 (1) 配對(duì),而后將這個(gè)配對(duì)刪去,這樣一來(lái)便如右邊所示構(gòu)造出了一條明顯一些的分界線。所以說(shuō)欠采樣需要在占比少的那一類(lèi)的數(shù)據(jù)量比較大的時(shí)候使用(大型互聯(lián)網(wǎng)公司與銀行),畢竟一命抵一命...

          Random Over Sampling 隨機(jī)過(guò)采樣

          隨機(jī)過(guò)采樣并不是將原始數(shù)據(jù)集中占比少的類(lèi)簡(jiǎn)單的乘個(gè)指定的倍數(shù),而是對(duì)較少類(lèi)按一定比例進(jìn)行一定次數(shù)的隨機(jī)抽樣,然后將每次隨機(jī)抽樣所得到的數(shù)據(jù)集疊加。但如果只是簡(jiǎn)單的隨機(jī)抽樣也難免會(huì)出現(xiàn)問(wèn)題,因?yàn)槿我鈨纱蔚碾S機(jī)抽樣中,可能會(huì)有重復(fù)被抽到的數(shù)據(jù),所以經(jīng)過(guò)多次隨機(jī)抽樣后疊加在一起的數(shù)據(jù)中可能會(huì)有不少的重復(fù)值,這便會(huì)使數(shù)據(jù)的變異程度減小。所以這是隨機(jī)過(guò)采樣的弊端。

          SMOTE 過(guò)采樣

          SMOTE 過(guò)采樣法的出現(xiàn)正好彌補(bǔ)了隨機(jī)過(guò)采樣的不足,其核心步驟如下圖但SMOTE 并不是一點(diǎn)壞處都沒(méi)有。上圖的數(shù)據(jù)分布 SMOTE 方法的步驟示意圖是比較理想的情況(兩個(gè)類(lèi)別分得還比較開(kāi)),通常數(shù)據(jù)不平衡的散點(diǎn)圖應(yīng)該是像下面這樣的:而這個(gè)時(shí)候如果我們依然使用 SMOTE 來(lái)過(guò)采樣的話就會(huì)出現(xiàn)下面的問(wèn)題理想情況下的圖中我們可以看出黑點(diǎn)的分布似乎是可以用一條線連起來(lái)的,而現(xiàn)實(shí)情況中的數(shù)據(jù)往往太過(guò)分散,比如上圖中的黑點(diǎn)是呈現(xiàn)U型曲線的分布,在這個(gè)情況下,SMOTE 算法的第四步作中間插值后,可能這個(gè)新插入的點(diǎn)剛好就是某個(gè)白點(diǎn)所在的點(diǎn)。本來(lái)是 0 的地盤(pán),密密集集的0當(dāng)中突然給生硬的插進(jìn)去了一個(gè)1......這就使數(shù)據(jù)又重復(fù)了

          綜合采樣

          綜合采樣的核心:先使用過(guò)采樣,擴(kuò)大樣本后再對(duì)處在膠著狀態(tài)的點(diǎn)用 Tomek Link 法進(jìn)行刪除,有時(shí)候甚至連 Tomek Link 都不用,直接把離得近的對(duì)全部刪除,因?yàn)樵谶M(jìn)行過(guò)采樣后,0 和 1 的樣本量已經(jīng)達(dá)到了 1:1。

          Python實(shí)戰(zhàn)

          數(shù)據(jù)探索

          首先導(dǎo)入相關(guān)包

          import?pandas?as?pd
          import?numpy?as?np
          import?matplotlib.pyplot?as?plt
          import?seaborn?as?sns

          為了方便敘述建模流程,這里準(zhǔn)備了兩個(gè)脫敏數(shù)據(jù)集:一個(gè)訓(xùn)練集一個(gè)測(cè)試集

          train?=?pd.read_csv('imb_train.csv')
          test?=?pd.read_csv('imb_test.csv')

          print(f'訓(xùn)練集數(shù)據(jù)長(zhǎng)度:{len(train)},測(cè)試集數(shù)據(jù)長(zhǎng)度:{len(test)}')
          train.sample(3)

          稍微解釋下參數(shù):

          • X1 ~ X5:自變量,
          • cls:因變量 care life of science - 科學(xué)關(guān)愛(ài)生命 0-不得病,1-得病

          現(xiàn)在查看測(cè)試集與訓(xùn)練集的因變量分類(lèi)情況

          print('訓(xùn)練集中,因變量 cls 分類(lèi)情況:')
          print(train['cls'].agg(['value_counts']).T)
          print('='*55?+?'\n')

          print('測(cè)試集中,因變量 cls 分類(lèi)情況:')
          print(test['cls'].agg(['value_counts']).T)

          可知訓(xùn)練集和測(cè)試集中的占比少的類(lèi)別 1 實(shí)在是太少了,比較嚴(yán)重的不平衡,我們還可以使用 Counter 庫(kù)統(tǒng)計(jì)一下兩個(gè)數(shù)據(jù)集中因變量的分類(lèi)情況,不難發(fā)現(xiàn)數(shù)據(jù)不平衡問(wèn)題還是比較嚴(yán)重

          from?collections?import?Counter
          print('訓(xùn)練集中因變量 cls 分類(lèi)情況:{}'.format(Counter(train['cls'])))
          print('測(cè)試集因變量 cls 分類(lèi)情況:{}'.format(Counter(test['cls'])))
          #訓(xùn)練集中因變量 cls 分類(lèi)情況:Counter({0: 13644, 1: 356})
          #測(cè)試集因變量 cls 分類(lèi)情況:Counter({0: 5848, 1: 152})

          不同的抽樣方法對(duì)訓(xùn)練集進(jìn)行處理

          在處理前再次重申兩點(diǎn):

          • 測(cè)試集不做任何處理!保留嚴(yán)峻的比例考驗(yàn)來(lái)測(cè)試模型。
          • 訓(xùn)練模型時(shí)用到的數(shù)據(jù)才是經(jīng)過(guò)處理的,0-1 比例在 1:1 ~ 1:10 之間拆分自變量與因變量

          拆分自變量與因變量

          y_train?=?train['cls'];????????y_test?=?test['cls']
          X_train?=?train.loc[:,?:'X5'];??X_test?=?test.loc[:,?:'X5']
          X_train.sample(),?y_train[:1]?
          #(????????????X1????????X2????????X3???????X4????????X5
          #?9382?-1.191287??1.363136?-0.705131?-1.24394?-0.520264,?0????0
          #?Name:?cls,?dtype:?int64)

          抽樣的幾種方法

          • Random Over Sampling:隨機(jī)過(guò)抽樣
          • SMOTE 方法過(guò)抽樣
          • SMOTETomek 綜合抽樣

          我們將用到imbalance learning這個(gè)包,pip install imblearn安裝一下即可,下面是不同抽樣方法的核心代碼,具體如何使用請(qǐng)看注釋

          from?imblearn.over_sampling?import?RandomOverSampler
          print('不經(jīng)過(guò)任何采樣處理的原始 y_train 中的分類(lèi)情況:{}'.format(Counter(y_train)))

          #?采樣策略 sampling_strategy =?'auto'?的 auto 默認(rèn)抽成 1:1,
          ?##?如果想要另外的比例如杰克所說(shuō)的 1:5,甚至底線 1:10,需要根據(jù)文檔自行調(diào)整參數(shù)
          ?##?文檔:https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.RandomOverSampler.html
          #?先定義好好,未開(kāi)始正式訓(xùn)練擬合
          ros?=?RandomOverSampler(random_state=0,?sampling_strategy='auto')?
          X_ros,?y_ros?=?ros.fit_sample(X_train,?y_train)
          print('隨機(jī)過(guò)采樣后,訓(xùn)練集 y_ros 中的分類(lèi)情況:{}'.format(Counter(y_ros)))

          #?同理,SMOTE?的步驟也是如此
          from?imblearn.over_sampling?import?SMOTE
          sos?=?SMOTE(random_state=0)
          X_sos,?y_sos?=?sos.fit_sample(X_train,?y_train)
          print('SMOTE過(guò)采樣后,訓(xùn)練集 y_sos 中的分類(lèi)情況:{}'.format(Counter(y_sos)))

          #?同理,綜合采樣(先過(guò)采樣再欠采樣)
          ##?#?combine?表示組合抽樣,所以?SMOTE?與?Tomek?這兩個(gè)英文單詞寫(xiě)在了一起
          from?imblearn.combine?import?SMOTETomek
          kos?=?SMOTETomek(random_state=0)??#?綜合采樣
          X_kos,?y_kos?=?kos.fit_sample(X_train,?y_train)
          print('綜合采樣后,訓(xùn)練集 y_kos 中的分類(lèi)情況:{}'.format(Counter(y_kos)))

          不難看出兩種過(guò)采樣方法都將原來(lái) y_train 中的占比少的分類(lèi) 1 提到了與 0 數(shù)量一致的情況,但因?yàn)榫C合采樣在過(guò)采樣后會(huì)使用欠采樣,所以數(shù)量會(huì)稍微少一點(diǎn)點(diǎn)

          決策樹(shù)建模

          看似高大上的梯度優(yōu)化其實(shí)也被業(yè)內(nèi)稱(chēng)為硬調(diào)優(yōu),即每個(gè)模型參數(shù)都給幾個(gè)潛在值,而后讓模型將其自由組合,根據(jù)模型精度結(jié)果記錄并輸出最佳組合,以用于測(cè)試集的驗(yàn)證。首先導(dǎo)入相關(guān)包

          from?sklearn.tree?import?DecisionTreeClassifier
          from?sklearn?import?metrics
          from?sklearn.model_selection?import?GridSearchCV

          現(xiàn)在創(chuàng)建決策樹(shù)類(lèi),但并沒(méi)有正式開(kāi)始訓(xùn)練模型

          clf?=?DecisionTreeClassifier(criterion='gini',?random_state=1234)
          #?梯度優(yōu)化
          param_grid?=?{'max_depth':[3,?4,?5,?6],?'max_leaf_nodes':[4,?6,?8,?10,?12]}
          #?cv?表示是創(chuàng)建一個(gè)類(lèi),還并沒(méi)有開(kāi)始訓(xùn)練模型
          cv?=?GridSearchCV(clf,?param_grid=param_grid,?scoring='f1')

          如下是模型的訓(xùn)練數(shù)據(jù)的組合,注意!這里的數(shù)據(jù)使用大有玄機(jī),第一組數(shù)據(jù)X,y_train是沒(méi)有經(jīng)過(guò)任何操作的,第二組ros為隨機(jī)過(guò)采樣,第三組sos為SMOTE過(guò)采樣,最后一組kos則為綜合采樣

          data?=?[[X_train,?y_train],
          ????????[X_ros,?y_ros],
          ????????[X_sos,?y_sos],
          ????????[X_kos,?y_kos]]

          現(xiàn)在對(duì)四組數(shù)據(jù)分別做模型,要注意其實(shí)recallprecision的用處都不大,看auc即可,recall:覆蓋率,預(yù)測(cè)出分類(lèi)為0且正確的,但本來(lái)數(shù)據(jù)集中分類(lèi)為0的占比本來(lái)就很大。而且recall是以閾值為 0.5 來(lái)計(jì)算的,那我們就可以簡(jiǎn)單的認(rèn)為預(yù)測(cè)的欺詐概率大于0.5就算欺詐了嗎?還是說(shuō)如果他的潛在欺詐概率只要超過(guò) 20% 就已經(jīng)算為欺詐了呢?

          for?features,?labels?in?data:
          ????cv.fit(features,?labels)?#?對(duì)四組數(shù)據(jù)分別做模型
          ????#?注意:X_test 是從來(lái)沒(méi)被動(dòng)過(guò)的,回應(yīng)了理論知識(shí):
          ?????##?使用比例優(yōu)良的(1:1~1:10)訓(xùn)練集來(lái)訓(xùn)練模型,用殘酷的(分類(lèi)為1的僅有2%)測(cè)試集來(lái)考驗(yàn)?zāi)P?/span>
          ????predict_test?=?cv.predict(X_test)?
          ????print('auc:%.3f'?%metrics.roc_auc_score(y_test,?predict_test),?
          ??????????'recall:%.3f'?%metrics.recall_score(y_test,?predict_test),
          ??????????'precision:%.3f'?%metrics.precision_score(y_test,?predict_test))

          可以發(fā)現(xiàn)并不一定是綜合采樣就一定高分,畢竟每份數(shù)據(jù)集都有屬于它自己的特征,不過(guò)一點(diǎn)都不處理的模型的 auc 是最低的。

          最后總結(jié)一下,隨機(jī)過(guò)采樣,SMOTE過(guò)采樣與綜合采樣只是解決數(shù)據(jù)不平衡問(wèn)題方法中的冰山一角,后面還會(huì)繼續(xù)深入淺出使用其他模型來(lái)平衡數(shù)據(jù),本文使用的數(shù)據(jù)及源碼可以使用電腦點(diǎn)擊閱讀原文下載。



          瀏覽 51
          點(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>
                  成人大香交 | 一道本一区二区三区久久久久 | 国产亚洲视频免费观看 | 亚洲国产豆花 | 青娱乐导航 |