機(jī)器學(xué)習(xí)-3:決策樹的構(gòu)建及應(yīng)用_第1頁
機(jī)器學(xué)習(xí)-3:決策樹的構(gòu)建及應(yīng)用_第2頁
機(jī)器學(xué)習(xí)-3:決策樹的構(gòu)建及應(yīng)用_第3頁
機(jī)器學(xué)習(xí)-3:決策樹的構(gòu)建及應(yīng)用_第4頁
機(jī)器學(xué)習(xí)-3:決策樹的構(gòu)建及應(yīng)用_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、_3:決策樹的構(gòu)建及應(yīng)章錄實(shí)驗(yàn)背景在之前的實(shí)驗(yàn):我們了解到了K-近鄰算法是種需訓(xùn)練就可以拿來進(jìn)分類的算法,但缺點(diǎn)也很多,最的缺點(diǎn)就是法給出數(shù)據(jù)的內(nèi)在含義,今天我就來介紹種容易理解數(shù)據(jù)形式的分類算法決策樹算法。1.決策樹算法原理什么是決策樹嚴(yán)格定義上來說,分類決策樹模型是種描述對(duì)實(shí)例進(jìn)分類的樹形結(jié)構(gòu)。決策樹由結(jié)點(diǎn)和有向邊組成。結(jié)點(diǎn)有兩種類型:內(nèi)部結(jié)點(diǎn)和葉節(jié)點(diǎn)。內(nèi)部結(jié)點(diǎn)表個(gè)特征或?qū)傩?,葉節(jié)點(diǎn)表個(gè)類。通俗來說決策樹只有個(gè)功能判斷,通過不斷的判斷最終得出個(gè)結(jié)果,以相親為例我們將相親簡(jiǎn)單的化為三個(gè)屬性的思考(對(duì)象不,富不富,美不美),實(shí)際上的相親遠(yuǎn)這復(fù)雜,很顯然,富美的對(duì)象乎沒有會(huì)拒絕。個(gè)新的對(duì)象放進(jìn)決

2、策樹判斷,這個(gè)對(duì)象是,富,不美,經(jīng)過3次判斷之后,得出的結(jié)論是去。這就是決策樹,當(dāng)然,這種海王決策樹不是我們特別需要的。決策樹的使更多傾向于專家系統(tǒng)中,以病情診斷為例,將以前們記錄的各種疾病以及這些疾病發(fā)時(shí)的癥狀記錄下來,于構(gòu)建決策樹,經(jīng)過這些疾病的訓(xùn)練后,當(dāng)病根據(jù)提輸體溫等各種信息后,這個(gè)病情決策樹就能判斷出患者得了哪種病。那么問題就來了,哪種屬性作為判斷的依據(jù)呢,或者說,哪種屬性作為判斷依據(jù)可以有最好的效果呢?如何構(gòu)建好的決策樹想要構(gòu)造好的決策樹,就得找到合適的屬性作為判斷依據(jù),如何選擇合適的屬性呢,這引四個(gè)概念,濃熵,信息增益,信息增益率,基尼指數(shù)。1.2.1.熵,本質(zhì)是指?jìng)€(gè)系統(tǒng)的“內(nèi)在

