0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Random Forest算法 python實(shí)現(xiàn)案例分析

sekJ_AI_class_v ? 2019-09-23 09:58 ? 次閱讀

Randomw Forest算法 python實(shí)現(xiàn),該系列文章主要是對(duì)常見(jiàn)的機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn)。

完整的筆記和代碼以上傳到Github,地址為(覺(jué)得有用的話(huà),歡迎Fork,請(qǐng)給作者個(gè)Star):

https://github.com/Vambooo/lihang-dl

隨機(jī)森林 Random Forest

隨機(jī)森林是對(duì)多棵樹(shù)組合對(duì)樣本訓(xùn)練預(yù)測(cè)的一種分類(lèi)器,它是Bagging方法的最流行的版本之一。

可以理解為隨機(jī)森林是個(gè)體模型為決策樹(shù)的Bagging算法。

隨機(jī)森林由Breiman提出的一種分類(lèi)算法,它使用Bootstrap重采樣技術(shù),從原始訓(xùn)練樣本集中有放回的重復(fù)隨機(jī)抽取n個(gè)樣本生成新的樣本集合,以此作為訓(xùn)練集來(lái)訓(xùn)練決策樹(shù)。然后按照上述步驟生成m棵決策樹(shù)組合而成隨機(jī)森林。

隨機(jī)森林算法

Random Forest算法案例 python實(shí)現(xiàn)

(代碼可以左右滑動(dòng)看)

第一步:構(gòu)建數(shù)據(jù)(這里用make_blobs()來(lái)構(gòu)建聚類(lèi)數(shù)據(jù))

X, y = make_blobs(n_samples=3000, centers=2, random_state=42, cluster_std=1.0)

n_samples是待生成的樣本的總數(shù);
n_features是每個(gè)樣本的特征數(shù);
centers表示類(lèi)別數(shù);
cluster_std表示每個(gè)類(lèi)別的方差。

from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=300, centers=4,
random_state=0, cluster_std=1.0)plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='rainbow');

定義樹(shù)的可視化方法

def visualize_tree(estimator, X, y, boundaries=True, 
                  xlim=None, ylim=None, ax=None): 
   ax = ax or plt.gca() 
       # 繪制訓(xùn)練點(diǎn)    ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap='viridis', 
              clim=(y.min(), y.max()), zorder=3)  
  ax.axis('tight')    ax.axis('off')    if xlim is None:
        xlim = ax.get_xlim()    if ylim is None: 
       ylim = ax.get_ylim()  
      # 擬合估計(jì)器    estimator.fit(X, y)  
  xx, yy = np.meshgrid(np.linspace(*xlim, num=200),                   
      np.linspace(*ylim, num=200))    Z = estimator.predict(np.c_[xx.ravel(), yy.ravel()])
    # 將結(jié)果放入到帶顏色的圖中    n_classes = len(np.unique(y))  

  Z = Z.reshape(xx.shape)    contours = ax.contourf(xx, yy, Z, alpha=0.3,                      
     levels=np.arange(n_classes + 1) - 0.5,                      
     cmap='viridis',zorder=1)
    ax.set(xlim=xlim, ylim=ylim)    
    # 繪制決策邊界    def plot_boundaries(i, xlim, ylim):     

   if i >= 0:      
      tree = estimator.tree_              
      if tree.feature[i] == 0:           
     ax.plot([tree.threshold[i], tree.threshold[i]], ylim, '-k', zorder=2)   
             plot_boundaries(tree.children_left[i],      
                          [xlim[0], tree.threshold[i]], ylim)   
             plot_boundaries(tree.children_right[i],                            
    [tree.threshold[i], xlim[1]], ylim)                    elif tree.feature[i] == 1:  
              ax.plot(xlim, [tree.threshold[i], tree.threshold[i]], '-k', zorder=2)         
       plot_boundaries(tree.children_left[i], xlim,                     
           [ylim[0], tree.threshold[i]])         
       plot_boundaries(tree.children_right[i], xlim,                       
         [tree.threshold[i], ylim[1]])          
      if boundaries:   
     plot_boundaries(0, xlim, ylim)

定義分類(lèi)器的可視化方法

