1. 程式人生 > >Python 資料科學手冊 5.8 決策樹和隨機森林

Python 資料科學手冊 5.8 決策樹和隨機森林

5.8 決策樹和隨機森林

之前,我們深入研究了簡單的生成分類器(見樸素貝葉斯分類)和強大的辨別分類器(參見支援向量機)。 這裡我們來看看另一個強大的演算法的動機 - 一種稱為隨機森林的非引數演算法。 隨機森林是組合方法的一個例子,這意味著它依賴於更簡單估計器的整體聚合結果。 這種組合方法的結果令人驚訝,總和可以大於部分:即,多個估器中的多數表決最終可能比執行表決的任何個體的估計更好! 我們將在以下部分中看到這個例子。 我們從標準匯入開始:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import
seaborn as sns; sns.set()

隨機森林是一個例子,建立在決策樹上的組合學習器。 因此,我們將首先討論決策樹本身。

決策樹是分類或標註物件的非常直觀的方法:您只需要詢問一系列問題,它們為弄清楚分類而設計。 例如,如果您想建立一個決策樹,來分類您在遠足時遇到的動物,則可以構建如下所示的樹:

二元分割使其非常有效:在一個結構良好的樹中,每個問題都會將選項數量減少一半,即使在大量分類中也很快縮小選項。 當然,這個技巧是決定在每個步驟中要問哪些問題。 在決策樹的機器學習實現中,問題通常採用資料中軸對齊分割的形式:即,樹中的每個節點使用其中一個特徵中的分割值將資料分成兩組。 現在來看一個例子。

建立決策樹

考慮以下二維資料,它擁有四個標籤之一:

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');

根據這些資料建立的一個簡單的決策樹,將根據一些定量標準,沿著一個或另一個軸線迭代地分割資料,並且在每個級別,根據其中的多數表決來分配新區域的標籤。 該圖顯示了該資料的決策樹分類器的前四個級別的視覺化:

請注意,在第一次拆分之後,上部分支中的每個點保持不變,因此無需進一步細分此分支。 除了包含所有一種顏色的節點,在每個級別,每個區域再次沿著兩個特徵之一分裂。

將決策樹擬合到我們的資料的這個過程,可以在 Scikit-Learn 中使用DecisionTreeClassifier估計器來完成:

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

讓我們寫一個簡單的輔助函式,幫助我們展示分類器的輸出:

def visualize_classifier(model, X, y, ax=None, cmap='rainbow'):
    ax = ax or plt.gca()

    # Plot the training points
    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()

    # fit the estimator
    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)

    # Create a color plot with the results
    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, clim=(y.min(), y.max()),
                           zorder=1)

    ax.set(xlim=xlim, ylim=ylim)

現在我們可以檢測,決策樹看起來是什麼樣子:

visualize_classifier(DecisionTreeClassifier(), X, y)

如果您現在正在執行這個筆記,您可以使用“線上附錄”中包含的幫助指令碼,來啟動決策樹構建過程的互動式視覺化:

# helpers_05_08 is found in the online appendix
import helpers_05_08
helpers_05_08.plot_tree_interactive(X, y);

請注意,隨著深度的增加,我們傾向於獲得非常奇怪的分類區域; 例如,在第五層,黃色和藍色區域之間有一個高而瘦的紫色區域。 很明顯,這不是真實的,固有的資料分佈結果,更多的是資料的特定取樣或噪聲屬性的結果。 也就是說,這個決策樹,即使只有五個層次的深度,顯然對我們的資料過擬合了。

決策樹和過擬合

這種過度擬合是決策樹的一般屬性:在樹中很容易就走得太深,從而擬合特定資料的細節,而不是抽取它們分佈的整體屬性。 檢視這種過擬合的另一種方法是,檢視在不同資料子集上訓練的模型 - 例如,在這個圖中,我們訓練兩種不同的樹,每種都是原始資料的一半:

很明顯,在一些地方,兩棵樹產生一致的結果(例如在四個角落),而在其他地方,這兩棵樹給出非常不同的分類(例如,在任何兩個簇之間的區域中)。 關鍵觀察是,分類不太確定的地方,會發生不一致,因此通過使用這兩種樹的資訊,我們可能會得到更好的結果!

如果您正在執行這個筆記,以下功能允許您互動顯示樹的擬合,在資料的隨機子集上訓練:

