自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

機(jī)器學(xué)習(xí)決策樹(shù)算法學(xué)習(xí)筆記

人工智能 機(jī)器學(xué)習(xí) 算法
利用香濃熵找到信息增益最大的特征,按照信息增益最大的特征劃分?jǐn)?shù)據(jù),如此反復(fù),讓無(wú)序的數(shù)據(jù)變的更加有序。使用ID3算法構(gòu)建樹(shù)結(jié)構(gòu)。當(dāng)傳入一個(gè)新數(shù)據(jù)時(shí),按照數(shù)據(jù)找到對(duì)應(yīng)樹(shù)節(jié)點(diǎn),直到最后沒(méi)有葉子節(jié)點(diǎn)時(shí),完成分類(lèi)。

基本概念

決策樹(shù)是分類(lèi)算法。

數(shù)據(jù)類(lèi)型:數(shù)值型和標(biāo)稱(chēng)型。因?yàn)闃?gòu)造算法只適用于標(biāo)稱(chēng)型,所以數(shù)值型數(shù)據(jù)必須離散化。

工作原理

利用香濃熵找到信息增益***的特征,按照信息增益***的特征劃分?jǐn)?shù)據(jù),如此反復(fù),讓無(wú)序的數(shù)據(jù)變的更加有序。使用ID3算法構(gòu)建樹(shù)結(jié)構(gòu)。當(dāng)傳入一個(gè)新數(shù)據(jù)時(shí),按照數(shù)據(jù)找到對(duì)應(yīng)樹(shù)節(jié)點(diǎn),直到***沒(méi)有葉子節(jié)點(diǎn)時(shí),完成分類(lèi)。

樣例

機(jī)器學(xué)習(xí)決策樹(shù)算法學(xué)習(xí)筆記

不浮出水面是否可以生存? 是否有腳蹼? 是否是魚(yú)類(lèi)?

通過(guò)“不浮出水面是否可以生存”和“是否有腳蹼”這兩個(gè)特征來(lái)判斷是否是魚(yú)類(lèi)。構(gòu)建一個(gè)簡(jiǎn)單決策樹(shù),如果得到一個(gè)新的生物,可以用此來(lái)判斷是否是魚(yú)類(lèi)。

樣例代碼

 

  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 

香農(nóng)熵公式

如果待分類(lèi)的事務(wù)可能劃分在多個(gè)分類(lèi)之中,則符號(hào)Xi的信息定義為:

機(jī)器學(xué)習(xí)決策樹(shù)算法學(xué)習(xí)筆記

其中P(Xi)是選擇該分類(lèi)的概率

為了計(jì)算熵,需要計(jì)算所有類(lèi)別所有可能值包含的信息期望值總和,公式為:

機(jī)器學(xué)習(xí)決策樹(shù)算法學(xué)習(xí)筆記

其中n是分類(lèi)的數(shù)目

香農(nóng)熵算法

 

  1. def calcShannonEnt(dataSet):   
  2.     # 選擇該分類(lèi)的概率 就是每個(gè)類(lèi)型/總個(gè)數(shù) 
  3.     # 總數(shù),多少行數(shù)據(jù) 
  4.     numEntries = len(dataSet) 
  5.     labelCounts = {} 
  6.     # 取到的每個(gè)類(lèi)型個(gè)數(shù) 
  7.     for featVec in dataSet: 
  8.         currentLabel = featVec[-1] 
  9.         if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 
  10.         labelCounts[currentLabel] += 1 
  11.  
  12.     shannonEnt = 0.0 
  13.     for key in labelCounts: 
  14.         # 得到選擇該分類(lèi)的概率 
  15.         prob = float(labelCounts[key])/numEntries 
  16.         # 按照公式 
  17.         shannonEnt -= prob * log(prob,2) #log base 2 
  18.     return shannonEnt 

按照香農(nóng)熵劃分?jǐn)?shù)據(jù)

