摘要: 一份關於決策樹的基本介紹,用實例說明詳細講解。
還在爲如何抉擇而感到糾結嗎?快採用決策樹(Decision Tree)算法幫你作出決定吧。決策樹是一類很是強大的機器學習模型,具備高度可解釋的同時,在許多任務中也有很高的精度。決策樹在機器學習模型領域的特殊之處在於其信息表示的很清楚,而不像一些機器學習方法是個黑匣子,這是由於決策樹經過訓練學到的「知識」直接造成層次結構,該結構以這樣的方式保存和顯示學到的知識,即便是非專業人士也能夠容易地弄明白。算法
在現實生活中,咱們經常用過相似於決策樹的方式來決定本身的生活。例如,決定週末安排什麼樣的活動。採起怎樣的活動可能取決於一些因素,好比是否願意和朋友一塊兒出去或獨自度過週末、週末的天氣如何等。假設就這兩個因素影響你作出決定的話,若是天氣晴朗,而且你的朋友能夠一塊兒參與,那麼你可能想踢足球。若是是下雨天,可能會一塊兒去看電影。若是朋友有事沒法參加,那麼不管天氣如何,可能會去看會書、玩會電子遊戲。網絡
這就是現實中的一個明顯的決策樹例子,上述已經構建了一個樹來模擬一組順序的、層次化的決策,最終獲得一個結果。這裏,爲了保持樹的小巧,還選擇了至關「高級」的決策。例如,若是爲天氣設置了許多可能的選項,例如晴天(25度)、下雨(25度)、晴天(26度)、下雨(26度)、晴天(27度)...... 等等,這樣會使得樹尺寸會很大,這種精確的溫度對於最後作出的決策沒有太相關的關係,由於只是想知道是外界是否下雨,根據下雨的狀況決定是否外出,而溫度的高低對其影響很小。固然,極寒極熱天氣仍是在家比較舒服。機器學習
機器學習中的決策樹的概念和上面的思想是相同的,須要構建一個具備一組分層決策的樹,最終給出決策結果,即分類或迴歸預測。儘量使得決策樹尺寸較小,同時要實現高分類/迴歸準確性。函數
決策樹模型的構建通常分爲兩個步驟:概括(induction)和修剪(pruning)。概括是實際構建樹的步驟,即根據咱們的數據設置全部的分層決策邊界。但因爲訓練決策樹的性質,樹模型可能容易出現嚴重的過擬合現象。這個時候就須要採用修剪處理,修剪就是從決策樹中刪除沒必要要的分支結構的過程,有效地下降了對抗過擬合的複雜性,並使其更容易解釋。工具
從高層次來看,決策樹概括須要通過4個主要步驟:學習
第1步很簡單,只需好好分析數據集。對於步驟2,一般使用貪婪算法來選擇要使用的特徵和特定分割,以最小化代價函數。構建決策樹時執行的拆分至關於劃分特徵空間。咱們將迭代地嘗試不一樣的分割點,最後選擇成本最低的分割點。也能夠只在數據集中的值範圍內進行拆分,這將使得咱們免於浪費計算來測試那些表現差的分裂點。測試
對於迴歸樹,可使用簡單的平方偏差做爲模型的代價函數:優化
其中,Y是指望輸出,Y-hat是預測值,對數據集中的全部樣本求和以得到總偏差。對於分類,使用的是基尼指數函數(Gini Index Function):spa
其中pk是特定預測節點中第k類的訓練實例樣本的比例。理想狀況下, 節點的錯誤值應爲零,這意味着每一個拆分輸出的類正是咱們想要的,一旦到達那個特定的決策節點,不管處於決策邊界的這一邊仍是另外一邊,其輸出也肯定好了。code
在數據集中具備單個分類的概念被稱爲信息增益。如下是舉例:
若是選擇了某種劃分,其中每一個輸出根據輸入數據混合類別,這種狀況實際上根本沒有得到任何信息; 另外一方面,若是採起的分割對於每一個輸出的類的正確率都很高,那麼已經得到 了在具體特徵變量上以特定方式分割的信息。
以後是對樹模型進行分裂,直到樹有數千個分支,但這不是一個好主意!這樣獲得的決策樹將是巨大的、緩慢的,而且會過擬合訓練數據集。所以,須要設置一些預約義的中止標準來中止樹的構造。
最多見的中止方法是對分配給每一個葉節點的訓練樣本的數量使用最小數量。若是計數小於某個最小值,則不接受拆分,並將該節點做爲最終葉節點。若是全部的葉子節點都成爲最終節點,則訓練中止。較小的最小數量將提供更精細的分割和信息,但也容易過擬合訓練數據。所以,最小數量的取值一般基於數據集設置,具體取決於每一個類中預計有多少個示例樣本。
因爲訓練決策樹的性質,可能容易會出現嚴重的過擬合現象。爲每一個節點設置最小實例數的正確值可能具備挑戰性。大多數狀況下,可能只是但願作出合適的決定,而無需最優的決定。所以,無需使得最小值很是小得到很是複雜的樹,且有不少分裂是多餘的,並無提升模型的準確性。
樹修剪是一種利用修剪樹中沒必要要的分裂的技術。從上層開始,修剪將樹的一部分從嚴格的決策邊界壓縮爲更平滑、更通用的樹,從而有效地下降樹的複雜性。決策樹的複雜性定義爲樹中的分裂數。
一種簡單而高效的修剪方法是遍歷樹中的每一個節點,並評估將其移除後其代價函數上的效果。若是移除後,代價函數變化不大,那就修剪掉該節點。
使用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
:是否預先分配數據以加快擬閤中最佳分割的發現。若是事先對每一個特徵的數據進行排序,訓練算法將更容易找到合適的分裂值;如下是決策樹的優缺點總結,能夠幫助讀者肯定它是否適合各自的問題,以及有關如何有效應用它們的一些提示:
本文爲雲棲社區原創內容,未經容許不得轉載。