# helpers_05_08 is found in the online appendix
import helpers_05_08
helpers_05_08.randomized_tree_interactive(X, y)

正如使用來自兩棵樹的資訊,改善了我們的結果,我們可能希望使用來自許多樹的資訊,進一步改善我們的結果。

估計器的組合:隨機森林

這個概念 - 多個過擬合估計器可以組合,來減少這種過擬合的影響 - 是一種稱為裝袋的組合方法。 這個方法使用了一組並行估計器,每個都對資料過擬合,並對結果進行平均以找到更好的分類。 隨機決策樹的一個組合被稱為隨機森林。

這種型別的裝袋分類,可以使用 Scikit-Learn 的BaggingClassifier元估計器手動進行,如下所示:

from sklearn.tree import DecisionTreeClassifier
from 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)

在這個例子中,我們將每個估計器擬合訓練點的 80% 隨機子集進行來隨機化資料。 在實踐中,通過在選擇分割的方式中新增一些隨機性,來更有效地隨機化決策樹:這樣,所有資料每次都有助於擬合,但是擬合的結果仍然具有所需的隨機性。 例如,當確定要分割的特徵時,隨機化樹可以從前幾個特徵中選擇。 您可以在 Scikit-Learn 文件中閱讀這些隨機策略的更多技術細節和參考。

在 Scikit-Learn 中,隨機決策樹的優化組合在RandomForestClassifier估計器中實現,它自動地處理所有的隨機化。 所有你需要做的是選擇一些估計器,它將很快(如果需要則並行)擬合樹的組合:

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, random_state=0)
visualize_classifier(model, X, y);

我們看到,通過對超過 100 個隨機擾動的模型取平均,我們最終得到一個整體模型,更接近我們關於如何分割引數空間的直覺。

隨機森林迴歸

在上一節中,我們在分類範圍內考慮了隨機森林。 隨機森林也可以用於迴歸(即連續而不是分類變數)。 用於此的估計器是RandomForestRegressor,並且語法與我們之前看到的非常相似。

考慮以下資料,由快速和慢速振盪的組合產生:

rng = np.random.RandomState(42)
x = 10 * rng.rand(200)

def model(x, sigma=0.3):
    fast_oscillation = np.sin(5 * x)
    slow_oscillation = np.sin(0.5 * x)
    noise = sigma * rng.randn(len(x))

    return slow_oscillation + fast_oscillation + noise

y = model(x)
plt.errorbar(x, y, 0.3, fmt='o');

使用隨機森林迴歸器,我們可以找到最佳擬合曲線,

這裡的真實模型以灰色平滑曲線中顯示,隨機森林模型由紅色鋸齒曲線顯示。 可以看出,非引數隨機森林模型足夠靈活,可以擬合多週期數據,而不需要指定多週期模型!

示例:隨機森林數字分類

早些時候我們快速瀏覽了手寫數字資料(參見 Scikit-Learn 介紹)。 讓我們再次使用它,來看看如何在這個上下文中使用隨機森林分類器。

from sklearn.datasets import load_digits
digits = load_digits()
digits.keys()
# dict_keys(['target', 'data', 'target_names', 'DESCR', 'images'])

為了提醒我們,我們正在觀察什麼,我們展示前幾個資料點。

# set up the figure
fig = plt.figure(figsize=(6, 6))  # figure size in inches
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)

# plot the digits: each image is 8x8 pixels
for i in range(64):
    ax = fig.add_subplot(8, 8, i + 1, xticks=[], yticks=[])
    ax.imshow(digits.images[i], cmap=plt.cm.binary, interpolation='nearest')

    # label the image with the target value
    ax.text(0, 7, str(digits.target[i]))

我們可以快速使用隨機森林對這些數字分類,像這樣:

from sklearn.cross_validation import train_test_split

Xtrain, Xtest, ytrain, ytest = train_test_split(digits.data, digits.target,
                                                random_state=0)
model = RandomForestClassifier(n_estimators=1000)
model.fit(Xtrain, ytrain)
ypred = model.predict(Xtest)

我們可以看一看分類器的分類報告:

