久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python機(jī)器學(xué)習(xí)--決策樹算法

 吳敬銳 2017-01-24



一,、決策樹原理

決策樹是用樣本的屬性作為結(jié)點(diǎn),,用屬性的取值作為分支的樹結(jié)構(gòu),。 
決策樹的根結(jié)點(diǎn)是所有樣本中信息量最大的屬性,。樹的中間結(jié)點(diǎn)是該結(jié)點(diǎn)為根的子樹所包含的樣本子集中信息量最大的屬性,。決策樹的葉結(jié)點(diǎn)是樣本的類別值,。決策樹是一種知識(shí)表示形式,,它是對所有樣本數(shù)據(jù)的高度概括決策樹能準(zhǔn)確地識(shí)別所有樣本的類別,,也能有效地識(shí)別新樣本的類別,。

 

決策樹算法ID3的基本思想:

首先找出最有判別力的屬性,,把樣例分成多個(gè)子集,每個(gè)子集又選擇最有判別力的屬性進(jìn)行劃分,,一直進(jìn)行到所有子集僅包含同一類型的數(shù)據(jù)為止,。最后得到一棵決策樹。

J.R.Quinlan的工作主要是引進(jìn)了信息論中的信息增益,,他將其稱為信息增益(information gain),,作為屬性判別能力的度量,設(shè)計(jì)了構(gòu)造決策樹的遞歸算法,。


舉例子比較容易理解:

對于氣候分類問題,,屬性為:

天氣(A1) 取值為: 晴,多云,,雨

氣溫(A2)  取值為: 冷 ,,適中,熱

濕度(A3)  取值為: 高 ,,正常

風(fēng) (A4)  取值為: 有風(fēng),, 無風(fēng)


每個(gè)樣例屬于不同的類別,此例僅有兩個(gè)類別,,分別為P,,N。P類和N類的樣例分別稱為正例和反例,。將一些已知的正例和反例放在一起便得到訓(xùn)練集,。

由ID3算法得出一棵正確分類訓(xùn)練集中每個(gè)樣例的決策樹,,見下圖。



決策樹葉子為類別名,,即P 或者N,。其它結(jié)點(diǎn)由樣例的屬性組成,每個(gè)屬性的不同取值對應(yīng)一分枝,。


若要對一樣例分類,,從樹根開始進(jìn)行測試,按屬性的取值分枝向下進(jìn)入下層結(jié)點(diǎn),,對該結(jié)點(diǎn)進(jìn)行測試,,過程一直進(jìn)行到葉結(jié)點(diǎn),樣例被判為屬于該葉結(jié)點(diǎn)所標(biāo)記的類別,。

現(xiàn)用圖來判一個(gè)具體例子,,

某天早晨氣候描述為:

天氣:多云

氣溫:冷

濕度:正常

風(fēng): 無風(fēng)

它屬于哪類氣候呢?-------------從圖中可判別該樣例的類別為P類。

 

ID3就是要從表的訓(xùn)練集構(gòu)造圖這樣的決策樹,。實(shí)際上,,能正確分類訓(xùn)練集的決策樹不止一棵。Quinlan的ID3算法能得出結(jié)點(diǎn)最少的決策樹,。


ID3算法:

     ⒈ 對當(dāng)前例子集合,,計(jì)算各屬性的信息增益;

     ⒉ 選擇信息增益最大的屬性Ak,;

     ⒊ 把在Ak處取值相同的例子歸于同一子集,,Ak取幾個(gè)值就得幾個(gè)子集;

     ⒋ 對既含正例又含反例的子集,,遞歸調(diào)用建樹算法,;

     ⒌ 若子集僅含正例或反例,對應(yīng)分枝標(biāo)上P或N,,返回調(diào)用處,。

一般只要涉及到樹的情況,經(jīng)常會(huì)要用到遞歸,。

 

對于氣候分類問題進(jìn)行具體計(jì)算有:

⒈ 信息熵的計(jì)算: 其中S是樣例的集合,, P(ui)是類別i出現(xiàn)概率:

