AI從業者必須瞭解的決策樹指南

決策樹是一種功能非常強大的機器學習模型,能夠在許多任務中實現高精度,同時具有高可解釋性。決策樹在機器學習模型領域的特殊之處,在於其信息表示的清晰度。決策樹通過訓練獲得的 “知識”,直接形成層次結構。這種結構以這樣的方式保存和展示知識,即使是非專家也可以很容易地理解。

現實生活中的決策樹

你很可能在自己的生活中,使用過決策樹來做出決定。比如說,你決定這個週末應該做什麼活動。這可能取決於你是想和朋友一起出去玩兒還是獨自過週末;在這兩種情況下,你的決定還取決於天氣。如果天氣晴朗,並且朋友也有空,你可能想踢足球。如果最後下雨的話,你就去看電影。如果你朋友根本不來,那麼,無論天氣如何,你都會喜歡去打電競遊戲。

image

這就是一則真實的決策樹的例子。我們構建了一棵樹來模擬一組順序的、層次化的決策,這些決策最終會導致一些最終結果。請注意,爲了保持樹的較小規模,我們還選擇了相當 “高級” 的決策。例如,如果我們爲天氣設置了許多可能的選項,如:25 度的晴天、25 度的雨天、26 度的晴天、26 度的雨天、27 度的晴天…… 等等,這樣我們的樹很快就會變得很大!確切的溫度真的不太重要,我們只是想知道是否可以外出。

在機器學習中,決策樹的概念也是一樣的。我們想要構建一棵樹,這棵樹有一組層次化的決策,這些決策最終會給我們一個最終的結果,即分類或迴歸預測。在選擇決策時,儘可能讓樹的規模較小,同時以實現高分類 / 迴歸準確性爲目標。

機器學習中的決策樹

決策樹模型的創建,使用了兩個步驟:歸納和修剪。歸納是我們實際構建樹的方法,即根據我們的數據設置所有的層次決策邊界。由於訓練決策樹的性質,它們很容易出現嚴重的過擬合。而修剪是從決策樹中刪除不必要的結構的過程,有效地降低了克服過擬合的複雜性,並使其更容易解釋。

感應

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

  1. 從訓練數據集開始,它應該具有一些特徵變量和分類或迴歸輸出。

  2. 確定數據集中的 “最佳特徵”,以便對數據進行分割;稍後我們將詳細介紹如何定義 “最佳特徵”。

  3. 將數據拆分包含此最佳特徵的可能值的子集。這種拆分基本上定義了樹上的節點,即每個節點都是基於我們數據中某個特徵的拆分點。

  4. 通過使用從步驟 3 創建的數據子集遞歸地生成新的樹節點。我們不斷地拆分,直到我們在某種程度上,優化了最大的準確率,同時最小化拆分 / 節點的數量。

步驟 1 很簡單,只需獲取你自己的數據集即可!

對於步驟 2,通常使用貪心法(greedy algorithm)來選擇要使用的特徵和具體的拆分,以便對成本函數進行最小化。如果我們仔細想一想,在構建決策樹時執行拆分相當於劃分特徵空間。我們將反覆嘗試不同的拆分點,然後在最後選擇成本最低的拆分點。當然,我們可以採取一些聰明的做法,比如,只在數據集的值範圍內進行拆分。這樣我們就可以避免將算力浪費在測試那些很槽糕的拆分點上。

對於迴歸樹,我們可以用一個簡單的平方誤差作爲成本函數:

image

其中,Y 是真相,Y-hat 是預測值;我們對數據集中的所有樣本求和來獲得總誤差。對於分類,我們使用基尼指數函數:

image

其中,pk 是特定決策節點中 k 類訓練實例的比例。理想情況下,節點的錯誤值應爲零,這意味着,每次拆分都會 100% 輸出一個類。這正是我們想要的,因爲這樣我們就可以知道,一旦我們到達那個特定的決策節點,我們的輸出到底是什麼,而無論我們在決策邊界的哪一邊。

在我們的數據集中,每次拆分一個類的概念成爲信息增益。看看下面的例子。

image

如果我們要選擇一個拆分,其中每個輸出都有一個依賴於數據的類組合,那麼,我們實際上根本沒有獲得任何信息;我們不知道是否存在這樣的一個特定節點(即特徵),對我們的數據分類有任何影響!另一方面,如果我們的拆分對於每個輸出的每個類都有很高的百分比,那麼我們就會得到這樣的信息,即在特定的特徵變量上以特定的方式對信息進行拆分,會得到一個特定的輸出!

