01.22 機器學習-決策樹 Decision Tree

咱們正式進入了機器學習的模型的部分,雖然現在最火的的機器學習方面的庫是Tensorflow, 但是這裡還是先簡單介紹一下另一個數據處理方面很火的庫叫做sklearn。其實咱們在前面已經介紹了一點點sklearn,主要是在categorical data encoding那一塊。其實sklearn在數據建模方面也是非常666的。一般常用的模型都可以用sklearn來做的。既然它都這麼牛逼了,咱們為啥還要學TensorFlow呢?其實主要的原因有兩個,一是因為Google在流量方面的強勢推廣,導致絕大部分的機器學習方面的應用都是用TensorFlow, 二是因為TensorFlow包括的常用庫確實要更加多一點。所以導致現在TensorFlow直接火到爆。所以sklearn在模型方面的應用,咱們只在決策樹這裡講一下,都免絕大部分的模型還是用TensorFlow來解釋,畢竟它的市場更加大嘛。這裡沒有啥好壞之分的,他們的API都寫的很清楚,無論選什麼框架,大家自己起看看文檔都可以的。這節內容主要分兩部分,第一部分介紹決策樹在sklearn中的應用,第二部分作為補充內容介紹決策樹的原理(決策樹的構建原理)。

  • Decision Tree 在sklearn中的實現

決策樹其實很簡單,就是將一條數據中的每一個feature作為一個node,然後根據不同的條件分成不同的分支branch,每一個branch還有一個node,這個node可能還是feature也可能是leave(target)。具體一個決策樹種有多少個node,有多少個leaves,咱們後面再說,這設計到了很多概率和信息熵方面的知識。咱們現在只需要知道一個大致的概念就是,決策樹中的node是咱們的feature,leaves是咱們的target,branch是咱們的split conditions 就行了,具體其中的細節咱們暫時不需要了解,咱們這裡的重點是如何用sklearn這個框架搭建出咱們的決策樹模型。咱們這裡先直接用一個代碼示例來展示,然後再來解釋他的過程。

<code>from sklearn.tree import DecisionTreeRegressor
#1.Define
melb_model = DecisionTreeRegressor()
#2. fit
melb_model.fit(X,y)
#3. predict
melb_house_prediction = melb_model.predict(X)
#4.Mean Absolute Error (MAE)
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y,melb_house_prediction)
/<code>

上面是一個最簡單的用sklearn建模一個decision tree的實例了,其總共包括:實例化決策樹,訓練決策樹,預測,和驗證四個步驟。當然在實際中會有很多的細節部分需要處理,例如第一步實例化的過程有可能會有很多的參數需要調整,如max_depth, min_sample_split等等這些參數,這些都需要根據咱們後面的模型表現來不斷的調整; 其次在驗證階段也是的,咱們得把咱們的數據集分割成training dataset和validation dataset, 這裡面也包括了很多技術來分割和random的;具體這些細節,咱們在後面遇到了再說哈。對於絕大部分的決策樹模型,咱們都可以用上面的4個步驟來創建。既然說到這裡了,咱現在也就簡單的數據分割的api也給大家展示一下。

<code>from sklearn.model_selection import train_test_split
train_X, validate_X, train_y, validate_y = train_test_split(X,y,random_state=0)
/<code>

上面是一個最簡單的數據分割代碼,默認是將(X,y)按照80%,20%比例分割,分別用於training和validation;當然啦,這裡的分割比例也可以自行通過train_test_split函數的參數進行調節。random_state是當做random generator的seed,是將數據打亂後在分割。既然如何用sklearn建模決策樹的內容講了,咱們也順帶把random forest 隨機森林模型在sklearn中如何建模的內容也說了把,畢竟random forest是基於decision tree的,而且random forest建模過程跟decision tree幾乎是一模一樣的,見下面代碼展示如何創建random forest的,

<code>from sklearn.model_selection import train_test_split
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 1)

from sklearn.ensemble import RandomForestRegressor
#define
melb_model = RandomForestRegressor(random_state=1)
#training
melb_model.fit(train_X,train_y)
#prediction
predictions = melb_model.predict(val_X)
#validation
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(val_y, predictions)
/<code>

在解釋上面的代碼之前,咱們先來說說什麼是random forest。大家想一想,既然前面咱們創建了一顆決策樹,那咱們就自然而然的可以建造許多的決策樹然後就可以創建一個森林啦,就叫做隨機森林。用random forest預測的時候,咱們就把test data放進這個隨機森林的每一顆樹裡面去預測,最後咱們取預測的平均值。就是怎麼簡單so easy。咱們現在就理解到這個程度就夠了,實際的底層的創建原理,等咱們把decision tree的創建原理弄懂了以後大家就知道了。咱們看上面的代碼,它跟decision tree只有幾個小區別,第一個就是random forest是一個ensemble,相當於把許多小decision tree模型打包成了一個ensemble;第二個就是他的實例化名稱是RandomForestRegressor。其他都差不多,大家在這裡不需要死記硬背這些代碼,關鍵要了解這裡面的每一步有什麼作用,為什麼需要這些步驟就行了。再一個就是一定得對decision tree和random forest的結構從上層有一個大致的瞭解,對於他們的底層細節結構,咱們可以看看下面的一部分。

  • 決策樹的創建原理

由於在博客中畫圖不方便,我特地花了一張解釋decision tree創建原理的一張圖,然後這部分內容主要是圍繞著這張圖作為一個解釋。這裡面還涉及到一些數學計算和概率的一些內容。所以這幅圖的信息量還是蠻大的。其實說白了,這裡講決策樹的創建原理實際上就是解釋如何每一步從n個features中選擇一個特點的feature作為node,具體是根據一個什麼指標來選擇feature作為node的。好了廢話不多說,直接上圖啦

機器學習-決策樹 Decision Tree

先來解釋一下一個簡單的概念,就是entropy, 中文咱們可以稱作是信息熵。它是一種衡量信息量的值,具體這個值是怎麼的計算的咱們可以看上面的圖片,我上面的圖片還配備了一個簡單的數字實例給演示。在正式解釋之前咱們先來問一問咱們自己一個最基本的問題,那就是decision tree到底是來幹什麼的???decision tree最本質的功能是根據feature的條件來最終分離出不同的信息(這裡的信息咱們可以理解為target)。因而這裡信息熵咱們可以理解為這一組數據可以被分辨(分離的)能力,信息熵越小,越容易被分辨,信息熵越大(1),就越難被分辨出來。Information Gain是父節點的信息熵跟他子節點信息熵之差, I(A)的值越大,則說明從這個節點獲取的信息就越大,那麼就選這個獲取信息量越大的feature。這個過程就是決策樹中選擇feature的方法。如果上面的理解了,咱們也就順理成章的理解了是如何構建decision tree和random forest的了,他們之間還有一個小區別是,decision tree每一個都要算每一個feature的Information Gain然後才來選擇Information Gain最大的那個feature;而random forest創建它的每一顆tree的過程則是每一步都是隨機選幾個features來就算Information Gain,然後選最大的,從而確保了tree的多樣性。


分享到:


相關文章: