1. 程式人生 > >機器學習與資料科學決策樹指南

機器學習與資料科學決策樹指南

還在為如何抉擇而感到糾結嗎?快採用決策樹(Decision Tree)演算法幫你做出決定吧。決策樹是一類非常強大的機器學習模型,具有高度可解釋的同時,在許多工中也有很高的精度。決策樹在機器學習模型領域的特殊之處在於其資訊表示的很清楚,而不像一些機器學習方法是個黑匣子,這是因為決策樹通過訓練學到的“知識”直接形成層次結構,該結構以這樣的方式儲存和顯示學到的知識,即使是非專業人士也可以容易地弄明白。

現實生活中的決策樹

       在現實生活中,我們常常用過類似於決策樹的方式來決定自己的生活。例如,決定週末安排什麼樣的活動。採取怎樣的活動可能取決於一些因素,比如是否願意和朋友一起出去或獨自度過週末、週末的天氣如何等。假設就這兩個因素影響你做出決定的話,如果天氣晴朗,並且你的朋友可以一起參與,那麼你可能想踢足球。如果是下雨天,可能會一起去看電影。如果朋友有事無法參加,那麼無論天氣如何,可能會去看會書、玩會電子遊戲。

       這就是現實中的一個明顯的決策樹例子,上述已經構建了一個樹來模擬一組順序的、層次化的決策,最終得到一個結果。這裡,為了保持樹的小巧,還選擇了相當“高階”的決策。例如,如果為天氣設定了許多可能的選項,例如晴天(25度)、下雨(25度)、晴天(26度)、下雨(26度)、晴天(27度)...... 等等,這樣會使得樹尺寸會很大,這種精確的溫度對於最後做出的決策沒有太相關的關係,因為只是想知道是外界是否下雨,根據下雨的情況決定是否外出,而溫度的高低對其影響很小。當然,極寒極熱天氣還是在家比較舒服。
       機器學習中的決策樹的概念和上面的思想是相同的,需要構建一個具有一組分層決策的樹,最終給出決策結果,即分類或迴歸預測。儘可能使得決策樹尺寸較小,同時要實現高分類/迴歸準確性。

機器學習中的決策樹

       決策樹模型的構建一般分為兩個步驟:歸納(induction)和修剪(pruning)。歸納是實際構建樹的步驟,即根據我們的資料設定所有的分層決策邊界。但由於訓練決策樹的性質,樹模型可能容易出現嚴重的過擬合現象。這個時候就需要採用修剪處理,修剪就是從決策樹中刪除不必要的分支結構的過程,有效地降低了對抗過擬合的複雜性,並使其更容易解釋。

歸納|Induction

從高層次來看,決策樹歸納需要經過4個主要步驟:

  • 訓練資料集應具有一些特徵變數、分類或迴歸輸出;
  • 確定資料集中的“最佳特徵”以分割資料;
  • 將資料拆分為包含此最佳特徵的可能值的子集,這種分裂基本上定義了樹上的節點,即每個節點是基於資料中的某個特徵的分裂點;
  • 使用從步驟3建立的資料子集遞迴地生成新的樹節點,保持分裂直到達到一個優化點,在該點已經通過某種度量優化了最大精度,同時最小化了分裂/節點的數量。

       第1步很簡單,只需好好分析資料集。對於步驟2,通常使用貪婪演算法來選擇要使用的特徵和特定分割,以最小化代價函式。構建決策樹時執行的拆分相當於劃分特徵空間。我們將迭代地嘗試不同的分割點,最後選擇成本最低的分割點。也可以只在資料集中的值範圍內進行拆分,這將使得我們免於浪費計算來測試那些表現差的分裂點。
       對於迴歸樹,可以使用簡單的平方誤差作為模型的代價函式:


其中,Y是期望輸出,Y-hat是預測值,對資料集中的所有樣本求和以獲得總誤差。對於分類,使用的是基尼指數函式(Gini Index Function):


       其中pk是特定預測節點中第k類的訓練例項樣本的比例。理想情況下, 節點的錯誤值應為零,這意味著每個拆分輸出的類正是我們想要的,一旦到達那個特定的決策節點,無論處於決策邊界的這一邊還是另一邊,其輸出也確定好了。
       在資料集中具有單個分類的概念被稱為資訊增益。以下是舉例:


       如果選擇了某種劃分,其中每個輸出根據輸入資料混合類別,這種情況實際上根本沒有獲得任何資訊; 另一方面,如果採取的分割對於每個輸出的類的正確率都很高,那麼已經獲得 了在具體特徵變數上以特定方式分割的資訊。
       之後是對樹模型進行分裂,直到樹有數千個分支,但這不是一個好主意!這樣得到的決策樹將是巨大的、緩慢的,並且會過擬合訓練資料集。因此,需要設定一些預定義的停止標準來停止樹的構造。
       最常見的停止方法是對分配給每個葉節點的訓練樣本的數量使用最小數量。如果計數小於某個最小值,則不接受拆分,並將該節點作為最終葉節點。如果所有的葉子節點都成為最終節點,則訓練停止。較小的最小數量將提供更精細的分割和資訊,但也容易過擬合訓練資料。因此,最小數量的取值通常基於資料集設定,具體取決於每個類中預計有多少個示例樣本。

