決策樹故名思意是用於基於條件來做決策的,而它執行的邏輯相比一些複雜的演算法更容易理解,只需按條件遍歷樹就可以了,需要花點心思的是理解如何建立決策樹。
舉個例子,就好像女兒回家,做媽媽的給女兒介紹物件,於是就有了以下對話:
媽媽:女啊,明天有沒有時間,媽媽給你介紹個物件媽媽和女兒對話的這個過程中,女兒的決策過程可以用下圖表示:女兒:有啊,對方多大了。
媽媽:年齡和你相仿
女兒:帥不帥啊
媽媽: 帥
女兒:那我明天去看看
你可能會認為,這個決策的過程本質上就是對資料集的每乙個做if--else
的判斷,這不很簡單嗎?那為什麼還要專門弄乙個演算法出來呢?
不妨可以考慮兩點,假如訓練資料集中存在無關項,比如以下的例子:
10-1 #表示第一項特徵是1,第二項特徵是0,最後推出的結果是1,以下同理顯然的,最後結果和第二個特徵無關,如果仍要做判斷就會增加了損耗。所以在建立決策樹的過程中,我們就希望把這些無關項扔掉。12-1
05-0
09-0
17-1
……
第二點,回到媽媽給女兒介紹物件的這個例子,上圖是為了方面讀者理解,所以按照順序畫出,但事實上,有乙個嚴重的問題,比如說女兒可能不能容忍某個缺點,而一旦對方的性格中具有這個缺點,那麼其他一切都不用考慮。也就是說,有乙個特徵跟最後的結果相關度極高,這時我們就希望這個資料出現在根節點上,如果核心條件不滿足那就結束遍歷這棵樹了,避免無謂的損耗。
總言言之,決策樹第乙個是需要從大量的已存在的樣本中推出可供做決策的規則,同時,這個規則應該避免做無謂的損耗。
構造決策樹的關鍵步驟是**屬性。**屬性值得就是在某個節點處按照某一特徵屬性的不同劃分構造不同的分支,其目標是讓各個**子集盡可能地「純」。盡可能「純」就是盡量讓乙個**子集中待分類項屬於同一類別。這時**屬性可能會遇到三種不同的情況:
構造決策樹的關鍵性內容是進行屬性選擇度量,屬性選擇度量是一種選擇**準則,是將給定的類標記的訓練集合的資料劃分d「最好」地分成個體類的啟發式方法,它決定了拓撲結構及**點split_point的選擇。
在這裡僅介紹比較常用的id3
演算法。
從資訊理論知識中我們直到,期望資訊越小,資訊增益越大,從而純度越高。所以id3演算法的核心思想就是以資訊增益度量屬性選擇,選擇**後資訊增益最大的屬性進行**。
循序本系列的從工程角度理解演算法,而非數學角度理解演算法的原則,因此這裡只給出資訊增益度量的計算方式,如果需要深入了解其數學原理,請查閱專業資料。
設d為用類別對訓練元組進行的劃分,則d的熵計算方法為:
其中pi表示第i個類別在整個訓練集**現的概率。
當按照特徵a分割後,其期望資訊為:
其中di/d表示每乙個d在整體訓練集佔的比例。
而資訊增益即為兩者的差值:
其中當gain(a)
達到最大時,該特徵便是最佳的劃分特徵,選中最佳特徵作為當前的節點,隨後對劃分後的子集進行迭代操作。
github在本專欄的前面的文章描述了基於決策樹的五子棋遊戲,算是乙個基於決策樹的應用了。詳情請點這裡
C 從入門到放棄之 C 函式
內聯函式 inline 函式是否構成過載關係與函式的返回值型別無關 通過函式指標呼叫過載關係的函式,由函式指標的型別決定匹配過載的版本 呼叫過載關係的函式時,編譯器會根據形參和實參的匹配程度,選擇最優的匹配版本,一般的匹配規則 完全匹配 常量轉換 公升級轉換 降級轉換 省略號轉換 在操作符過載函式 ...
Web安全從入門到「放棄」之pikachu環境部署
1.首先進行本地伺服器的搭建 先到官方 安裝xampp 安裝完後的軟體介面 如果開啟apache和mysql顯示錯誤的話,可以開啟日誌檢視錯誤資訊,點選logs開啟error.log日誌檢視。很大情況是埠錯誤,這時候可以修改埠,關於這個問題,網上有很多教程,這裡就不講解了 解壓pikachu.zip...
從決策樹到GBDT
首先,決策樹分為分類樹和回歸樹。gbdt中的樹是回歸樹 不是分類樹 gbdt用來做回歸 調整後也可以用於分類。以下羅列了比較好的學習資源,看完就可以掌握gbdt了 決策樹參考 分類樹回歸樹區別參考 分類樹 以c4.5分類樹為例,c4.5分類樹在每次分枝時,是窮舉每乙個feature的每乙個閾值,找到...