成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

機器學習決策樹算法學習筆記

人工智能 機器學習 算法
利用香濃熵找到信息增益最大的特征,按照信息增益最大的特征劃分數據,如此反復,讓無序的數據變的更加有序。使用ID3算法構建樹結構。當傳入一個新數據時,按照數據找到對應樹節點,直到最后沒有葉子節點時,完成分類。

基本概念

決策樹是分類算法。

數據類型:數值型和標稱型。因為構造算法只適用于標稱型,所以數值型數據必須離散化。

工作原理

利用香濃熵找到信息增益***的特征,按照信息增益***的特征劃分數據,如此反復,讓無序的數據變的更加有序。使用ID3算法構建樹結構。當傳入一個新數據時,按照數據找到對應樹節點,直到***沒有葉子節點時,完成分類。

樣例

機器學習決策樹算法學習筆記

不浮出水面是否可以生存? 是否有腳蹼? 是否是魚類?

通過“不浮出水面是否可以生存”和“是否有腳蹼”這兩個特征來判斷是否是魚類。構建一個簡單決策樹,如果得到一個新的生物,可以用此來判斷是否是魚類。

樣例代碼

 

  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 

香農熵公式

如果待分類的事務可能劃分在多個分類之中,則符號Xi的信息定義為:

機器學習決策樹算法學習筆記

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

為了計算熵,需要計算所有類別所有可能值包含的信息期望值總和,公式為:

機器學習決策樹算法學習筆記

其中n是分類的數目

香農熵算法

 

  1. def calcShannonEnt(dataSet):   
  2.     # 選擇該分類的概率 就是每個類型/總個數 
  3.     # 總數,多少行數據 
  4.     numEntries = len(dataSet) 
  5.     labelCounts = {} 
  6.     # 取到的每個類型個數 
  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.         # 得到選擇該分類的概率 
  15.         prob = float(labelCounts[key])/numEntries 
  16.         # 按照公式 
  17.         shannonEnt -= prob * log(prob,2) #log base 2 
  18.     return shannonEnt 

按照香農熵劃分數據

除了需要測量信息熵,還需要劃分數據集,度量花費數據集的熵,以便判斷當前是否正確劃分。 循環計算香濃熵和splitDataSet(),找到***的特征劃分方式。

 

  1. def splitDataSet(dataSet, axis, value):   
  2.     # 這個算法返回axis下標之外的列 
  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.     # 先取***一列,用在標簽結果:是魚或不是魚。 
  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.         # 創建一個列表包含這個特征的所有值 
  21.         featList = [example[i] for example in dataSet] 
  22.         # 利用set去重 
  23.         uniqueVals = set(featList) 
  24.         newEntropy = 0.0 
  25.         # 計算該特征所包含類型的香濃熵之和 
  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.         # 取***的信息增益,并記錄下標 
  33.         if (infoGain > bestInfoGain): 
  34.             bestInfoGain = infoGain 
  35.             bestFeature = i 
  36.     # 返回下標 
  37.     return bestFeature 

數據集需要滿足一定的要求:

  • 數據必須是一種有列表元素組成的列表。(二維數組)
  • 所有列表元素必須有相同長度。
  • ***一列必須是當前實例的標簽。

遞歸構建決策樹

機器學習決策樹算法學習筆記

多數表決算法

如果數據集已經處理了所有屬性,但是類標簽依然不是唯一的,此時需要決定如何定義該葉子節點,在這種情況下,我們通常會采用多數表決決定該葉子節點。

 

  1. import operator   
  2. def majorityCnt(classList):   
  3.     # 排序取出種類最多的 
  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] 