|S|表示例子集S的總數(shù),|ui|表示類別ui的例子數(shù),。對9個(gè)正例和5個(gè)反例有:

P(u1)=9/14

P(u2)=5/14

H(S)=(9/14)log(14/9)+(5/14)log(14/5)=0.94bit

 

⒉ 信息增益的計(jì)算:

其中A是屬性,,Value(A)是屬性A取值的集合,v是A的某一屬性值,,Sv是S中A的值為v的樣例集合,,| Sv |為Sv中所含樣例數(shù)。

以屬性A1為例,根據(jù)信息增益的計(jì)算公式,,屬性A1的信息增益為

S=[9+,5-] //原樣例集中共有14個(gè)樣例,,9個(gè)正例,5個(gè)反例

S晴=[2+,3-]//屬性A1取值晴的樣例共5個(gè),,2正,,3反

S多云=[4+,0-] //屬性A1取值多云的樣例共4個(gè),4正,,0反

S雨=[3+,2-] //屬性A1取值晴的樣例共5個(gè),3正,,2反

 

 



3.結(jié)果為

屬性A1的信息增益最大,,所以被選為根結(jié)點(diǎn)。



4.建決策樹的根和葉子

ID3算法將選擇信息增益最大的屬性天氣作為樹根,,在14個(gè)例子中對天氣的3個(gè)取值進(jìn)行分枝,,3 個(gè)分枝對應(yīng)3 個(gè)子集,分別是:

其中S2中的例子全屬于P類,,因此對應(yīng)分枝標(biāo)記為P,,其余兩個(gè)子集既含有正例又含有反例,將遞歸調(diào)用建樹算法,。


5.遞歸建樹

分別對S1和S3子集遞歸調(diào)用ID3算法,,在每個(gè)子集中對各屬性求信息增益.

(1)對S1,濕度屬性信息增益最大,,以它為該分枝的根結(jié)點(diǎn),,再向下分枝。濕度取高的例子全為N類,,該分枝標(biāo)記N,。取值正常的例子全為P類,該分枝標(biāo)記P,。

(2)對S3,,風(fēng)屬性信息增益最大,則以它為該分枝根結(jié)點(diǎn),。再向下分枝,,風(fēng)取有風(fēng)時(shí)全為N類,該分枝標(biāo)記N,。取無風(fēng)時(shí)全為P類,,該分枝標(biāo)記P。



二,、PYTHON實(shí)現(xiàn)決策樹算法分類

本代碼為machine learning in action 第三章例子,,親測無誤。

 1,、計(jì)算給定數(shù)據(jù)shangnon數(shù)據(jù)的函數(shù):



[python] view plain copy

  1. def calcShannonEnt(dataSet):  

  2.     #calculate the shannon value  

  3.     numEntries = len(dataSet)  

  4.     labelCounts = {}  

  5.     for featVec in dataSet:      #create the dictionary for all of the data  

  6.         currentLabel = featVec[-1]  

  7.         if currentLabel not in labelCounts.keys():  

  8.             labelCounts[currentLabel] = 0  

  9.         labelCounts[currentLabel] += 1  

  10.     shannonEnt = 0.0  

  11.     for key in labelCounts:  

  12.         prob = float(labelCounts[key])/numEntries  

  13.         shannonEnt -= prob*log(prob,2#get the log value  

  14.     return shannonEnt  


 2. 創(chuàng)建數(shù)據(jù)的函數(shù)



[python] view plain copy

  1. def createDataSet():  

  2.     dataSet = [[1,1,'yes'],  

  3.                [1,1'yes'],  

  4.                [1,0,'no'],  

  5.                [0,1,'no'],  

  6.                [0,1,'no']]  

  7.     labels = ['no surfacing','flippers']  

  8.     return dataSet, labels  


3.劃分?jǐn)?shù)據(jù)集,,按照給定的特征劃分?jǐn)?shù)據(jù)集