def visualize_classifier(model, X, y, ax=None, cmap='rainbow'):  
  ax = ax or plt.gca()    
    # 繪制訓(xùn)練點(diǎn)    ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=cmap,    
           clim=(y.min(), y.max()), zorder=3)    ax.axis('tight') 
   ax.axis('off')    xlim = ax.get_xlim()    ylim = ax.get_ylim()     
   # 擬合估計(jì)器    model.fit(X, y)
   xx, yy = np.meshgrid(np.linspace(*xlim, num=200),                   
      np.linspace(*ylim, num=200))  
  Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
    # 將擬合結(jié)果繪制在帶顏色的圖中  
  n_classes = len(np.unique(y))  
  contours = ax.contourf(xx, yy, Z, alpha=0.3,     
  levels=np.arange(n_classes + 1) - 0.5,    
  cmap=cmap,                        
    zorder=1)
    ax.set(xlim=xlim, ylim=ylim)
#定義可設(shè)置深度的決策樹(shù)分類(lèi)器def depth_tree(depth=5):    clf = DecisionTreeClassifier(max_depth=depth, random_state=0)    visualize_tree(clf, X, y)

深度為1的決策樹(shù)分類(lèi)器,分類(lèi)效果

from sklearn.tree import DecisionTreeClassifiertree = DecisionTreeClassifier().fit(X, y)visualize_classifier(DecisionTreeClassifier(), X, y)

深度為5的決策樹(shù)分類(lèi)器,分類(lèi)效果

depth_tree(depth=5)

深度為10的決策樹(shù)分類(lèi)器,分類(lèi)效果

depth_tree(depth=10)

深度為15的決策樹(shù)分類(lèi)器,分類(lèi)效果

depth_tree(depth=15)

如上圖,當(dāng)決策樹(shù)的深度不斷增加時(shí),會(huì)出現(xiàn)不同的分類(lèi)區(qū)域,比如當(dāng)depth=10時(shí),在黃色和藍(lán)色之間存在一條紫色區(qū)域,這塊數(shù)據(jù)應(yīng)該是噪聲或者特定采樣的結(jié)果,這塊不能歸為紫色一類(lèi),這種現(xiàn)象其實(shí)就是過(guò)擬合。

可以通過(guò)組合多個(gè)分類(lèi)器(這里是決策樹(shù)分類(lèi)器)來(lái)減少這個(gè)種過(guò)擬合的影響。這也是Bagging的思想。

下面就是使用Bagging來(lái)組合100個(gè)DecisionTreeClassifier來(lái)進(jìn)行測(cè)試。其中使用80%的數(shù)據(jù)來(lái)隨機(jī)化數(shù)據(jù)

from sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import BaggingClassifier
tree = DecisionTreeClassifier()bag = BaggingClassifier(tree, n_estimators=100, max_samples=0.8,                        random_state=1)
bag.fit(X, y)visualize_classifier(bag, X, y)

也可以直接使用Scikit-learn中已定義好的RandomForestClassifier來(lái)實(shí)現(xiàn)

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, random_state=0)visualize_classifier(model, X, y);

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8320

    瀏覽量

    132165
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4756

    瀏覽量

    84283
  • 隨機(jī)森林
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

    4250

原文標(biāo)題:機(jī)器學(xué)習(xí)筆記系列(十四) | Random Forest算法 python實(shí)現(xiàn)