除了需要測(cè)量信息熵,還需要?jiǎng)澐謹(jǐn)?shù)據(jù)集,度量花費(fèi)數(shù)據(jù)集的熵,以便判斷當(dāng)前是否正確劃分。 循環(huán)計(jì)算香濃熵和splitDataSet(),找到***的特征劃分方式。

 

  1. def splitDataSet(dataSet, axis, value):   
  2.     # 這個(gè)算法返回axis下標(biāo)之外的列 
  3.     retDataSet = [] 
  4.     for featVec in dataSet: 
  5.         if featVec[axis] == value: 
  6.             reducedFeatVec = featVec[:axis]     #chop out axis used for splitting 
  7.             reducedFeatVec.extend(featVec[axis+1:]) 
  8.             retDataSet.append(reducedFeatVec) 
  9.     return retDataSet 
  10.  
  11. def chooseBestFeatureToSplit(dataSet):   
  12.     # 先取***一列,用在標(biāo)簽結(jié)果:是魚(yú)或不是魚(yú)。 
  13.     numFeatures = len(dataSet[0]) - 1 
  14.     # 原始香濃熵 
  15.     baseEntropy = calcShannonEnt(dataSet) 
  16.  
  17.     bestInfoGain = 0.0; bestFeature = -1 
  18.     # 遍歷所有的特征 
  19.     for i in range(numFeatures): 
  20.         # 創(chuàng)建一個(gè)列表包含這個(gè)特征的所有值 
  21.         featList = [example[i] for example in dataSet] 
  22.         # 利用set去重 
  23.         uniqueVals = set(featList) 
  24.         newEntropy = 0.0 
  25.         # 計(jì)算該特征所包含類(lèi)型的香濃熵之和 
  26.         for value in uniqueVals: 
  27.             subDataSet = splitDataSet(dataSet, i, value) 
  28.             prob = len(subDataSet)/float(len(dataSet)) 
  29.             newEntropy += prob * calcShannonEnt(subDataSet) 
  30.         # 得到信息增益 
  31.         infoGain = baseEntropy - newEntropy 
  32.         # 取***的信息增益,并記錄下標(biāo) 
  33.         if (infoGain > bestInfoGain): 
  34.             bestInfoGain = infoGain 
  35.             bestFeature = i 
  36.     # 返回下標(biāo) 
  37.     return bestFeature 

數(shù)據(jù)集需要滿(mǎn)足一定的要求:

  • 數(shù)據(jù)必須是一種有列表元素組成的列表。(二維數(shù)組)
  • 所有列表元素必須有相同長(zhǎng)度。
  • ***一列必須是當(dāng)前實(shí)例的標(biāo)簽。

遞歸構(gòu)建決策樹(shù)

機(jī)器學(xué)習(xí)決策樹(shù)算法學(xué)習(xí)筆記

多數(shù)表決算法

如果數(shù)據(jù)集已經(jīng)處理了所有屬性,但是類(lèi)標(biāo)簽依然不是唯一的,此時(shí)需要決定如何定義該葉子節(jié)點(diǎn),在這種情況下,我們通常會(huì)采用多數(shù)表決決定該葉子節(jié)點(diǎn)。

 

  1. import operator   
  2. def majorityCnt(classList):   
  3.     # 排序取出種類(lèi)最多的 
  4.     classCount={} 
  5.     for vote in classList: 
  6.         if vote not in classCount.keys(): classCount[vote] = 0 
  7.         classCount[vote] += 1 
  8.     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True
  9.     return sortedClassCount[0][0] 

構(gòu)建樹(shù)算法

 

  1. def createTree(dataSet,labels):   
  2.     # 取出結(jié)果 
  3.     classList = [example[-1] for example in dataSet] 
  4.     # 如果結(jié)果里的***個(gè)元素所代表的數(shù)據(jù)個(gè)數(shù)等于結(jié)果本身,說(shuō)明沒(méi)有其他分類(lèi)了 
  5.     if classList.count(classList[0]) == len(classList):  
  6.         return classList[0] 
  7.     # 如果沒(méi)有更多數(shù)據(jù)了,超過(guò)一個(gè)才有分類(lèi)的意義 
  8.     if len(dataSet[0]) == 1: 
  9.         # 多數(shù)表決,返回出現(xiàn)次數(shù)最多的 
  10.         return majorityCnt(classList) 
  11.  
  12.     # 選出最適合用于切分類(lèi)型的下標(biāo) 
  13.     bestFeat = chooseBestFeatureToSplit(dataSet) 
  14.     # 根據(jù)下標(biāo)取出標(biāo)簽 
  15.     bestFeatLabel = labels[bestFeat] 
  16.     # 構(gòu)建樹(shù) 
  17.     myTree = {bestFeatLabel:{}} 
  18.     # 刪除取出過(guò)的標(biāo)簽,避免重復(fù)計(jì)算 
  19.     del(labels[bestFeat]) 
  20.     featValues = [example[bestFeat] for example in dataSet] 
  21.  
  22.     # 利用set去重 
  23.     uniqueVals = set(featValues) 
  24.  
  25.  
  26.     for value in uniqueVals: 
  27.         # 復(fù)制所有的子標(biāo)簽,因?yàn)槭且妙?lèi)型,以避免改變?cè)紭?biāo)簽數(shù)據(jù) 
  28.         subLabels = labels[:] 
  29.         # 遞歸的構(gòu)建樹(shù) 
  30.         myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) 
  31.     return myTree 