from sklearn import metrics
print(metrics.classification_report(ypred, ytest))
             precision    recall  f1-score   support

          0       1.00      0.97      0.99        38
          1       1.00      0.98      0.99        44
          2       0.95      1.00      0.98        42
          3       0.98      0.96      0.97        46
          4       0.97      1.00      0.99        37
          5       0.98      0.96      0.97        49
          6       1.00      1.00      1.00        52
          7       1.00      0.96      0.98        50
          8       0.94      0.98      0.96        46
          9       0.96      0.98      0.97        46

avg / total       0.98      0.98      0.98       450

為了更好的度量,繪製混淆矩陣:

from sklearn.metrics import confusion_matrix
mat = confusion_matrix(ytest, ypred)
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False)
plt.xlabel('true label')
plt.ylabel('predicted label');

我們發現,簡單無調整的隨機森林,產生了資料的非常準確的分類。

隨機森林總結

本節簡要介紹了組合估計器的概念,特別是隨機森林 - 隨機決策樹的整體。 隨機森林是一個強大的方法,具有幾個優點:

  • 訓練和預測都非常快,因為底層決策樹簡單。 此外,兩個任務都可以直接並行化,因為各個樹是完全獨立的實體。
  • 多個樹提供了概率分類:估計器之間的多數表決提供了概率估計(在 Scikit-Learn 中使用predict_proba()方法來訪問)。
  • 非引數模型是非常靈活的,因此可以在其他估計器擬合不足的任務上表現良好。

隨機森林的主要缺點是結果不容易解釋:即如果要對分類模型的含義作出總結,隨機森林可能不是最佳選擇。

相關推薦

Python 資料科學手冊 5.8 決策隨機森林

5.8 決策樹和隨機森林 之前,我們深入研究了簡單的生成分類器(見樸素貝葉斯分類)和強大的辨別分類器(參見支援向量機)。 這裡我們來看看另一個強大的演算法的動機 - 一種稱為隨機森林的非引數演算法。 隨機森林是組合方法的一個例子,這意味著它依賴於更簡單估計

Python 資料科學手冊 5.7 支援向量機

5.7 支援向量機 支援向量機(SVM)是一種特別強大且靈活的監督演算法,用於分類和迴歸。 在本節中,我們將探索支援向量機背後的直覺,及其在分類問題中的應用。 我們以標準匯入開始: %matplotlib inline import numpy as

python在Scikit-learn中用決策隨機森林預測NBA獲勝者

