久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

原理 代碼|深入淺出Python隨機(jī)森林預(yù)測實(shí)戰(zhàn)

 學(xué)外語做頭發(fā) 2020-07-26

本文是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ù)測寬帶客戶的流失,主要將分為兩個(gè)部分:

  • 詳細(xì)原理介紹

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

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

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

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

假設(shè)有10萬條原始數(shù)據(jù),,用這些數(shù)據(jù)來做十棵決策樹(當(dāng)然也可以是其他模型),最后這10棵樹將被裝進(jìn)了同一個(gè)袋子中,。這時(shí)候取其中一條數(shù)據(jù)放入這個(gè)袋子,,便會(huì)得出10個(gè)預(yù)測值(每棵樹各一個(gè)),假如其中三棵樹給出的預(yù)測值為0,,剩余的七棵給出的為1,,那我們便可知道這個(gè)袋子對(duì)這個(gè)數(shù)據(jù)的預(yù)測結(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ù)測結(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ù)場景,來自某城市商業(yè)銀行,。我們有一大個(gè)電子表格存著大量的歷史數(shù)據(jù),,大概50多個(gè)變量(50多列),變量們來自幾個(gè)不同的公司如人行,,電信等(同一個(gè)客戶在不同公司),,最后希望預(yù)測的是該客戶是否會(huì)違約。電子表格組成如下:

而根據(jù)基礎(chǔ)的業(yè)務(wù)知識(shí)可知,,與銀行有關(guān)的數(shù)據(jù)中往往會(huì)存在許多缺失值,,以上圖為例,通常情況下只有待預(yù)測的變量這一列的數(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è)表格看成一座巨大的島嶼,,島嶼的長和寬分別對(duì)應(yī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ī)森林算法檢測套現(xiàn)欺詐

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

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

答:隨機(jī)森林中每棵決策樹的權(quán)重都是一樣的,,如果這個(gè)袋子中有 10 棵決策樹(或者其他模型),,那每棵樹給出的預(yù)測結(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)勢如下:

  • 準(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即可,爭取通過如年齡,,使用時(shí)長,,支付情況以及流量和通話情況等變量對(duì)寬帶客戶是否會(huì)續(xù)費(fèi)做出一個(gè)較準(zhǔn)確的預(yù)測

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ù)不平衡問題的利器

接著拆分測試集與訓(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ì)測試集進(jìn)行預(yù)測
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ì)測試集進(jìn)行預(yù)測
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ù)是否在決策邊界上,簡言之,,我們不希望決策邊界限制了這個(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é)果

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多