<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隨機(jī)森林預(yù)測(cè)實(shí)戰(zhàn)

          共 6450字,需瀏覽 13分鐘

           ·

          2020-07-28 16:53

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

          每日接收Python干貨!



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


          本文是Python商業(yè)數(shù)據(jù)挖掘?qū)崙?zhàn)的第3篇


          前言

          組合算法也叫集成學(xué)習(xí),在金融行業(yè)或非圖像識(shí)別領(lǐng)域,效果有時(shí)甚至比深度學(xué)習(xí)還要好。能夠理解基本原理并將代碼用于實(shí)際的業(yè)務(wù)案例是本文的目標(biāo),本文將詳細(xì)介紹如何利用Python實(shí)現(xiàn)集成學(xué)習(xí)中隨機(jī)森林這個(gè)經(jīng)典的方法來預(yù)測(cè)寬帶客戶的流失,主要將分為兩個(gè)部分:

          • 詳細(xì)原理介紹

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

          集成學(xué)習(xí)

          本文的主角是隨機(jī)森林,所以我們將以隨機(jī)森林所屬的分支 —— 裝袋法 入手,深入淺出該集成學(xué)習(xí)方法的原理步驟。裝袋法流程如下

          乍一看圖中的步驟可能有些復(fù)雜,現(xiàn)在來逐步拆解。裝袋法中的裝袋二字是精髓,顧名思義即將多個(gè)模型裝入同一個(gè)袋子后,讓這個(gè)袋子作為一個(gè)新的模型來實(shí)現(xiàn)預(yù)測(cè)需求,僅此而已。換句話說,即把多個(gè)模型組合起來形成一個(gè)新的大模型,這個(gè)大模型最終給出的預(yù)測(cè)結(jié)果是由這多個(gè)小模型綜合決定的,決定方式為少數(shù)服從多數(shù)。

          假設(shè)有10萬條原始數(shù)據(jù),用這些數(shù)據(jù)來做十棵決策樹(當(dāng)然也可以是其他模型),最后這10棵樹將被裝進(jìn)了同一個(gè)袋子中。這時(shí)候取其中一條數(shù)據(jù)放入這個(gè)袋子,便會(huì)得出10個(gè)預(yù)測(cè)值(每棵樹各一個(gè)),假如其中三棵樹給出的預(yù)測(cè)值為0,剩余的七棵給出的為1,那我們便可知道這個(gè)袋子對(duì)這個(gè)數(shù)據(jù)的預(yù)測(cè)結(jié)果為 0 的概率是 3/10。

          為了更深入的理解裝袋法,下面將回答三個(gè)與裝袋法有關(guān)的常見問題

          問:袋子中的每個(gè)模型使用的樣本量范圍應(yīng)為多少合適?

          答:如果是上面的例子,袋子里面有十棵樹,源數(shù)據(jù)總量為 10萬 條,則每棵樹取用的樣本量的最小值為最少是1w個(gè)(10w/10棵 = 1w/棵),因?yàn)橹辽僖WC不能浪費(fèi)樣本,但每棵樹最多可取用多少樣本呢?其實(shí)在樣本量已知,同一袋子中模型個(gè)數(shù)為n的情況下,樣本的選擇比例為1/n ~ 0.8最好。每個(gè)小模型取用 100% 的樣本是絕對(duì)沒有意義的,那就跟沒抽是一樣的,這樣也就沒有體現(xiàn)出裝袋,只有每個(gè)模型用到的數(shù)據(jù)都有一定的不同,組合起來后每個(gè)的投票(預(yù)測(cè)結(jié)果)也才有意義。

          問:袋中模型們之間的相關(guān)性會(huì)影響最后的決策結(jié)果嗎?

          答:裝袋法思路最重要的一點(diǎn):袋子中每個(gè)模型之間不能相關(guān),越不相關(guān)越好,這里的不相關(guān)主要體現(xiàn)在用于訓(xùn)練每個(gè)模型的樣本不一樣。其次,每個(gè)模型的精度越高越好,這樣它的投票才更有價(jià)值。

          PS:訓(xùn)練模型的樣本不一樣這一點(diǎn)可以理解為總統(tǒng)選舉,抽 10 波選民來投票,這 10 波選民的差異性越大越好,這樣一來,只有在選民千差萬別的情況下你依然脫穎而出,才足以說明你的實(shí)力,如果這10波選民中每一波之間的差異性都很小,比如都是本來就偏袒于總統(tǒng)候選人,那投票結(jié)果的說服力就會(huì)大減。

          問:上面所說的模型精度高是不是哪怕模型很復(fù)雜也可以,如果每個(gè)模型的精度高但都過度擬合怎么辦?

          答:在裝袋法中,模型是越精確越好,哪怕是過度擬合的也沒有關(guān)系。因?yàn)橐粋€(gè)模型要想在訓(xùn)練集上做到越精確越好,而精確程度與模型的復(fù)雜度大多是成正比的,所以出現(xiàn)過擬合的情況也是正常且情有可原的。復(fù)雜和過度擬合只是對(duì)袋子中每個(gè)模型而言,因?yàn)樽詈蠖紩?huì)被加權(quán),所以整個(gè)袋子(整體)并不會(huì)出現(xiàn)過度擬合的情況。

          隨機(jī)森林

          隨機(jī)森林的實(shí)現(xiàn)步驟如下:


          有關(guān)隨機(jī)森林算法,本文說明以下幾個(gè)問題

          問:為什么在列上也要隨機(jī)抽樣?

          答:在引入筆者最最喜歡的一個(gè)比喻之前,先來看一個(gè)實(shí)際的業(yè)務(wù)場(chǎng)景,來自某城市商業(yè)銀行。我們有一大個(gè)電子表格存著大量的歷史數(shù)據(jù),大概50多個(gè)變量(50多列),變量們來自幾個(gè)不同的公司如人行,電信等(同一個(gè)客戶在不同公司),最后希望預(yù)測(cè)的是該客戶是否會(huì)違約。電子表格組成如下:

          而根據(jù)基礎(chǔ)的業(yè)務(wù)知識(shí)可知,與銀行有關(guān)的數(shù)據(jù)中往往會(huì)存在許多缺失值,以上圖為例,通常情況下只有待預(yù)測(cè)的變量這一列的數(shù)據(jù)是齊全的,畢竟客戶們是否違約這個(gè)行為的歷史數(shù)據(jù)很容易查找,但藍(lán)框和綠框這兩部分的缺失值往往較多,而且較隨意,具體隨意程度參見下圖:

          紅框表示數(shù)據(jù)缺失,這里只展示了部分行和部分列數(shù)據(jù),如果這份數(shù)據(jù)表的規(guī)模為 4萬行 * 50列,那這數(shù)據(jù)缺失的分布得有多隨意啊 ???所以,到底該如何充分利用這殘次不齊的數(shù)據(jù)就成了呈待解決的關(guān)鍵問題。這時(shí)候就可以祭出超級(jí)生動(dòng)形象的 “島嶼 - 湖泊 - 椰子樹”比喻了:

          • 整個(gè)表格看成一座巨大的島嶼,島嶼的長(zhǎng)和寬分別對(duì)應(yīng)電子表格橫軸長(zhǎng)和縱軸的長(zhǎng)度

          • 表中缺失的數(shù)據(jù)段看成一個(gè)個(gè)分布隨意的小湖泊,有數(shù)據(jù)的地方看成陸地

          • 整個(gè)小島地底埋藏著巨大的價(jià)值(數(shù)據(jù)價(jià)值),通過在隨意的種樹(用裝袋法在行列上進(jìn)行隨機(jī)抽樣)來吸取地底的養(yǎng)分,畢竟湖泊上種不了樹,所以只要足夠隨機(jī),就總能充分的利用陸地。

          正因?yàn)槭切辛卸茧S機(jī),才能夠做到真正的把整個(gè)數(shù)據(jù)表隨機(jī)切分成多份,每個(gè)模型使用一份,只要模型的數(shù)量足夠,總有模型能夠在最大程度上獲取數(shù)據(jù)集的價(jià)值。而且因變量的分類往往又是極不平衡的,可以參考原理+代碼|手把手教你使用Python實(shí)戰(zhàn)反欺詐模型。至于如何將這些種好的樹的信息又再收集,便可以將陸地上比較近的幾棵樹上面再弄一個(gè)收集器,把這幾棵樹從陸地上收集到的養(yǎng)分再遞進(jìn)一層匯總,最終實(shí)現(xiàn)陸地養(yǎng)分匯總于樹木,樹木養(yǎng)分匯總于收集器,收集器養(yǎng)分匯總于更上層的另一個(gè)收集器,最終實(shí)現(xiàn)整片數(shù)據(jù)海洋中多個(gè)島嶼的信息匯總,這便是周志華團(tuán)隊(duì)和螞蟻金服的合作的用分布式深度隨機(jī)森林算法檢測(cè)套現(xiàn)欺詐。

          隨機(jī)森林第一步之后的操作完全可以參照集成學(xué)習(xí)——裝袋法中提及的步驟。

          問:既然每個(gè)模型給出的預(yù)測(cè)結(jié)果最后都會(huì)被加權(quán),所以隨機(jī)森林中每棵決策樹的權(quán)重是多少?

          答:隨機(jī)森林中每棵決策樹的權(quán)重都是一樣的,如果這個(gè)袋子中有 10 棵決策樹(或者其他模型),那每棵樹給出的預(yù)測(cè)結(jié)果的權(quán)重便是 1/10,這是隨機(jī)森林的特性。如果權(quán)重不一樣的話,便是后續(xù)推文會(huì)提及的Adaboost等集成學(xué)習(xí)中的提升分支了。

          問:裝袋法中袋子中的模型越多越好嗎?袋中用來訓(xùn)練每個(gè)模型的源數(shù)據(jù)比例也是越多越好嗎?

          答:袋子中模型多一點(diǎn)好,袋中用來訓(xùn)練每個(gè)模型的源數(shù)據(jù)比例小一點(diǎn)好,但這并不代表越多越好與越小越好,還得結(jié)合數(shù)據(jù)集特性和一些深層次的模型算法知識(shí)。

          裝袋法的優(yōu)勢(shì)如下:

          • 準(zhǔn)確率明顯高于組合中任何單個(gè)分類器

          • 對(duì)于較大的噪音,表現(xiàn)不至于很差,并且具有魯棒性

          • 不容易過度擬合

          隨機(jī)森林算法的優(yōu)點(diǎn)

          • 準(zhǔn)確率有時(shí)可以和神經(jīng)網(wǎng)絡(luò)媳美,比邏輯回歸高

          • 對(duì)錯(cuò)誤和離群點(diǎn)更加魯棒性

          • 決策樹容易過度擬合的問題會(huì)隨著森林的規(guī)模而削弱

          • 大數(shù)據(jù)情況下速度快(分布式),性能好

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

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


          本次實(shí)戰(zhàn)目標(biāo)為演示隨機(jī)森林的用法和調(diào)優(yōu)方法。因?yàn)榧蓪W(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)一樣,都屬于解釋性較差的黑盒模型,所以我們無需過分探究數(shù)據(jù)集中每個(gè)變量的具體含義,只需關(guān)注最后一個(gè)變量broadband即可,爭(zhēng)取通過如年齡,使用時(shí)長(zhǎng),付情況以及流量和通話情況等變量對(duì)寬帶客戶是否會(huì)續(xù)費(fèi)做出一個(gè)較準(zhǔn)確的預(yù)測(cè)。

          import?pandas?as?pd
          import?numpy?as?np

          df?=?pd.read_csv('broadband.csv')?#?寬帶客戶數(shù)據(jù)
          df.head();?df.info()

          參數(shù)說明


          本代碼文件只為演示隨機(jī)森林的用法和調(diào)優(yōu)方法,所以數(shù)據(jù)參數(shù)我們只需關(guān)注最后一個(gè)broadband 即可0-離開,1-留存。其他自變量意思可不做探究,畢竟真實(shí)工作中的數(shù)據(jù)集也完全不一樣,首先將列名全部小寫

          df.rename(str.lower,?axis='columns',?inplace=True)

          現(xiàn)在查看因變量broadband分布情況,看是否存在不平衡

          from?collections?import?Counter
          print('Broadband:?',?Counter(df['broadband']))?
          ## Broadband:? Counter({0: 908, 1: 206})?比較不平衡。
          ##?根據(jù)原理部分,可知隨機(jī)森林是處理數(shù)據(jù)不平衡問題的利器

          接著拆分測(cè)試集與訓(xùn)練集,客戶id沒有用,故丟棄cust_id,

          y?=?df['broadband']?
          X?=?df.iloc[:,?1:-1]?
          from?sklearn.model_selection?import?train_test_split
          X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?
          ????????????????????????????????????test_size=0.4,?random_state=12345)

          決策樹建模


          我們先進(jìn)行完整的決策樹建模來和隨機(jī)森林進(jìn)行對(duì)比

          import?sklearn.tree?as?tree

          #?直接使用交叉網(wǎng)格搜索來優(yōu)化決策樹模型,邊訓(xùn)練邊優(yōu)化
          from?sklearn.model_selection?import?GridSearchCV
          #?網(wǎng)格搜索的參數(shù):正常決策樹建模中的參數(shù)?-?評(píng)估指標(biāo),樹的深度,
          ?##?最小拆分的葉子樣本數(shù)與樹的深度
          param_grid?=?{'criterion':?['entropy',?'gini'],
          ?????????????'max_depth':?[2,?3,?4,?5,?6,?7,?8],
          ?????????????'min_samples_split':?[4,?8,?12,?16,?20,?24,?28]}?
          ????????????????#?通常來說,十幾層的樹已經(jīng)是比較深了

          clf?=?tree.DecisionTreeClassifier()??#?定義一棵樹
          clfcv?=?GridSearchCV(estimator=clf,?param_grid=param_grid,?
          ????????????????????????????scoring='roc_auc',?cv=4)?
          ????????#?傳入模型,網(wǎng)格搜索的參數(shù),評(píng)估指標(biāo),cv交叉驗(yàn)證的次數(shù)
          ??????##?這里也只是定義,還沒有開始訓(xùn)練模型
          ??????
          clfcv.fit(X=X_train,?y=y_train)

          #?使用模型來對(duì)測(cè)試集進(jìn)行預(yù)測(cè)
          test_est?=?clfcv.predict(X_test)

          #?模型評(píng)估
          import?sklearn.metrics?as?metrics

          print("決策樹準(zhǔn)確度:")
          print(metrics.classification_report(y_test,test_est))?
          ????????#?該矩陣表格其實(shí)作用不大
          print("決策樹?AUC:")
          fpr_test,?tpr_test,?th_test?=?metrics.roc_curve(y_test,?test_est)
          print('AUC?=?%.4f'?%metrics.auc(fpr_test,?tpr_test))

          AUC 大于0.5是最基本的要求,可見模型精度還是比較糟糕的,決策樹的調(diào)優(yōu)技巧就不再過多展開,我們將在隨機(jī)森林調(diào)優(yōu)部分展示

          隨機(jī)森林建模


          隨機(jī)森林建模一樣是使用網(wǎng)格搜索,有關(guān)Python實(shí)現(xiàn)隨機(jī)森林建模的詳細(xì)參數(shù)解釋可以看代碼的注釋

          param_grid?=?{
          ????'criterion':['entropy','gini'],
          ????'max_depth':[5,?6,?7,?8],????#?深度:這里是森林中每棵決策樹的深度
          ????'n_estimators':[11,13,15],??#?決策樹個(gè)數(shù)-隨機(jī)森林特有參數(shù)
          ????'max_features':[0.3,0.4,0.5],
          ?????#?每棵決策樹使用的變量占比-隨機(jī)森林特有參數(shù)(結(jié)合原理)
          ????'min_samples_split':[4,8,12,16]??#?葉子的最小拆分樣本量
          }

          import?sklearn.ensemble?as?ensemble?#?ensemble?learning:?集成學(xué)習(xí)

          rfc?=?ensemble.RandomForestClassifier()
          rfc_cv?=?GridSearchCV(estimator=rfc,?param_grid=param_grid,
          ??????????????????????scoring='roc_auc',?cv=4)
          rfc_cv.fit(X_train,?y_train)

          #?使用隨機(jī)森林對(duì)測(cè)試集進(jìn)行預(yù)測(cè)
          test_est?=?rfc_cv.predict(X_test)
          print('隨機(jī)森林精確度...')
          print(metrics.classification_report(test_est,?y_test))
          print('隨機(jī)森林?AUC...')
          fpr_test,?tpr_test,?th_test?=?metrics.roc_curve(test_est,?y_test)
          ?????#?構(gòu)造?roc?曲線
          print('AUC?=?%.4f'?%metrics.auc(fpr_test,?tpr_test))

          可以看到,模型的精度大大提升

          為什么要打印梯度優(yōu)化給出的最佳參數(shù)?打印梯度優(yōu)化結(jié)果的最佳參數(shù)的目的是為了判斷這個(gè)分類模型的各種參數(shù)是否在決策邊界上,簡(jiǎn)言之,我們不希望決策邊界限制了這個(gè)模型的效果。(通常這時(shí)候會(huì)先把復(fù)雜度放一邊)

          不難發(fā)現(xiàn),參數(shù)max_depth, min_samples_split, 和n_estimators 這三個(gè)參數(shù)的范圍設(shè)置可能有限制模型精度的可能,所以需要適當(dāng)調(diào)整

          """
          {'criterion':?'gini',
          ?'max_depth':?8,??在最大值邊界上,所以這個(gè)參數(shù)的最大值范圍應(yīng)該再調(diào)大
          ?'max_features':?0.5,??也在最大值邊界上,說明這個(gè)參數(shù)的最小值范圍應(yīng)該再調(diào)大
          ?'min_samples_split':?4,?同理,在最小邊界上,可考慮把范圍調(diào)小
          ?'n_estimators':?15?同理,在最大邊界上,可以適當(dāng)調(diào)大范圍
          ?"""

          ?#?調(diào)整結(jié)果
          ?param_grid?=?{
          ????'criterion':['entropy','gini'],
          ????'max_depth':[7,?8,?10,?12],?
          ????#?前面的?5,6?也可以適當(dāng)?shù)娜サ?,反正已?jīng)沒有用了
          ????'n_estimators':[11,?13,?15,?17,?19],??#決策樹個(gè)數(shù)-隨機(jī)森林特有參數(shù)
          ????'max_features':[0.4,?0.5,?0.6,?0.7],
          ?????#每棵決策樹使用的變量占比-隨機(jī)森林特有參數(shù)
          ????'min_samples_split':[2,?3,?4,?8,?12,?16]??#?葉子的最小拆分樣本量

          現(xiàn)在來查看再次建模的結(jié)果

          此時(shí)都在決策邊界內(nèi)了,但其實(shí)調(diào)整參數(shù)是門技術(shù)活,并不只是通過決策邊界這一單一指標(biāo)來調(diào)整,后續(xù)推文會(huì)陸續(xù)更新。

          小結(jié)


          最后總結(jié)一下:隨機(jī)森林是集成學(xué)習(xí)中非常經(jīng)典的一種方法,基礎(chǔ)原理簡(jiǎn)單,實(shí)現(xiàn)優(yōu)雅,可即學(xué)即用。而且隨機(jī)森林應(yīng)用十分廣泛,并不只是局限于常見的金融領(lǐng)域,只要數(shù)據(jù)不平衡或者隨機(jī)缺失嚴(yán)重,都值得嘗試。如果你也對(duì)本文使用的數(shù)據(jù)和代碼感興趣,可以在后臺(tái)回復(fù)0726獲取,我們下個(gè)案例見。


          今日干貨已送達(dá)
          喜歡本系列文章的話
          點(diǎn)個(gè)在看支持創(chuàng)作!
          ?收到收到

          瀏覽 133
          點(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>
                  色逼色逼色逼 | 在线播放高清无码 | 99精品视频在线播放免费 | 厂里宿舍少妇愉情视频 | 久99久热 |