[python] view plain copy

  1. def splitDataSet(dataSet, axis, value):  

  2.     retDataSet = []  

  3.     for featVec in dataSet:  

  4.         if featVec[axis] == value:      #abstract the fature  

  5.             reducedFeatVec = featVec[:axis]  

  6.             reducedFeatVec.extend(featVec[axis+1:])  

  7.             retDataSet.append(reducedFeatVec)  

  8.     return retDataSet  



4.選擇最好的數(shù)據(jù)集劃分方式


[python] view plain copy

  1. def chooseBestFeatureToSplit(dataSet):  

  2.     numFeatures = len(dataSet[0])-1  

  3.     baseEntropy = calcShannonEnt(dataSet)  

  4.     bestInfoGain = 0.0; bestFeature = -1  

  5.     for i in range(numFeatures):  

  6.         featList = [example[i] for example in dataSet]  

  7.         uniqueVals = set(featList)  

  8.         newEntropy = 0.0  

  9.         for value in uniqueVals:  

  10.             subDataSet = splitDataSet(dataSet, i , value)  

  11.             prob = len(subDataSet)/float(len(dataSet))  

  12.             newEntropy +=prob * calcShannonEnt(subDataSet)  

  13.         infoGain = baseEntropy - newEntropy  

  14.         if(infoGain > bestInfoGain):  

  15.             bestInfoGain = infoGain  

  16.             bestFeature = i  

  17.     return bestFeature  


5.遞歸創(chuàng)建樹


    用于找出出現(xiàn)次數(shù)最多的分類名稱的函數(shù)


[python] view plain copy

  1. def majorityCnt(classList):  

  2.     classCount = {}  

  3.     for vote in classList:  

  4.         if vote not in classCount.keys(): classCount[vote] = 0  

  5.         classCount[vote] += 1  

  6.     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)  

  7.     return sortedClassCount[0][0]  


  用于創(chuàng)建樹的函數(shù)代碼



[python] view plain copy

  1. def createTree(dataSet, labels):  

  2.     classList = [example[-1for example in dataSet]  

  3.     # the type is the same, so stop classify  

  4.     if classList.count(classList[0]) == len(classList):  

  5.         return classList[0]  

  6.     # traversal all the features and choose the most frequent feature  

  7.     if (len(dataSet[0]) == 1):  

  8.         return majorityCnt(classList)  

  9.     bestFeat = chooseBestFeatureToSplit(dataSet)  

  10.     bestFeatLabel = labels[bestFeat]  

  11.     myTree = {bestFeatLabel:{}}  

  12.     del(labels[bestFeat])  

  13.     #get the list which attain the whole properties  

  14.     featValues = [example[bestFeat] for example in dataSet]  

  15.     uniqueVals = set(featValues)  

  16.     for value in uniqueVals:  

  17.         subLabels = labels[:]  

  18.         myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)  

  19.     return myTree  


然后是在python 名利提示符號(hào)輸入如下命令:



[python] view plain copy

  1. myDat, labels = trees.createDataSet()  

  2. myTree = trees.createTree(myDat,labels)  

  3. print myTree  


結(jié)果是:


{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}


6.實(shí)用決策樹進(jìn)行分類的函數(shù)


[python] view plain copy

  1. def classify(inputTree, featLabels, testVec):  

  2.     firstStr = inputTree.keys()[0]  

  3.     secondDict = inputTree[firstStr]  

  4.     featIndex = featLabels.index(firstStr)  

  5.     for key in secondDict.keys():  

  6.         if testVec[featIndex] == key:  

  7.             if type(secondDict[key]).__name__ == 'dict':  

  8.                 classLabel = classify(secondDict[key], featLabels, testVec)  

  9.             else: classLabel = secondDict[key]  

  10.     return classLabel  


在Python命令提示符,,輸入:



[python] view plain copy

  1. trees.classify(myTree,labels,[1,0])  


得到結(jié)果:

'no'

Congratulation. Oh yeah. You did it.!!!


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多