Python3《機器學習實戰》02 決策樹

2021-08-20 01:35:11 字數 2285 閱讀 5236

執行平台:windows

python版本:python3

ide:anaconda3

決策樹(decision tree)的乙個重要任務就是為了理解資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取出一系列規則,這些機器根據資料集建立規則的過程,就是機器學習過程。

決策樹是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示基於特徵對例項進行分類的過程。它可以認為是if-then規則的集合,也可以認為是定義在特徵空間與類空間上的條件概率分布。

決策樹學習通常包括3個步驟:特徵選擇、決策樹的生成和決策樹的修剪。

當前資料集上哪個特徵在劃分資料分類時起決定性作用呢???

為了找到決定性的特徵,劃分出最好的結果,必須評估每乙個特徵。

決策樹的典型演算法有id3,c4.5,cart等。在《機器學習實戰》這本書中採用了id3演算法,id3演算法是一種貪心演算法,用來構造決策樹。id3演算法以資訊熵的下降速度為選取測試屬性的標準,即在每個節點擊取還尚未被用來劃分的具有最高資訊增益的屬性作為劃分標準,然後繼續這個過程,直到生成的決策樹能完美分類訓練樣例,此演算法的目的在於減少樹的深度,但是忽略了葉子數目的研究。c4.5演算法在id3演算法的基礎上進行了改進,對於**變數的缺值處理、剪枝技術、派生規則等方面作了較大改進,既適合於分類問題,又適合於回歸問題。

劃分資料集的大原則是:將無序的資料變得更加有序。

度量集合無序程度的兩種方法:

使用資訊理論度量資訊:在劃分資料集之前之後資訊發生的變化成為資訊增益,通過計算每個特徵值劃分資料集獲得的資訊增益,選出獲得資訊增益最高的特徵作為劃分資料集的參考屬性

基尼不純度:簡單說就是從乙個資料集中隨機選取子項,度量其被錯誤分類到其他分組裡的概率

本文選用第一種方法,那麼就要計算資訊增益。

集合資訊的度量方式稱為夏農熵或簡稱熵。為什麼熵可以用來表示資料集的混亂程度?

熵定義為資訊的期望值。在資訊理論與概率統計中,熵是表示隨機變數不確定性的度量。如果待分類的事務可能劃分在多個分類之中,則符號xi的資訊定義為 l(

xi)=

−log

2p(x

i)l (x

i)=−

log2

p(xi

)其中,p(x_i) 是選擇該分類的概率。那麼以上函式影象如下圖所示:

將概率在[0,1]之間的資訊轉換為0到正無窮之間的數,那麼在接下來計算資訊熵時,拉開了資料間距,更能反映出資料的混亂程度。熵越高,表示資料的混亂資料越多。熵的計算公式如下:h=

−∑i=

1np(

xi)l

og2p

(xi)

h =−

∑i=1

np(x

i)lo

g2p(

xi)也就是說,在資料集中去掉某個特徵前後,熵的變化越大,資訊增益越大,表明被去掉的這個特徵越能更好地劃分當前資料集。

一般採用遞迴原則構造決策樹。遞迴結束的條件有兩個:

程式遍歷完所有劃分資料集的屬性:如果資料集已經處理了所有屬性,但是類標籤依然不是唯一的,此時通常會採用多數表決的方法決定該葉子節點的分類,即選擇出現次數最多的那個標籤。

每個分支下的所有例項都具有相同的分類:如果所有例項具有相同的分類,則得到乙個葉子節點或者終止塊。任何達到葉子節點的資料必然屬於葉子節點的分類。

如下面的決策樹:

決策樹是充分考慮了所有的資料點而生成的複雜樹,有可能出現過擬合的情況,決策樹越複雜,過擬合的程度會越高。 考慮極端的情況,如果我們令所有的葉子節點都只含有乙個資料點,那麼我們能夠保證所有的訓練資料都能準確分類,但是很有可能得到高的**誤差,原因是將訓練資料中所有的雜訊資料都」準確劃分」了,強化了雜訊資料的作用。剪枝修剪**前後分類誤差相差不大的子樹,能夠降低決策樹的複雜度,降低過擬合出現的概率。 這裡不再詳細說明。

後續補充

機器學習實戰(Python3版)

水平有限,若有錯誤還請不吝賜教!最近在學機器學習,因為python2跟python3的差距,所以,我選擇直接學習python3來完成對機器學習實戰的內容,此類部落格會持續更新 等我完成本書內容,會慢慢在github上更新 接觸到第乙個演算法為k 近鄰演算法,其偽 如下 1.計算已知類別資料集中的點與...

機器學習實戰筆記一 Python3

程式清單2 1 k近鄰演算法 本筆記將主要注意力放在理解 上,所以大家看 中的注釋即可 個人程式注釋 python3 部分 改造 針對iteritems只支援python2的情況 from numpy import import operator 運算子模組 def createdataset gr...

Python3學習筆記02

昨天發現無法轉碼,於是就又找了另外找了乙個參考 發現可以執行了 encoding utf 8 import urllib.request def getdata url www.xx.com data urllib.request.urlopen url read z data data.decod...