機器學習-決策樹 Decision Tree

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

  • Decision Tree 在sklearn中的實現

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

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)

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

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

上面是一個最簡單的數據分割代碼,默認是將(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的,dom

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)

在解釋上面的代碼以前,我們先來講說什麼是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的。好了廢話很少說,直接上圖啦函數

 

 

 

 先來解釋一下一個簡單的概念,就是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的多樣性。學習

相關文章
相關標籤/搜索