文章出處:【微信號(hào):AI_class_vip,微信公眾號(hào):人工智能學(xué)研社】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用python實(shí)現(xiàn)KNN算法

    K近鄰python實(shí)現(xiàn)
    發(fā)表于 10-25 17:24

    Python的Apriori算法和FP-Growth算法是什么

    [源碼和文檔分享]基于Python實(shí)現(xiàn)的Apriori算法和FP-Growth算法的頻繁項(xiàng)集挖掘的研究與實(shí)現(xiàn)
    發(fā)表于 06-04 12:49

    KNN分類(lèi)算法python代碼實(shí)現(xiàn)

    kNN分類(lèi)算法Python實(shí)現(xiàn)
    發(fā)表于 06-05 12:02

    Python實(shí)現(xiàn)k-近鄰算法

    算法。5、測(cè)試算法:計(jì)算錯(cuò)誤率。6、使用算法:首先需要輸入樣本數(shù)據(jù)和結(jié)構(gòu)化的輸出結(jié)果,然后運(yùn)行k-近鄰算法判定輸入數(shù)據(jù)分別屬于哪個(gè)分類(lèi),最后應(yīng)用對(duì)計(jì)算出的分類(lèi)執(zhí)行后續(xù)的處理。關(guān)于k-近
    發(fā)表于 01-04 14:03

    random

    random.rar
    發(fā)表于 02-25 15:58 ?6次下載

    BP神經(jīng)網(wǎng)絡(luò)算法 python實(shí)現(xiàn)

    直接上代碼是最有效的學(xué)習(xí)方式。這篇教程通過(guò)由一段簡(jiǎn)短的 python 代碼實(shí)現(xiàn)的非常簡(jiǎn)單的實(shí)例來(lái)講解 BP 反向傳播算法
    發(fā)表于 12-29 14:06 ?2.1w次閱讀
    BP神經(jīng)網(wǎng)絡(luò)<b class='flag-5'>算法</b> <b class='flag-5'>python</b><b class='flag-5'>實(shí)現(xiàn)</b>

    大數(shù)據(jù)分析到底需要多少種工具_(dá)大數(shù)據(jù)分析總結(jié)

    大數(shù)據(jù)分析性能的好壞,也就是說(shuō)機(jī)器學(xué)習(xí)預(yù)測(cè)的準(zhǔn)確率,與使用的學(xué)習(xí)算法、問(wèn)題的性質(zhì)、數(shù)據(jù)集的特性包括數(shù)據(jù)規(guī)模、數(shù)據(jù)特征等都有關(guān)系。一般地,Ensemble方法包括Random Forest
    發(fā)表于 01-05 14:37 ?1.2w次閱讀
    大數(shù)據(jù)<b class='flag-5'>分析</b>到底需要多少種工具_(dá)大數(shù)據(jù)<b class='flag-5'>分析</b>總結(jié)

    蟻群算法python編程實(shí)現(xiàn)

    本文主要介紹了Python編程實(shí)現(xiàn)蟻群算法詳解,涉及螞蟻算法的簡(jiǎn)介,主要原理及公式,以及Python中的
    發(fā)表于 02-02 10:36 ?7412次閱讀
    蟻群<b class='flag-5'>算法</b><b class='flag-5'>python</b>編程<b class='flag-5'>實(shí)現(xiàn)</b>

    Python基礎(chǔ)教程之《Python機(jī)器學(xué)習(xí)—預(yù)測(cè)分析核心算法》免費(fèi)下載

     在學(xué)習(xí)和研究機(jī)器學(xué)習(xí)的時(shí)候,面臨令人眼花繚亂的算法,機(jī)器學(xué)習(xí)新手往往會(huì)不知所措。本書(shū)從算法Python 語(yǔ)言實(shí)現(xiàn)的角度,幫助讀者認(rèn)識(shí)機(jī)器學(xué)習(xí)。
    發(fā)表于 09-29 08:00 ?19次下載

    多元統(tǒng)計(jì)分析:R與Python實(shí)現(xiàn)

    多元統(tǒng)計(jì)分析:R與Python實(shí)現(xiàn)說(shuō)明。
    發(fā)表于 05-27 11:27 ?10次下載

    Python實(shí)現(xiàn)所有算法-基本牛頓法

    Python實(shí)現(xiàn)所有算法-二分法 Python實(shí)現(xiàn)所有算法-力系統(tǒng)是否靜態(tài)平衡
    的頭像 發(fā)表于 07-13 10:40 ?1571次閱讀

    [源代碼]Python算法詳解

    [源代碼]Python算法詳解[源代碼]Python算法詳解
    發(fā)表于 06-06 17:50 ?0次下載

    基于Python實(shí)現(xiàn)隨機(jī)森林算法

    機(jī)器學(xué)習(xí)算法是數(shù)據(jù)挖掘、數(shù)據(jù)能力分析和數(shù)學(xué)建模必不可少的一部分,而隨機(jī)森林算法和決策樹(shù)算法是其中較為常用的兩種算法,本文將會(huì)對(duì)隨機(jī)森林
    的頭像 發(fā)表于 09-21 11:17 ?1105次閱讀
    基于<b class='flag-5'>Python</b><b class='flag-5'>實(shí)現(xiàn)</b>隨機(jī)森林<b class='flag-5'>算法</b>

    如何使用Python生成四位隨機(jī)數(shù)字

    為了實(shí)現(xiàn)這些目標(biāo),Python 為我們提供了random() 模塊。random() 是一個(gè)內(nèi)置的 Python 模塊,用于生成隨機(jī)數(shù)。
    的頭像 發(fā)表于 04-15 12:47 ?530次閱讀

    Python建模算法與應(yīng)用

    Python作為一種功能強(qiáng)大、免費(fèi)、開(kāi)源且面向?qū)ο蟮木幊陶Z(yǔ)言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡(jiǎn)潔的語(yǔ)法、對(duì)動(dòng)態(tài)輸入的支持以及解釋性語(yǔ)言的本質(zhì),使得Python在多個(gè)平臺(tái)
    的頭像 發(fā)表于 07-24 10:41 ?368次閱讀