3、混亂程度”,濃熵也樣,這個(gè)詞來形容個(gè)事物的確定程度,濃熵越,事物的就越不確定,濃熵越,事物越確定。公式為:Ent(D)表熵,pk表k事件出現(xiàn)的概率,k=1y表共有y種事件以硬幣為例,枚硬幣拋出,正或反朝上的概率均為50%,此時(shí)熵為:-(1/2(log2(1/2)+1/2(log2(1/2)=1。很顯然,此時(shí)就是這個(gè)硬幣最不確定的時(shí)候,如果我們對(duì)硬幣作腳,讓其概率發(fā)變化,濃熵也會(huì)隨之變化。這就是硬幣概率變化導(dǎo)致熵的變化,當(dāng)然,這硬幣只有兩種結(jié)果,當(dāng)這兩種概率相等的時(shí)候熵最。當(dāng)事件越多,熵值就會(huì)越。1.2.2.在劃分?jǐn)?shù)據(jù)集之前之后信息發(fā)的變化稱為信息增益,計(jì)算公式為:Gain(D,a)表集合D中屬

4、性a的信息增益,Dv表屬性a有V種分,第v個(gè)節(jié)點(diǎn)包含了D在a屬性上取值為av的所有樣本。Gain(D,a)越,代表根據(jù)屬性a劃分獲得的“純度提升”越。1.2.3.雖然信息增益可以幫助我們選擇合適的劃分屬性,但他也有個(gè)很明顯的問題,那就是明顯偏好可取數(shù)較多的屬性,以硬幣為例,如果拋10次硬幣,5次朝上,5次朝下,如果以次數(shù)為屬性,可以發(fā)現(xiàn),每次都只有個(gè)值即屬性是確定的,這樣信息增益就會(huì)變成1-0=1。所以我們引信息增益率IV(a)稱為屬性a的固有值,屬性a的可能取值越多,IV(a)的值通常就越,顯然,這種法也有個(gè)缺點(diǎn),那就是偏好可取數(shù)較少的屬性,所以我們先挑選信息增益于平均平的屬性,再對(duì)其求信息

5、增益率,這樣就能得到合適的屬性。1.2.4.基尼指數(shù)是不同于信息增益和信息增益率的另套屬性,他來描述數(shù)據(jù)集的純度,反應(yīng)了隨機(jī)抽取兩個(gè)樣本,其類別標(biāo)記不致的概率,也就是基尼指數(shù)越,這個(gè)數(shù)據(jù)集的標(biāo)記越統(tǒng)公式為:給定數(shù)據(jù)集D,屬性a的基尼指數(shù)定義為:在候選屬性集合A中,選擇那個(gè)使得劃分后基尼指數(shù)最的屬性作為最有劃分屬性。如何優(yōu)化構(gòu)建完的決策樹盡管有多種法可以選擇合適的屬性來劃分?jǐn)?shù)據(jù)集,構(gòu)造決策樹,但根據(jù)訓(xùn)練數(shù)據(jù)集訓(xùn)練出來的決策樹也有很明顯的問題,那就是過度擬合訓(xùn)練數(shù)據(jù),導(dǎo)致泛性下降。實(shí)際上,訓(xùn)練數(shù)據(jù)集不可能包含了世界上的所有情況,這就導(dǎo)致個(gè)新的樣例丟決策樹進(jìn)判斷,得出的結(jié)果有很可能不是我們想要的,因

6、為這種樣例決策樹沒有接觸過。這就需要我們對(duì)決策樹進(jìn)“剪枝”。1.3.1.顧名思義,預(yù)剪枝通過提前停樹的構(gòu)建對(duì)樹剪枝,主要法有4種:1.當(dāng)決策樹達(dá)到預(yù)設(shè)的度時(shí)就停決策樹的長(zhǎng)。2.達(dá)到某個(gè)節(jié)點(diǎn)的實(shí)例具有相同的特征向量,即使這些實(shí)例不屬于同類,也可以停決策樹的長(zhǎng)。(如同樣是頭疼,發(fā)熱,部分是感冒,部分是中暑,我們就認(rèn)為頭疼,發(fā)熱都是感冒)3.定義個(gè)閾值,當(dāng)達(dá)到某個(gè)節(jié)點(diǎn)的實(shí)例個(gè)數(shù)于閾值時(shí)就可以停決策樹的長(zhǎng)。(這是為了防過度擬合訓(xùn)練數(shù)據(jù),如頭疼的樣例有10個(gè),頭疼發(fā)熱的樣例只有1個(gè),那就需再發(fā)熱進(jìn)劃分)4.通過計(jì)算每次擴(kuò)張對(duì)系統(tǒng)性能的增益,決定是否停決策樹的(提升系統(tǒng)性能就擴(kuò)張,降低就砍掉這個(gè)屬性)法3

7、中有個(gè)很明顯的問題,這個(gè)閾值是我們事先規(guī)定的,但是如何確定這個(gè)閾值是值得討論的,如何控制好擬合-過擬合的平衡是這個(gè)地的難點(diǎn)。盡管預(yù)剪枝能降低過擬合風(fēng)險(xiǎn)并且顯著減少訓(xùn)練時(shí)間和測(cè)試時(shí)間開銷。但因?yàn)樗摹柏潯睂?dǎo)致可能會(huì)陷局部最優(yōu),也就是法解決-低-更的情況,會(huì)困死在包上。同時(shí)因?yàn)橄拗品种Φ恼归_,使得擬合風(fēng)險(xiǎn)提(畢竟頭疼發(fā)熱的樣例哪怕只有例,如果是病毒的情況,這種也是需要注意的,預(yù)剪枝就可能會(huì)導(dǎo)致忽視這種問題)如圖所,預(yù)剪枝情況下是沒有上那棵完整的決策樹的,直接畫出下那棵剪枝后的決策樹。1.3.2.后剪枝先從訓(xùn)練集成棵完整的決策樹,然后底向上地對(duì)葉結(jié)點(diǎn)進(jìn)分析計(jì)算,若將該結(jié)點(diǎn)對(duì)應(yīng)的樹替換為葉結(jié)點(diǎn)能帶來決