現在,我們當然可以繼續拆分、拆分、拆分…… 直到我們的樹有了成千上萬的分支,但這並不是一個好主意。我們的決策樹將會變得巨大,緩慢,並對我們的訓練數據集過擬合。因此,我們將設置一些預定義的停止標準來停止樹的構造。

最常見的停止方法是對分配給每個葉節點的訓練樣本的數量進行最小計數。如果計數小於某個最小值,則不接受拆分,並將該節點視爲最終葉節點。如果所有的葉節點都成爲最終葉節點,訓練就會停止。最小計數越小,拆分效果就越好,潛在的信息也越多,但是也更容易對訓練數據出現過擬合。如果最小值太大,你可能會過早停止。因此,最小值通常是基於數據集設置的,這取決於每個類中預期有多少個樣本。

修剪

由於訓練決策樹的性質,它們很容易出現過擬合。爲每個節點的最小實例數設置正確的值可能很困難。大多數時候,我們可能會選擇一個安全的方法,把最小值設置得非常小,這樣就會產生很多拆分,最終生成一個非常龐大且複雜的樹。關鍵是,這些拆分中有許多最終會變得多餘,沒有必要提高模型的準確性。

樹修剪是一種利用這種拆分冗餘來移除的技術,即修剪樹中不必要的拆分。從高層次來講,修剪會將樹的一部分從嚴格的、僵化的決策邊界壓縮成更平滑、更通用的樹,從而有效地降低樹的複雜性。決策樹的複雜性被定義爲樹中的拆分次數。

一種簡單而高效的修剪方法是遍歷樹中的每個節點,評估刪除節點對成本函數的影響。如果變化不大,那就修剪掉!

Scikit Learn 中的一個例子

分類和迴歸的決策樹在 Scikit Learn 中使用內置類非常容易使用!我們將首先加載數據集並初始化決策樹以進行分類。運行訓練就是一段簡單的幾行代碼!

image

Scikit Learnin 還允許我們使用 graphviz 庫對我們的樹進行可視化。它提供了一些選項,這些選項有助於將決策節點進行可視化,並將模型學到的決策節點拆分開來,這對於理解決策節點的工作方式非常有用!下面我們將根據特徵名稱對節點進行着色,並顯示每個節點的類和特徵信息。

image

你還可以在 Scikit Learn 中爲決策樹模型設置幾個參數。這裏有一些有趣的方法可以嘗試,以得到更好的結果:

  • max_depth: 我們將停止拆分節點的樹的最大深度。這類似於控制深度神經網絡中的最大層數。降低層數會使模型更快,但不那麼準確;調高層數可以得到較高的準確性,但存在過擬合的風險,而且還可能會變得緩慢。

  • min_samples_split:拆分節點所需的最小樣本數量。我們討論了上述決策樹的這個方面,以及如何將其設置爲更高的值來幫助緩解過擬合。

  • max_features:尋找最佳拆分時要考慮的特徵數量。更高的水平意味着可能會有更好的結果,但同時也意味着需要付出更長的訓練時間。

  • min_impurity_split:樹生長中的早期停止的閾值。如果節點的雜質高於閾值,節點就會拆分。這可以用來權衡過擬合(高值、小樹)和高準確度(低值、大樹)。

  • presort:是否對數據進行預排序,以加快你何種最佳拆分的發現。如果我們事先對每個特徵的數據進行排序,我們的訓練算法將更容易找到合適的值進行拆分。

實際應用決策樹的技巧

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

優點

  • 易於理解和解釋。在每個節點上,我們能夠確切地看到模型正在做什麼決策。在實踐中,我們將能夠完全理解準確度和誤差來自何處,模型可以很好地處理哪種類型的數據,以及輸出如何受到特徵值的影響。Scikit Learn 的可視化工具是可視化和理解決策樹的最佳選擇。
  • 只需很少的數據準備。許多機器學習模型可能需要大量的數據預處理,例如歸一化,並且可能需要複雜的正則化方案。另一方面,在調整一些參數後,決策樹在開箱即用時可以工作得非常好。
  • 使用樹進行推理的成本是用於訓練樹的數據點數量的對數。這是一個巨大的優勢,因爲它意味着擁有更多的數據,不一定會對我們的推理速度產生巨大影響。

缺點

原文鏈接:

https://www.kdnuggets.com/2018/12/guide-decision-trees-machine-learning-data-science.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章