使用決策樹(shù)分類(lèi)

 

  1. def classify(inputTree,featLabels,testVec):   
  2.     firstStr = inputTree.keys()[0] 
  3.     secondDict = inputTree[firstStr] 
  4.     featIndex = featLabels.index(firstStr) 
  5.     # print 'featIndex %s' % (featIndex) 
  6.     key = testVec[featIndex] 
  7.     # print 'key %s' % (key
  8.     valueOfFeat = secondDict[key
  9.     if isinstance(valueOfFeat, dict):  
  10.         classLabel = classify(valueOfFeat, featLabels, testVec) 
  11.     else: classLabel = valueOfFeat 
  12.     return classLabel 
  13.  
  14. dataSet, labels = createDataSet()   
  15. mytree = createTree(dataSet, labels[:]) #因?yàn)閮?nèi)部會(huì)刪除labels里的值所以用這樣copy一份   
  16. print mytree   
  17. # {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}} 
  18. print classify(mytree, labels, [0,1])   
  19. no 

決策樹(shù)的存儲(chǔ)

構(gòu)造決策樹(shù)是耗時(shí)的任務(wù),即使處理很小的數(shù)據(jù)集。所以我們可以使用構(gòu)造好的決策樹(shù)。

 

  1. def storeTree(inputTree,filename):   
  2.     import pickle 
  3.     fw = open(filename,'w'
  4.     pickle.dump(inputTree,fw) 
  5.     fw.close()  
  6. def grabTree(filename):   
  7.     import pickle 
  8.     fr = open(filename) 
  9.     return pickle.load(fr) 

優(yōu)點(diǎn)

  • 計(jì)算復(fù)雜度不高
  • 輸出結(jié)果易于理解
  • 對(duì)中間值缺失不敏感
  • 可以處理不相關(guān)特偵

缺點(diǎn)

  • 可能產(chǎn)生過(guò)度匹配問(wèn)題
責(zé)任編輯:未麗燕 來(lái)源: 36大數(shù)據(jù)
相關(guān)推薦

2017-11-21 13:00:20

機(jī)器學(xué)習(xí)決策樹(shù)可視化

2017-07-18 16:25:31

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

2022-12-21 14:39:35

機(jī)器學(xué)習(xí)案發(fā)決策樹(shù)

2014-07-07 10:05:57

機(jī)械學(xué)習(xí)

2012-08-06 09:04:01

決策樹(shù)建模

2017-10-18 14:11:20

機(jī)器學(xué)習(xí)決策樹(shù)隨機(jī)森林

2024-09-11 08:34:28

2022-11-11 08:00:00

決策樹(shù)機(jī)器學(xué)習(xí)監(jiān)督學(xué)習(xí)

2018-02-02 17:08:48

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

2020-12-22 19:37:04

決策樹(shù)機(jī)器學(xué)習(xí)人工智能

2009-10-14 09:27:30

VB.NET編碼算法

2009-08-14 09:41:03

C#遺傳算法

2017-02-23 08:45:36

Python決策樹(shù)數(shù)據(jù)集

2023-08-11 17:30:54

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

2016-09-30 16:12:47

GBDT算法決策樹(shù)

2022-01-24 09:00:00

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

2018-02-02 15:50:07

決策樹(shù)Apache Spar數(shù)據(jù)

2019-05-15 09:00:00

決策樹(shù)機(jī)器學(xué)習(xí)人工智能

2017-08-04 14:28:40

決策樹(shù)隨機(jī)森林CART模型

2009-08-14 17:38:08

C#改寫(xiě)方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)