8、策樹泛化性能提升,則將該樹替換為葉結(jié)點(diǎn)。如果沒有提升,保持不便的話,我們就保留。優(yōu)缺點(diǎn)都很明顯,保留更多的分使得擬合的風(fēng)險(xiǎn)減,有夠分的情況下般也分過少的預(yù)剪枝泛化性更好;更優(yōu)秀的表現(xiàn)往往需要更多的付出,因?yàn)檫@種法是成完整的決策樹后,底向上進(jìn)剪枝,導(dǎo)致訓(xùn)練時(shí)間很長(zhǎng),開銷。后剪枝先成上那棵完整的決策樹,再對(duì)那棵決策樹進(jìn)剪枝。2.三種決策樹構(gòu)造原理解釋完后,我們來分別構(gòu)建基于信息增益,信息增益率,基尼指數(shù)的決策樹,先,我們需要計(jì)算濃熵,代碼如下:def calcShannonEnt(dataSet):#字典,存儲(chǔ)類別及個(gè)數(shù)#dataSet進(jìn)后為list形式,使變量featVec進(jìn)列表遍歷#取出列表最

9、后個(gè)標(biāo)簽if currentLabel not in labelCounts.keys(): #若標(biāo)簽不在字典中for key in labelCounts:#使關(guān)鍵字循環(huán)遍歷shannonEnt -= prob *log(prob,2)return shannonEnt#測(cè)試數(shù)據(jù)#公式求熵labels =no surfacing,flippers#change to discrete valuesreturn dataSet, labels基于信息增益構(gòu)造的決策樹(ID )#按照給定的特征劃分?jǐn)?shù)據(jù)集def splitDataSet(dataSet, axis, value):retDataS

10、et =#存儲(chǔ)分割數(shù)據(jù)#list遍歷#如果數(shù)據(jù)集的value符合我們給定的axis#將該數(shù)據(jù)加reducedFeatVec#選擇最好的數(shù)據(jù)集劃分式(信息增益)def chooseBestFeatureToSplit1(dataSet):numFeatures =len(dataSet0) - 1#去除標(biāo)簽的特征數(shù)量baseEntropy =calcShannonEnt(dataSet) #得到濃熵#初始化參數(shù)#迭代所有特征featList =example for example in dataSet #創(chuàng)建列表存放特征樣例#刪除重復(fù)數(shù)據(jù),獲取唯數(shù)據(jù)#0/1分類,遍歷for value in

11、uniqueVals:#0,1實(shí)例分別計(jì)算條件熵newEntropy +=prob *calcShannonEnt(subDataSet) #條件熵infoGain =baseEntropy - newEntropy #信息增益#選擇最的信息增益return bestFeature#返回特征下標(biāo)#找出出現(xiàn)次數(shù)最多的標(biāo)簽,于投票def majorityCnt(classList):classCountdef createTree(dataSet,labels):classList =example-1 for example in dataSet#-1表列表最后個(gè)if classList.cou

12、nt(classList0) =len(classList): #所有結(jié)果樣就需再次分類return classList0#返回結(jié)果if len(dataSet0) =1:#只剩下種結(jié)果時(shí)也需分類#返回出現(xiàn)次數(shù)最多的類return majorityCnt(classList)#使信息增益選擇最佳劃分式myTree =bestFeatLabel:myTreebestFeatLabelvalue =createTree(splitDataSet(dataSet, bestFeat, value),subLabels)return myTree這樣的決策樹明顯不夠直觀,我們加點(diǎn)繪制圖像。#獲取葉節(jié)點(diǎn)

13、if type(secondDictkey)._name_=dict:#測(cè)試節(jié)點(diǎn)是否為字典,如果不是,則是葉結(jié)點(diǎn)#獲取樹的深度if type(secondDictkey)._name_=dict:#test to see if the nodes are dictonaires, if not they are leaf nodesif thisDepth maxDepth: maxDepth =thisDepthreturn maxDepthdef plotNode(nodeTxt, centerPt, parentPt, nodeType):va=center, ha=center, bb

