决策树分类python代码_分类算法-决策树 Decision Tree
決策樹(Decision Tree)是一個(gè)非參數(shù)的監(jiān)督式學(xué)習(xí)方法,決策樹又稱為判定樹,是運(yùn)用于分類的一種樹結(jié)構(gòu),其中的每個(gè)內(nèi)部節(jié)點(diǎn)代表對(duì)某一屬性的一次測(cè)試,每條邊代表一個(gè)測(cè)試結(jié)果,葉節(jié)點(diǎn)代表某個(gè)類或類的分布。
0x00決策樹的判定流程
下圖表示禮物選擇地判定過程,首先根據(jù)顏的兩個(gè)選擇分支:當(dāng)黑色的時(shí)候根據(jù)價(jià)格選擇喜歡不喜歡;當(dāng)選擇白色的時(shí)候,可以再根據(jù)大小確定喜歡或者不喜歡。
決策樹的決策過程一般是從決策樹的根節(jié)點(diǎn)開始,將待測(cè)數(shù)據(jù)和決策樹中的特征節(jié)點(diǎn)進(jìn)行比較,再選擇下一個(gè)比較分支,直到葉子節(jié)點(diǎn)作為最終的決策結(jié)果。
決策樹除了可以用來分類外,還可以用來回歸和預(yù)測(cè)。分類樹對(duì)離散變量做決策樹,回歸樹對(duì)連續(xù)變量做決策樹。
0x01決策樹的三種節(jié)點(diǎn)
從數(shù)據(jù)產(chǎn)生決策樹的機(jī)器學(xué)習(xí)技術(shù)成為決策樹學(xué)習(xí),通俗的來說是決策樹,一個(gè)決策樹一般有三種節(jié)點(diǎn)
決策節(jié)點(diǎn):是對(duì)幾種可能方案的選擇,即最后選擇的最佳方案。如果決策屬于多級(jí)決策,則決策樹的中間可以有多個(gè)決策點(diǎn),以決策樹根部的決策點(diǎn)為最終決策方案。
狀態(tài)節(jié)點(diǎn):代表備選方案的經(jīng)濟(jì)效果(期望值),通過各狀態(tài)節(jié)點(diǎn)的經(jīng)濟(jì)效果對(duì)比,按照一定的決策標(biāo)準(zhǔn)就可以選出最佳方案。由狀態(tài)節(jié)點(diǎn)引出的分支稱為概率枝,概率枝的數(shù)目表示可能出現(xiàn)的自然狀態(tài)數(shù)目每個(gè)分支上要注明該狀態(tài)出現(xiàn)的概率。
終結(jié)點(diǎn):每個(gè)方案在各種自然狀態(tài)下取得的最終結(jié)果.即樹的葉子。
0x02優(yōu)缺點(diǎn)
*優(yōu)點(diǎn)**
簡(jiǎn)單易懂,原理清晰,決策樹可以實(shí)現(xiàn)可 視化;
決策樹算法的時(shí)間復(fù)雜度(預(yù)測(cè)數(shù)據(jù))是 用于訓(xùn)練決策樹的數(shù)據(jù)點(diǎn)的對(duì)數(shù);
能夠處理數(shù)值和分類數(shù)據(jù);
能夠處理多路輸出問題;
可以通過統(tǒng)計(jì)學(xué)檢驗(yàn)驗(yàn)證模型。這也使模 型的可靠性計(jì)算變得可能;
即使模型假設(shè)違反產(chǎn)生數(shù)據(jù)的真實(shí)模型, 表現(xiàn)性能依舊很好
缺點(diǎn)
決策樹有時(shí)候是不穩(wěn)定的,因?yàn)閿?shù)據(jù)微小 的變動(dòng),可能生成完全不同的決策樹
有些問題學(xué)習(xí)起來非常難,因?yàn)闆Q策樹很難表達(dá),如異或問題、奇偶校驗(yàn)或多路復(fù)用器問題
如果有些因素占據(jù)支配地位,決策樹是有偏差的。因此建議在擬合決策樹之前先平衡數(shù)據(jù)的影響因子
對(duì)連續(xù)性的字段比較難預(yù)測(cè)
最優(yōu)決策樹的構(gòu)建屬于NP問題
👇摘抄自:百度百科
P問題
P問題是一個(gè)判定問題類,這些問題可以用一個(gè)確定性算法在多項(xiàng)式時(shí)間內(nèi)判定或解出。如果一個(gè)判定性問題的復(fù)雜度是該問題的一個(gè)實(shí)例的規(guī)模n的多項(xiàng)式函數(shù),則我們說這種可以在多項(xiàng)式時(shí)間內(nèi)解決的判定性問題屬于P類問題。P類問題就是所有復(fù)雜度為多項(xiàng)式時(shí)間的問題的集合。
確定一個(gè)問題是否是多項(xiàng)式問題,在計(jì)算機(jī)科學(xué)中非常重要。已經(jīng)證明,多項(xiàng)式問題是可解問題,因?yàn)槌薖問題之外的問題,其時(shí)間復(fù)雜度都很高,即求解需要大量時(shí)間。
理論上有解但其時(shí)間復(fù)雜度巨大的問題,科學(xué)家將其稱為難解型問題。對(duì)計(jì)算機(jī)來說,這類問題是不可解的。因此,P問題成了區(qū)別問題是否可以被計(jì)算機(jī)求解的一個(gè)重要標(biāo)志。
NP問題
NP問題是指可以在多項(xiàng)式時(shí)間內(nèi)被非確定機(jī)解決的問題。通常它們的時(shí)間復(fù)雜度都是指數(shù)變量,如 等。
這里有一個(gè)著名的問題一千禧難題之首。是說P問題是否等于NP問題,也即是否所有在非確定機(jī)上多項(xiàng)式可解的問題都能在確定機(jī)上用多項(xiàng)式時(shí)間求解。這表明用NP問題尋找多項(xiàng)式時(shí)間表示的算法很困難,或許最后的結(jié)論是NP問題根本就不是P問題。
P=NP?問題
目前已經(jīng)證明所有P問題都是NP問題,那么反之P—NP嗎?這就是所謂的“NP問題”。目前P與NP是否等價(jià)是一個(gè)既沒有證實(shí)也沒有證偽的問題。但是大部分科學(xué)家猜想:找一個(gè)問題的解很困難,但驗(yàn)證一個(gè)解很容易(證比解易),用公式表示就是P≠NP。問題較難求解(P)但容易驗(yàn)證(NP),這與我們的日常生活經(jīng)驗(yàn)是相符的。
【例1】對(duì)方程求解很難,但是驗(yàn)證很容易。
假設(shè)證明了P=NP,那么依據(jù)計(jì)算復(fù)雜性的密碼技術(shù)就會(huì)沒有前途,因?yàn)榇鸢负苋菀椎玫津?yàn)證的問題也同樣可以輕松求解,這將對(duì)計(jì)算機(jī)安全構(gòu)成巨大威脅。因?yàn)槟壳暗募用芗夹g(shù)是將一個(gè)整數(shù)分解為幾個(gè)因數(shù)的乘積,正是因數(shù)分解過程煩瑣,才保證了信息的安全 [1] 。
NPC(NP Complete,NP完全)問題
計(jì)算機(jī)科學(xué)家將NP問題中最困難的稱為NPC問題。NPC問題有一個(gè)令人驚訝的性質(zhì),即如果一個(gè)NPC問題存在多項(xiàng)式時(shí)間算法,那么所有NP問題都可以在多項(xiàng)式時(shí)間內(nèi)求解,即P=NP成立。
這是因?yàn)槊恳粋€(gè)NPC問題都可以在多項(xiàng)式時(shí)間內(nèi)轉(zhuǎn)化成任何一個(gè)NP問題。只要任意一個(gè)NPC問題找到了一個(gè)多項(xiàng)式算法,那么所有NP問題都能用這個(gè)算法解決,也就解決了NP=P問題。但是給NPC找一個(gè)多項(xiàng)式算法太不可想象了,而且也從未成功,因此科學(xué)家認(rèn)為,正是NPC問題的存在,使得人們相信P=NP。
NPC問題目前沒有多項(xiàng)式算法,只能用窮舉法逐個(gè)檢驗(yàn),最終得到答案。但是窮舉法的計(jì)算時(shí)間隨問題的復(fù)雜程度呈指數(shù)增長(zhǎng),很快問題就會(huì)變得不可計(jì)算了。
圍棋或象棋的博弈問題、國(guó)際象棋的n皇后問題、密碼學(xué)中的大素?cái)?shù)分解問題等,都屬于NPC類問題。
0x03決策樹得學(xué)習(xí)過程
決策樹學(xué)習(xí)是數(shù)據(jù)挖掘中得經(jīng)典算法,每個(gè)決策樹都表述了一種樹形結(jié)構(gòu),它由它的分支對(duì)該類型得對(duì)象依靠屬性進(jìn)行分類。每個(gè)決策樹可以依靠對(duì)源數(shù)據(jù)庫(kù)得分隔進(jìn)行數(shù)據(jù)測(cè)試。這個(gè)過程可以遞歸式地對(duì)樹進(jìn)行修建。
其學(xué)習(xí)過程如下:
特征選擇:從訓(xùn)練數(shù)據(jù)地特征中選擇一個(gè)特征作為當(dāng)前節(jié)點(diǎn)地分裂標(biāo)準(zhǔn)(特征選擇地標(biāo)準(zhǔn)不同產(chǎn)生了不同地特征決策樹算法)
決策樹地產(chǎn)生:根據(jù)所選特征評(píng)估標(biāo)準(zhǔn),從上而下遞歸地生成子節(jié)點(diǎn),知道數(shù)據(jù)集不可分時(shí)再停止生成
剪枝:決策樹容易過擬合,需要剪枝來縮小樹地結(jié)構(gòu)和規(guī)模(包括預(yù)剪枝和后剪枝)
0x04創(chuàng)建決策樹進(jìn)行分類
創(chuàng)建決策樹進(jìn)行分類的流程如下。
(1)創(chuàng)建數(shù)據(jù)集。
(2)計(jì)算數(shù)據(jù)集的信息熵。
(3 )遍歷所有特征,選擇信息熵最小的特征,即為最好的分類特征。
(4)根據(jù)上一步得到的分類特征分隔數(shù)據(jù)集, 并將該特征從列表中移除。
(5)執(zhí)行遞歸函數(shù),返回(3),不斷分隔數(shù)據(jù)集,直到分類結(jié)束。
( 6)使用決策樹執(zhí)行分類, 返回分類結(jié)果。
決策樹學(xué)習(xí)算法的偽代碼如下。
檢測(cè)數(shù)據(jù)集中的每個(gè)子項(xiàng)是否屬于同一類。
if每個(gè)子項(xiàng)屬于同一類return類標(biāo)簽
else
( 1 )尋找劃分?jǐn)?shù)據(jù)集的最好特征。
(2 )劃分?jǐn)?shù)據(jù)集。
(3)創(chuàng)建分支節(jié)點(diǎn)。
①for每個(gè)劃分的子集。
②調(diào)用分支創(chuàng)建函數(shù)并增加返回結(jié)果到分支節(jié)點(diǎn)中。
( 4) return分支節(jié)點(diǎn)。
從上面代碼的實(shí)現(xiàn)過程可以發(fā)現(xiàn),在構(gòu)建決策樹的過程中,要尋找劃分?jǐn)?shù)據(jù)集的最好
特征。
例如,如果一個(gè)訓(xùn)練數(shù)據(jù)中有 10個(gè)特征,那么每次選取哪個(gè)特征作為劃分依據(jù)?
這 就必須采用量化的方法來判斷,量化劃分方法有多種,其中一項(xiàng)就是“信息論度量信息分類”, 即使無序的數(shù)據(jù)變得有序。
基于信息論的決策樹算法包括ID3、C4.5、 CART 等。J. Ross Quinlan在1975年提 出將信息熵的概念弓|入決策樹的構(gòu)建,這就是鼎鼎有名的ID3算法,后續(xù)的C4.5、 C5.0、 CART等都是該方法的改進(jìn)算法。下面是幾種算法的大致情況,詳細(xì)算法可以參考機(jī)器學(xué) 習(xí)有關(guān)書籍,這里不做重點(diǎn)介紹。
(學(xué)習(xí)由淺入深,我jio的這三個(gè)算法可以之前再了解,先往后看看關(guān)于信息熵的內(nèi)容)
0x05信息熵
由于這些算法又涉及信息熵的概念,因此,下面就簡(jiǎn)要介紹一下信 息熵的基本知識(shí)。
信息熵:在概率論中,信息熵是一種度量隨機(jī)變量不確定性的方式,熵就是信息的期
望值。假設(shè)S為所有事件集合,待分類的事物可能劃分在C類中,分別是C,C2,
Cn,每一類的概率分別是P1,P2, . Pn, 那么s的熵就定義為:
信息熵是以二進(jìn)制位的個(gè)數(shù)來度量編碼長(zhǎng)度的,因此熵的最大值是log2C。
舉個(gè)栗子( o=^?ェ?)o ┏━┓
熵值越高,則數(shù)據(jù)混合的種類越高,其蘊(yùn)含的含義是一個(gè)受重可能的支化越多 (反而 與變量具體的取值沒有任何關(guān)系,只和值的種類多少及發(fā)生概率有關(guān)),它攜帶的信息量 就越大。熵在信息論中是一個(gè)非常重要的概念 ,很多機(jī)器學(xué)習(xí)的算法都會(huì)用到這個(gè)概念。
信息增益( Information Gain)是指信息劃分前后熵的變化,即由于使用這個(gè)屬性分 隔樣例而導(dǎo)致的期望熵降低。也就是說,信息增益就是原有信息熵與屬性劃分后信息熵(需 要對(duì)劃分后的信息熵取期望值)的差值,具體計(jì)算法為:
其由第二項(xiàng)為屬性A對(duì)S劃分的期望信息
再舉個(gè)栗子( o=^?ェ?)o ┏━┓
這個(gè)數(shù)據(jù)集有四個(gè)樣本,兩個(gè)基本屬性,其中X1表示是否為紅色,X2表示大小,Y表示是否為好蘋果
由于只有兩個(gè)屬性,只可能有兩個(gè)決策樹,如下圖所示:
嘗試用代碼來計(jì)算熵:
換一組測(cè)試數(shù)據(jù):
from math import log
def calcshan(dataSet):
lenData = len(dataSet)
p = {}
H = 0.0
for data in dataSet:
currentLabel = data[-1]#獲取類別標(biāo)簽(也就是樣本的yes或no,比如上面例子的蘋果的好與壞)
if currentLabel not in p.keys():
p[currentLabel] = 0 #如果字典中沒有該類別標(biāo)簽,則創(chuàng)建
p[currentLabel]+=1 #遞增類別標(biāo)簽的值
for key in p:
px = float(p[key])/float(lenData) #計(jì)算某標(biāo)簽的概率
# 計(jì)算信息熵
H -= px*log(px,2)
return H
if __name__ == "__main__":
dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
print(calcshan(dataSet))
測(cè)試結(jié)果
(env_default) PS F:\workspace> python .\test.py
0.9709505944546686
(env_default) PS F:\workspace>
本作品采用《CC 協(xié)議》,轉(zhuǎn)載必須注明作者和本文鏈接
總結(jié)
以上是生活随笔為你收集整理的决策树分类python代码_分类算法-决策树 Decision Tree的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高通fastboot一键进9008工具_
- 下一篇: python爬虫负面新闻_Python