構建樹算法

 

  1. def createTree(dataSet,labels):   
  2.     # 取出結果 
  3.     classList = [example[-1] for example in dataSet] 
  4.     # 如果結果里的***個元素所代表的數據個數等于結果本身,說明沒有其他分類了 
  5.     if classList.count(classList[0]) == len(classList):  
  6.         return classList[0] 
  7.     # 如果沒有更多數據了,超過一個才有分類的意義 
  8.     if len(dataSet[0]) == 1: 
  9.         # 多數表決,返回出現次數最多的 
  10.         return majorityCnt(classList) 
  11.  
  12.     # 選出最適合用于切分類型的下標 
  13.     bestFeat = chooseBestFeatureToSplit(dataSet) 
  14.     # 根據下標取出標簽 
  15.     bestFeatLabel = labels[bestFeat] 
  16.     # 構建樹 
  17.     myTree = {bestFeatLabel:{}} 
  18.     # 刪除取出過的標簽,避免重復計算 
  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.         # 復制所有的子標簽,因為是引用類型,以避免改變原始標簽數據 
  28.         subLabels = labels[:] 
  29.         # 遞歸的構建樹 
  30.         myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) 
  31.     return myTree 

使用決策樹分類

 

  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[:]) #因為內部會刪除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 

決策樹的存儲

構造決策樹是耗時的任務,即使處理很小的數據集。所以我們可以使用構造好的決策樹。

 

  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) 

優點

  • 計算復雜度不高
  • 輸出結果易于理解
  • 對中間值缺失不敏感
  • 可以處理不相關特偵

缺點

  • 可能產生過度匹配問題
責任編輯:未麗燕 來源: 36大數據
相關推薦

2017-11-21 13:00:20

機器學習決策樹可視化

2017-07-18 16:25:31

機器學習算法決策樹

2022-12-21 14:39:35

機器學習案發決策樹

2014-07-07 10:05:57

機械學習

2012-08-06 09:04:01

決策樹建模

2017-10-18 14:11:20

機器學習決策樹隨機森林

2024-09-11 08:34:28

2022-11-11 08:00:00

決策樹機器學習監督學習

2018-02-02 17:08:48

機器學習算法決策樹

2020-12-22 19:37:04

決策樹機器學習人工智能

2009-08-14 09:41:03

C#遺傳算法

2009-10-14 09:27:30

VB.NET編碼算法

2016-09-30 16:12:47

GBDT算法決策樹

2023-08-11 17:30:54

決策樹機器學習算法

2017-02-23 08:45:36

Python決策樹數據集

2022-01-24 09:00:00

機器學習決策樹算法

2019-05-15 09:00:00

決策樹機器學習人工智能

2018-02-02 15:50:07

決策樹Apache Spar數據

2009-08-14 17:38:08

C#改寫方法

2017-08-04 14:28:40

決策樹隨機森林CART模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久综合 | 国产精品久久久久久亚洲调教 | 亚洲午夜精品视频 | 91久久 | 日韩精品激情 | 久久久精品影院 | 一级h片 | 亚洲va中文字幕 | 在线免费看黄 | 亚洲精品在线观看网站 | 国产sm主人调教女m视频 | 亚洲国产一区二区三区在线观看 | 天天射天天干 | 日韩国产免费 | 久久美女网| 久久国产一区二区三区 | 免费中文字幕日韩欧美 | 国产欧美精品一区二区三区 | 成人免费观看男女羞羞视频 | 日韩欧美在线观看 | 国内在线视频 | 欧美日韩大陆 | 天堂一区二区三区 | 国产一级大片 | av在线亚洲天堂 | 国产yw851.c免费观看网站 | 午夜tv免费观看 | 日韩欧美二区 | 国产日产欧产精品精品推荐蛮挑 | 337p日本欧洲亚洲大胆鲁鲁 | 欧美视频1区 | 欧洲国产精品视频 | 国产精品久久九九 | 国产精品视频一 | 亚洲精品在线视频 | 视频一区在线观看 | 99精品视频免费观看 | 成人国产精品入口免费视频 | 中文字幕在线观看www | 亚洲精品在线看 | 蜜臀av日日欢夜夜爽一区 |