修剪|Pruning

       由於訓練決策樹的性質,可能容易會出現嚴重的過擬合現象。為每個節點設定最小例項數的正確值可能具有挑戰性。大多數情況下,可能只是希望做出合適的決定,而無需最優的決定。因此,無需使得最小值非常小獲得非常複雜的樹,且有很多分裂是多餘的,並沒有提高模型的準確性。
       樹修剪是一種利用修剪樹中不必要的分裂的技術。從上層開始,修剪將樹的一部分從嚴格的決策邊界壓縮為更平滑、更通用的樹,從而有效地降低樹的複雜性。決策樹的複雜性定義為樹中的分裂數。
       一種簡單而高效的修剪方法是遍歷樹中的每個節點,並評估將其移除後其代價函式上的效果。如果移除後,代價函式變化不大,那就修剪掉該節點。

例項實踐

       使用Scikit Lear中內建的函式來實現分類和迴歸的決策樹是非常容易的。首先載入資料集並初始化決策樹以進行分類。

from sklearn.datasets import load_iris
from sklearn import tree

# Load in our dataset
iris_data = load_iris()

# Initialize our decision tree object
classification_tree = tree.DecisionTreeClassifier()

# Train our decision tree (tree induction + pruning)
classification_tree = classification_tree.fit(iris_data.data, iris_data.target)

       Scikit.還允許使用graphviz庫視覺化構建的樹,它附帶了一些選項,這些選項將有助於視覺化決策節點,並將模型學到的內容進行分割,下面根據特徵名稱對節點進行著色,並顯示每個節點的類和特徵資訊:

import graphviz 
dot_data = tree.export_graphviz(classification_tree, out_file=None, 
                     feature_names=iris.feature_names,  
                     class_names=iris.target_names,  
                     filled=True, rounded=True,  
                     special_characters=True)  
graph = graphviz.Source(dot_data)  
graph.render("iris") 

 


       也可以在Scikit Learn中為決策樹模型設定幾個引數。以下是一些有趣的嘗試以獲得更好的結果:

  • max_depth:樹的最大深度,類似於深度神經網路中的最大層數。較淺會使得模型更快但不準確;更深的模型可能會使得準確性更高,但過擬合的風險也增大,且執行很慢;
  • min_samples_split: 拆分節點所需的最小樣本數, 將其設定為合適的值將有助於減輕過擬合;
  • max_features:查詢最佳拆分時要考慮的特徵數,更高可能意味著更好的結果,但訓練也需要更長的時間;
  • min_impurity_split:樹生長早期停止的閾值,如果節點的雜質高於閾值,則該節點將分裂,可用於權衡對抗過擬合(高值、小樹)與高精度(低值、大樹);
  • presort:是否預先分配資料以加快擬閤中最佳分割的發現。如果事先對每個特徵的資料進行排序,訓練演算法將更容易找到合適的分裂值;

實際中應用決策樹的技巧

以下是決策樹的優缺點總結,可以幫助讀者確定它是否適合各自的問題,以及有關如何有效應用它們的一些提示:

優點| Pros

  • 易於理解和解釋:在每個節點都能夠確切地看到模型做出了什麼決定。在實踐中,能夠完全理解準確度和誤差來自何處,模型可以很好地處理哪種型別的資料,以及輸出如何受到特徵值的影響。Scikit learn的視覺化工具是視覺化和理解決策樹的絕佳選擇;
  • 需要準備很少的資料:許多機器學習模型可能需要大量的資料預處理,例如歸一化,並且可能需要複雜的正則化方案。另一方面,在調整了一些引數後,決策樹可以很好地做到開箱即用;
  • 使用樹進行推理的計算成本與訓練樹的資料集呈對數關係,這是一個巨大的優勢,意味著輸入更多的資料不一定會對推理速度產生巨大的影響;

缺點|Cons

  • 由於訓練的性質,過擬合在決策樹中很常見。通常建議執行某種型別的降維,例如PCA, 以便樹不必學習如此多的特徵上的拆分;
  • 出於與過擬合情況類似的原因,決策樹也容易變得偏向於在資料集中佔多數的類別,對不平衡資料進行某種類平衡(例如類權重、取樣或專門的損失函式)操作是一個不錯的主意。

 

原文連結
本文為雲棲社群原創內容,未經允許不得轉載。