在本文中,我們將以Scikit學習的決策樹和隨機森林預測NBA獲勝者。美國國家籃球協會(NBA)是北美主要的男子職業籃球聯賽,被廣泛認為是首屈一指的男子職業籃球聯賽在世界上。它有30個團隊(美國29個,

決策隨機森林python treeinterpreter實現

示例說明 這個部落格深入到決策樹和隨機森林的基礎上,以便更好地解釋它們。 在過去的幾年中,隨機森林是一種新興的機器學習技術。它是一種基於非線性樹的模型,可以提供精確的結果。然而,大多是黑箱,通常很難解釋和充分理解。在本文中,我們將深入瞭解隨機森林的基本知

在OpenCV中實現決策隨機森林

目錄 1.決策樹 2.隨機森林 1.決策樹 需要注意的點: Ptr<TrainData> data_set = TrainData::loadFromCSV("mushroom.data",//檔名

機器學習——決策隨機森林演算法

認識決策樹 決策樹思想的來源非常樸素,程式設計中的條件分支結構就是if-then結構,最早的決策樹就是利用這類結構分割資料的一種分類學習方法。 下面以一個問題引出決策樹的思想 這個問題用圖來表示就是這樣: 為什麼先把年齡放在第一個呢,下面就是一個概念:資訊熵 資訊熵

決策隨機森林演算法

決策樹和隨機森林都是常用的分類演算法,它們的判斷邏輯和人的思維方式非常類似,人們常常在遇到多個條件組合問題的時候,也通常可以畫出一顆決策樹來幫助決策判斷。本文簡要介紹了決策樹和隨機森林的演算法以及實現,並使用隨機森林演算法和決策樹演算法來檢測FTP暴力破解和PO

R語言之決策隨機森林

總結決策樹之前先總結一下特徵的生成和選擇,因為決策樹就是一種內嵌型的特徵選擇過程,它的特徵選擇和演算法是融合在一起的,不需要額外的特徵選擇。 一、特徵生成: 特徵生成是指在收集資料之時原始資料就具有的資料特徵,這些資料特徵由收集的資料決定(其實也就是在產品定型時設定的需要收

決策隨機森林

三種決策樹的剪枝過程演算法相同,區別僅是對於當前樹的評價標準不同: 資訊增益(ID3),資訊增益率(C4.5),基尼指數(CART) 一個屬性的資訊增益越大,表明屬性對樣本的熵減少的能力越強。這個屬性使得資料由不確定性變為確定性的能力越強。 決策樹的評價: 對於決策樹的某

Python資料科學手冊-第5章機器學習

文章目錄 機器學習的分類 Scikit-Learn Scikit-Learn的資料表示 Scikit-Learn的評估器API 應用:手寫數字探索 超引數與模型驗證

Python資料科學手冊》高清中文版PDF+高清英文版PDF+原始碼

下載:https://pan.baidu.com/s/1RDTQxG3vjG2xGsX4Mx-5KA 最新出版的《Python資料科學手冊》。 《Python資料科學手冊》高清中文版PDF+高清英文版PDF+原始碼 高清中文版PDF,474頁,帶目錄和書籤,能夠複製貼上;高清英文版PDF,548頁,帶目

Python資料科學手冊 pdf 中文版下載

Python語言擁有大量可用於儲存、操作和洞察資料的程式庫,已然成為深受資料科學研究人員推崇的工具。本書以IPython、NumPy、Pandas、Matplotlib和Scikit-Learn這5個能完成資料科學大部分工作的基礎工具為主,從實戰角度出發,講授如何清洗和視覺化資料、如何用資料建

Python資料科學手冊電子書

原文:http://www.sohu.com/a/156357633_642762 Preface https://nbviewer.jupyter.org/github/jakevdp/PythonDataScienceHandbook/blob/mas

Python資料科學手冊》【中文版英文版】【高清完整版PDF】+【配套原始碼】

下載:https://pan.baidu.com/s/1RDTQxG3vjG2xGsX4Mx-5KA 最新出版的《Python資料科學手冊》。 《Python資料科學手冊》【中文版和英文版】【高清完整版PDF】+【配套原始碼】 高清中文版PDF,474頁,帶目錄和書籤,能夠複製貼上;高清英文版PDF,5

分享《Python資料科學手冊》【高清中文版PDF+高清英文版PDF+原始碼】

下載:https://pan.baidu.com/s/1RDTQxG3vjG2xGsX4Mx-5KA 最新出版的《Python資料科學手冊》。 《Python資料科學手冊》【中文版和英文版】【高清完整版PDF】+【配套原始碼】 高清中文版PDF,474頁,帶目錄和書籤,能夠複製貼上;高清英文版PDF,5

Python 資料科學手冊

內容簡介 本書是對以資料深度需求為中心的科學、研究以及針對計算和統計方法的參考書。本書共五章,每章介紹一到兩個 Python 資料科學中的重點工具包。 第1章 從 IPython 和 Jupyter 開始,它們提供了資料科學家需要的計算環境; 第2章講解能提供 ndarray 物件的

Python資料科學手冊學習筆記

Numpy入門 檢視numpy版本 import numpy numpy.__version__ 2.匯入numpy的匯入 import numpy as np 3.建立陣列 import nu

Python資料科學手冊(高清版)PDF

Python資料科學手冊(高清版)PDF百度網盤連結:https://pan.baidu.com/s/1KurSdjNWiwMac3o3iLrzBg 提取碼:qogy 複製這段內容後開啟百度網盤手機App,操作更方便哦內容簡介 · · · · · · 本書是對以資料深度需求為中心的科學、研究以及針對計算和統計

Python資料科學手冊》第二章 Numpy入門2.1—2.3

 2.1 理解Python中的資料型別         Python的使用者被其易用性所吸引,其中一個易用之處就在於動態輸入,即在Python中,型別是動態推斷的。這意味著可以將任何型別的資料指定給任何變數。但是這種型別靈活性也指出了一個事實: Python

Python資料探勘課程 四.決策DTC資料分析及鳶尾資料集分析

        希望這篇文章對你有所幫助,尤其是剛剛接觸資料探勘以及大資料的同學,同時準備嘗試以案例為主的方式進行講解。如果文章中存在不足或錯誤的地方,還請海涵~ 一. 分類及決策樹介紹 1.分類         分類其實是從特定的資料中挖掘模式,作