當前位置:
首頁 > 知識 > 決策樹:一種像人腦一樣工作的演算法

決策樹:一種像人腦一樣工作的演算法

本文為 AI 研習社編譯的技術博客,原標題 :

Decision Tree: an algorithm that works like the human brain

翻譯 | Kyuubi、不到7不改名

校對 | 醬番梨 整理 | 志豪

https://towardsdatascience.com/decision-tree-an-algorithm-that-works-like-the-human-brain-8bc0652f1fc6

「從綠葉中穿透的陽光」 來自 Unsplash 的 Jeremy Bishop

決策樹是用於機器學習最流行的演算法之一,尤其對於分類和回歸問題。我們每次做決策時大腦都像決策樹一樣工作。

比如:「外面是陰天嗎?「「如果是,我會帶一把雨傘」

當我們為了分類變數而訓練數據集時,決策樹的主要理念是依據確定的特徵值把數據分成更小的數據集直到特徵變數全部歸為一類。另一面,人類大腦決定通常選取基於經驗出發的「分支特徵」(比如是否陰天),對於一個計算機分支數據集來說則基於「最大信息增益」。讓我們定義一個簡單的問題然後切換到一些計算過程去探究其意味著什麼!

貓和狗構成的數據集

讓我們來建立一個決策樹:基於高度和重量來決定一個寵物是貓還是狗。

我們會對數據點的兩個參數中的一個的確定值進行分類。比如:一個寵物的重量大於15磅,我們會確定這是只狗,至少對於這個簡單的數據集來說是這樣,但是如果重量小於15磅我們的的子集將會再次分支,其中包含由兩隻貓所構成的分支和一條狗所構成的分支,直到每個分支中只剩下一類元素,我們繪製了這個過程:

決策樹的例子

每棵樹開始於根節點,顯而易見,從第一個分支出發到一個解,我們可以給出相同步數不同類型的數據分支。

但是計算機會怎樣定義節點呢?事實上,為了清楚地理解最有效的方,,我們需要介紹:Gini(不等式的通用測量方法,為了通俗講本文將Gini中文翻譯為基尼係數)。這個不等式提到了單個節點的每個子集中的目標類。因此,它可以在每次分支後計算,並根據計算後不等式的變化去定義「信息增益」。

圖為基尼係數的定義

為了計算基尼係數,我們考慮在每一個節點後找到每一類的可能性,對這些值進行求平方之後,用1減去這個值。

出於這個原因,當子集中只有一個類時,基尼係數會為0.因為確實找到一類的可能性是1.在這個例子中,我們給定我們已經到達了葉節點,在這裡不需要再進行分支操作了,我們已經達到了目的.但是如果我們看上面的圖,當處於根節點之後的False情況下,我們有一個包含三個觀測值的子集,兩個是貓一個是狗,如果我們想計算這個子集的基尼係數,我們可以:

結果數據集的基尼係數計算重量大於等於15磅.

另一個可以代替基尼係數的測量不等式類別的指標是-熵.(譯者註:應該是熵-Entropy,原文中的Entopy少了一個字母).這個指標是出於同樣的目的,但是熵的變化比例很小;於是我們只用基尼係數.

根據我們選擇的分支策略,我們會有每個子集的基尼係數值,依靠節點後的基尼係數值,我們可以定義信息增益。

信息增益的定義

此定義描述了計算父節點基尼係數和子節點基尼係數加權平均的差.如果我們參考一下上一個例子,使用這個定義可以簡單地推導出初始數據集的基尼係數為0.48,則可以計算根節點的信息增益.(分支在重量為15磅時)

根節點後的信息增益值

決策樹會考慮所有可能分支的信息增益,並選擇一個有最高信息增益的分支。讓我們用python實現看看。

通過運行下面的代碼,我們只用幾行代碼來建立一個數據框(通過圓角矩形框表示)的草稿去擬合模型。

注意:

在訓練一個模型之前,對於訓練、測試分支來說,這是一個很好的練習,去防止過擬合,並且可以雙重檢驗我們的模型在不可見的數據上的表現。

當我們實例化時這是很重要的聲明:

DecisionTreeClassifier

我並沒有指定任何附帶參數。當我們處理非常龐大的數據集時,為了阻止你的樹失控和過擬合,非常必要的要定義:

max_depth

為了指定你的樹的最大分支層級。同樣的必要的定義:

max_features

一個參數限制了預測器的數量去集中於搜索最優的分支。當然如果你想使用熵來代替基尼係數來優化你的樹,你只需要寫:

criterion="entropy"

當實例化了object,如果你想進一步探索如何調整模型,參考決策樹模型。

我們建立了我們的模型,但是這究竟意味著什麼呢?決策樹之美可以很容易的被解釋,所以我們把它畫出來!為了運行代碼段你需要通過pip安裝一下package:

pipinstallpydotplus pydot2

在你的jupyter notebook中代碼段的輸出會是下面這張圖:

很牛逼,對吧~ 儘管在我們的『手稿』中,我選擇了『15磅重量』作為我的根節點,演算法依據同一個變數判斷分支,但是對於12這個值則創建了一個只有一條狗的葉節點(對於已有的元素重量大於12磅時,事實上基尼係數為0)。根節點後為真的情況下生成了子集,並且進一步依靠重量變數8.5磅為判斷依據進行分支。最後一個分支生成了無基尼係數的兩個純子集。

所以,什麼情況下我們應該或者不應該用決策樹?這裡有一個簡短的優缺點的列表:

優點:

擁有很強的可解釋性,尤其是我們需要和不懂技術的人員去交流的時候

能夠很好地解決雜訊數據和不完整數據

可以用於回歸和分類問題

缺點:

可能會變得不穩定,也就是說數據集中很小的改變可能導致模型中很大的改變

趨向於過擬合,這意味有著小的偏移但是很大的方差,比如:即使在訓練數據上表現很好也無法在更多地不可見測試數據中有同樣層次的表現

幸運的是,有很多的技術可以解決過擬合,這是決策樹的主要缺點。通過引用bagging或者boosting方法,我們可以從決策樹的概念開始,更準確的分析去採用模型,比如:

RandomForestClassifier或者AdaBoostClassifier

只先說這兩個,這些都是有效的方法,但是隨機森林通過 boostrapping 生成了很多新數據集(比如:對源數據幀的拷貝進行採樣);它擬合了樹的每一個新的數據幀並且通過均值進行預測森林中的所有樹。作為替代的Ada Boost可以自學習,是適應性非常強的樹,通過調整不正確的分類實例而永遠使用相同的數據幀。

想要繼續查看該篇文章更多代碼、鏈接和參考文獻?

戳鏈接:

http://www.gair.link/page/TextTranslation/1023


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

如何看待Siraj發布的新視頻《量子機器學習》?

TAG:AI研習社 |