14、oxnodeType, arrowpropsarrow_args )def plotMidText(cntrPt, parentPt, txtString):xMid =(parentPt0-cntrPt0)/2.0 +cntrPt0yMid =(parentPt1-cntrPt1)/2.0 +cntrPt1createPlot.ax1.text(xMid, yMid, txtString, va=center, ha=center, rotation30)firstStr =myTree.keys()0 #the text label for this node should be this

15、cntrPt =(plotTree.xOff +(1.0 +float(numLeafs)/2.0/plotTree.totalW, plotTree.yOff)plotMidText(cntrPt, parentPt, nodeTxt)plotNode(firstStr, cntrPt, parentPt, decisionNode)secondDict =myTreefirstStrplotTree.yOff =plotTree.yOff - 1.0/plotTree.totalDfor key in secondDict.keys():if type(secondDictkey)._na

16、me_=dict:#test to see if the nodes are dictonaires, if not they are leaf nodesplotTree(secondDictkey,cntrPt,str(key)#recursionplotNode(secondDictkey, (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)plotMidText(plotTree.xOff, plotTree.yOff), cntrPt, str(key)def createPlot(inTree):fig =plt.figure(1,

17、facecolor=white)fig.clf()fig = plt.figure(1, facecolor=white)fig.clf()#createPlot(thisTree)基于信息增益率構(gòu)造的決策樹(C )#去除標(biāo)簽的特征數(shù)量baseEntropy =calcShannonEnt(dataSet) #得到濃熵#初始化參數(shù)#獲取平均信息增益#統(tǒng)計(jì)數(shù)量featList =example for example in dataSet #創(chuàng)建列表存放特征樣例#刪除重復(fù)數(shù)據(jù),獲取唯數(shù)據(jù)#0/1分類,遍歷for value in uniqueVals:#0,1實(shí)例分別計(jì)算條件熵subDataSe

18、t =splitDataSet(dataSet, j, value)prob =len(subDataSet)/float(len(dataSet)newEntropy +=prob *calcShannonEnt(subDataSet) #條件熵IV-=prob *log(prob,2)infoGain =baseEntropy - newEntropy #信息增益sum+=infoGainfor i in range(numFeatures):#迭代所有特征featList =example for example in dataSet #創(chuàng)建列表存放特征樣例#刪除重復(fù)數(shù)據(jù),獲取唯數(shù)據(jù)IV

19、0.0#0/1分類,遍歷for value in uniqueVals:#0,1實(shí)例分別計(jì)算條件熵subDataSet =splitDataSet(dataSet, i, value)prob =len(subDataSet)/float(len(dataSet)newEntropy +=prob *calcShannonEnt(subDataSet) #條件熵IV-=prob *log(prob,2)infoGain =baseEntropy - newEntropy #信息增益if 0.0:infoGainration0.0else:#選擇最的信息增益率return bestFeature

20、#返回特征下標(biāo)C 4.5的代碼和ID 3很像,核區(qū)別只在于如何選擇信息收益于平均收益的情況下的信息增益率。微量數(shù)據(jù)下法看出明顯區(qū)別基于基尼指數(shù)構(gòu)造的決策樹(CART)#計(jì)算基尼指數(shù)def calcGini(dataset):for feat in uniqueFeat:bestFeature =-1for i in range(numFeatures):newEntropy =0.0for value in uniqueVals:# 通過不同的特征值劃分?jǐn)?shù)據(jù)集subDataSet =splitDataSet(dataSet, i, value)prob =len(subDataSet)/flo

21、at(len(dataSet)newEntropy +=prob calcGini(subDataSet)infoGini =newEntropyif(infoGini bestInfoGini): # 選擇最的基尼系數(shù)作為劃分依據(jù)bestInfoGini =infoGinireturn bestFeature #返回決策屬性的最佳索引微量數(shù)據(jù)下沒有區(qū)別。3.決策樹測(cè)試對(duì)于量的數(shù)據(jù)集,為了便存儲(chǔ)與復(fù),我們需要保存在硬盤內(nèi)#存儲(chǔ)件#讀取件def loadTree(filename):fr =open(filename)return pickle.load(fr)if _name_ =_main_:fr=open(D:/vscode/python/.vscode/car.data ,r)dataSetinst.strip().spli

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論