第二十六節決策樹系列之Cart迴歸樹及其參數(5)html
上一節咱們講了不一樣的決策樹對應的計算純度的計算方法,其實都是針對分類來講,本節的話咱們講解迴歸樹的部分。node
目錄python
1-代碼詳解app
對於迴歸樹來講,以前我們講的三個決策樹(ID3,C4.5和Cart樹)裏只有CART樹具備迴歸上的意義,其實它無非就是把分裂條件給變了變,把葉子節點的表達給變了變。剩下的所有過程都是和分類樹沒有區別的。它的分裂條件變成什麼了呢?分裂條件仍然是經過遍歷維度搜索。當你搜索完了,嘗試分裂,你要評估此次分裂是好仍是很差的時候?不能再使用Gini係數和信息熵了。由於每個樣本跟每個樣本之間的結果都不同。你想你原來是怎麼算信息熵和Gini係數的?先看看我這葉子鏈接節點有幾類數據,把它們分別統計一下,算出一個數。而回歸問題,它的y lable有同樣的嗎?應該說沒有同樣的。這種狀況下確定不能用剛纔那個Gini係數和熵來作了。那用什麼呢,用mse來統計。dom
舉例好比下圖:函數
根節點裏有100個數據我嘗試分裂。分裂出兩支來, 一分支是有60個數據。另外一支有40個數據。此時怎麼評估此次的分裂效果呢?先計算這60條數據的y的均值。而後用這60條數據的每個真實的y減去y的均值加平方求和除以60。就得出了這個葉子節點裏邊的平均mse,可以理解吧?那麼右邊同樣,先是計算出40條y平均。用每一條y減去這個y的平均加平方求和,最後乘以各自的權重,仍是要乘以一個1/60和1/40的。那麼你屢次嘗試分裂是否是就獲得 或者你去想它會把y比較相近的一些節點分到同一個節點裏邊去,對不對? 因此這就是迴歸樹的計算流程。評估每次分裂效果的指標咱們叫它mse,它其實是方差。就是一個集合裏邊的每個數減去均值平方統統加起來再除以數目自己,假若有十個數,求這10個數的方差,首先要求出它的均值μ,用每個數減去μ的差的平方,再相加,除一個1/10。這就是這個集合的方差。方差是一個統計學的指標,它描述的是什麼?是這一組數據的離散程度。你方差越大表明這個數據裏邊天差地別,對嗎?天南海北。方差越小,表明這一組數據很是緊密。彼此之間都差不了多少。那咱們既然要作迴歸問題,我最終但願落到這個葉子節點裏邊的lable越近越好仍是越遠越好?那確定是越近越好對吧。我分着分着,越分越近,越分越近,最後獲得的葉子結點都是最近的那些落到同一個葉子節點。那將來預測的時候怎麼辦?它落到某一個葉子節點了。這個葉子節點是否是不知道應該給它輸出多少值啊?它會輸出多少呢?平均值。可以理解嗎?也就是說這個東西迴歸分析作出來以後,它是鋸齒狀的。可以理解嗎?鋸齒狀的一個迴歸分析。例以下圖:工具
就是由於x都落在同一個葉子節點裏邊輸出一個均值。而不象參數型模型了,按理來講,你只要變一點兒,那麼y的結果多多少少都會變一點兒。而這個你的x只要變了一點兒就會影響到你最終落到那一個葉子節點。這樣你給的輸出是否是就都是同樣的了。因此對於迴歸樹來講仍是那四個問題。測試
1、它分幾支,咱們剛纔看了這個數分兩支,對不對?url
2、它怎麼判斷分裂條件。從原來的Gini係數變成了方差。或者說變成了mse
3、它何時中止?仍是那些預剪枝的過程。咱們後面會講。
4、葉子節點怎麼表達。從原來的投票算機率變成了算平均值。就是這麼簡單。
咱們來看下決策樹的應用代碼:
解釋下上面代碼:
一、from sklearn.datasets import load_iris iris = load_iris(),iris['data'] ['target']。這個iris裏邊就包含了iris(data)和(target),這裏邊有兩種調用它的方式。一種你能夠寫iris.Data,一種還有這種字典的方式,索引data,實際上sklearn把咱們這兩種風格的ATI都保留下來了。
二、咱們在這兒引入了一個工具叫pandas,咱們以前簡單的講了講numpy就是一個簡單的玩數組的東西,而pandas就是對numpy簡單的進行了一個增強。原來的numpy是一個數組,pandas給每一列數組起了一個名字。好比說data是數組。你想調用其中一個元素,用numoy來去你就必須寫data[0,0],而pandas分別給行和列起了索引號。可使用名稱來更靈活的調用它,這是其一,也是最根本的區別。其次,pandas裏邊集成了不少方面的數據操做的東西。這兩個就是一個簡單的tool就是兩個簡單的工具。你學Excel有多難學它就有多難能明因此它不是很複雜的東西。pandas裏邊有一個對象叫dataframe其實是叫數據幀,數據幀就是一個帶名稱的二維數組。二維數組只有索引號。而dataframe加了一個名稱。data = pd.DataFrame(iris.data),咱們把這個iris裏邊兒的data拿出來,它是一個numpy數組。二維數組。data扔到dataframe中返回的一個什麼東西呢?返回一個panda裏邊叫df的對象。那df對象有兩個屬性。一個叫columns,是指它這個列的名稱。一個叫index是指行的名稱。
三、而後咱們經過train_test_split 這個工具來劃分出驗證集和測試集。而後咱們新建一個對象叫作DecisionTreeClassifier,而後咱們能夠看到它實際上有兩個類是決策樹的。DecisionTreeClassifier,DecisionTreeRegressor。分別是什麼意思呢?不用我說你們是否是已經明白了?一個是用來作分類的,一個是用來作迴歸的。
四、咱們看下DecisionTreeClassifier的超參數有哪些呢?
criterion,是拿什麼東西來評價的標準。能夠取值gini,Gini越高它越不純。也能夠取值entropy評估的是信息增益。
splitter,取值Best是找到最好的那個分裂。取值random是找到最好的隨機分裂,也就是說它隨機多少次以後,把隨機出來過的最好的結果給你。至關於一個加速運算的東西。至關於找到了一個隨機出來的最優解,有點像隨機梯度的意思。
max-depth,樹的最大深度。這個能夠說是咱們最經常使用的預剪枝的操做手段。咱們不少時候不去設置那些細枝末節的規則。僅僅設一下樹的最大深度,就是你分裂多少層就不要再繼續分裂了。我管你分的好分很差,你都不要再分裂了。
min_samples_split ,除了根結點和葉子結點其餘中間的那些節點分裂一個所須要的最小的樣本量默認是2。意思是這些節點要分裂所需的最小樣本數是2。
min_samples_leaf,葉節點最小樣本數。
min_weight_fraction_leaf,就是你這個葉子結點佔總的比例有多少能成爲葉子結點,這個比較有意思。
max_features,就是說在你尋找最佳切割點的時候要不要考慮全部的維度我們原本是否是遍歷全部的維度?如今改爲隨機取幾個維度遍歷。不取全了,能明白個人意思嗎?由於它要分裂不少層,雖然第一層沒有考慮到這個維度。第二層的時候有可能就考慮到了,若是是default=none那麼若是是none什麼意思啊?所有的維度都要進來去考慮若是你是int那麼是什麼意思呢?你傳一個整形進來。就是每次在尋找切割的時候就隨機的找到。你好比說乘以六。那麼它就隨機找的六個維度去考慮,尋找最佳切割點。那這樣就確定會變的不許了,但會變得更快了。而後若是你傳一個浮點數過來那麼其實是百分比。你好比說傳一個0.6。就是你每一次分裂的時候,就隨機挑選出60%的維度出來,來尋找最佳切割點,若是是auto,是開個根號。好比說你有100個維度。我就給你整十個緯度。可以理解嗎?sqrt也是開根號。Log2是取個log2而後再取,默認的一般是就選none,有多少我就考慮多少。
max_leaf_nodes ,最多的葉子節點也是,若是葉子節點夠多了,你就不用再分裂了。
min_impurity_decrease ,咱們的目的是gini係數必須得變小,我才讓你分裂。你原來的分裂越大,當傳入一個float進來,必需要gini係數必需要縮小多少才能進行這次分裂。
class-weigh,咱們能夠看到全部的函數,分類器也好,迴歸器也好,都會有這個參數。class-weight表明什麼呢?表明每類樣本,你到底有多麼看重它?它的目的是將不一樣的類別映射爲不一樣的權值,該參數用來在訓練過程當中調整損失函數(只能用於訓練)。該參數在處理非平衡的訓練數據(某些類的訓練樣本數不多)時,可使得損失函數對樣本數不足的數據更加關注。
五、咱們創造一個這個DecisionTreeClassifier,而後輸出acc score,而後輸出咱們再驗證集上的準確度,達到了97%,能看到嗎?比以前我們的邏輯迴歸,訓練及效果要好很多。
六、for d in depth,以及下面的代碼大體意思是,我把樹的深度從一到15遍歷了一遍。而後分別畫出這15棵樹到底錯誤率是多少。訓練15個模型,咱們能夠看,隨着樹的深度增長,在4的時候驗證集錯誤率最低,可是後來隨着深度的增長,反倒又上升了。這就有一點點過擬合的意思,但在我們這個數據集裏很難造成過擬合。由於總共才150條數據。可是這個東西你能夠看到,不是說樹越深在驗證集上效果就表現得越好。
下一節裏面咱們會講解決策樹的另外一個問題即何時中止的問題。