python實(shí)現(xiàn)決策樹(shù)
本文實(shí)例為大家分享了python實(shí)現(xiàn)決策樹(shù)的具體代碼,供大家參考,具體內(nèi)容如下
算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):計(jì)算復(fù)雜度不高,輸出結(jié)果易于理解,對(duì)中間值缺失不敏感,可以處理不相關(guān)的特征數(shù)據(jù)
缺點(diǎn):可能會(huì)產(chǎn)生過(guò)度匹配的問(wèn)題
適用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型
算法思想:
1.決策樹(shù)構(gòu)造的整體思想:
決策樹(shù)說(shuō)白了就好像是if-else結(jié)構(gòu)一樣,它的結(jié)果就是你要生成這個(gè)一個(gè)可以從根開(kāi)始不斷判斷選擇到葉子節(jié)點(diǎn)的樹(shù),但是呢這里的if-else必然不會(huì)是讓我們認(rèn)為去設(shè)置的,我們要做的是提供一種方法,計(jì)算機(jī)可以根據(jù)這種方法得到我們所需要的決策樹(shù)。這個(gè)方法的重點(diǎn)就在于如何從這么多的特征中選擇出有價(jià)值的,并且按照最好的順序由根到葉選擇。完成了這個(gè)我們也就可以遞歸構(gòu)造一個(gè)決策樹(shù)了
2.信息增益
劃分?jǐn)?shù)據(jù)集的最大原則是將無(wú)序的數(shù)據(jù)變得更加有序。既然這又牽涉到信息的有序無(wú)序問(wèn)題,自然要想到想弄的信息熵了。這里我們計(jì)算用的也是信息熵(另一種方法是基尼不純度)。公式如下:
數(shù)據(jù)需要滿足的要求:
1 數(shù)據(jù)必須是由列表元素組成的列表,而且所有的列白哦元素都要具有相同的數(shù)據(jù)長(zhǎng)度
2 數(shù)據(jù)的最后一列或者每個(gè)實(shí)例的最后一個(gè)元素應(yīng)是當(dāng)前實(shí)例的類別標(biāo)簽
函數(shù):
calcShannonEnt(dataSet)
計(jì)算數(shù)據(jù)集的香農(nóng)熵,分兩步,第一步計(jì)算頻率,第二部根據(jù)公式計(jì)算香農(nóng)熵
splitDataSet(dataSet, aixs, value)
劃分?jǐn)?shù)據(jù)集,將滿足X[aixs]==value的值都劃分到一起,返回一個(gè)劃分好的集合(不包括用來(lái)劃分的aixs屬性,因?yàn)椴恍枰?br />
chooseBestFeature(dataSet)
選擇最好的屬性進(jìn)行劃分,思路很簡(jiǎn)單就是對(duì)每個(gè)屬性都劃分下,看哪個(gè)好。這里使用到了一個(gè)set來(lái)選取列表中唯一的元素,這是一中很快的方法
majorityCnt(classList)
因?yàn)槲覀冞f歸構(gòu)建決策樹(shù)是根據(jù)屬性的消耗進(jìn)行計(jì)算的,所以可能會(huì)存在最后屬性用完了,但是分類還是沒(méi)有算完,這時(shí)候就會(huì)采用多數(shù)表決的方式計(jì)算節(jié)點(diǎn)分類
createTree(dataSet, labels)
基于遞歸構(gòu)建決策樹(shù)。這里的label更多是對(duì)于分類特征的名字,為了更好看和后面的理解。
#coding=utf-8 import operator from math import log import time def createDataSet(): dataSet=[[1,1,'yes'], [1,1,'yes'], [1,0,'no'], [0,1,'no'], [0,1,'no']] labels = ['no surfaceing','flippers'] return dataSet, labels #計(jì)算香農(nóng)熵 def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = {} for feaVec in dataSet: currentLabel = feaVec[-1] if currentLabel not in labelCounts: labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 shannonEnt = 0.0 for key in labelCounts: prob = float(labelCounts[key])/numEntries shannonEnt -= prob * log(prob, 2) return shannonEnt def splitDataSet(dataSet, axis, value): retDataSet = [] for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet def chooseBestFeatureToSplit(dataSet): numFeatures = len(dataSet[0]) - 1#因?yàn)閿?shù)據(jù)集的最后一項(xiàng)是標(biāo)簽 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0 bestFeature = -1 for i in range(numFeatures): featList = [example[i] for example in dataSet] uniqueVals = set(featList) newEntropy = 0.0 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet) / float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) infoGain = baseEntropy -newEntropy if infoGain > bestInfoGain: bestInfoGain = infoGain bestFeature = i return bestFeature #因?yàn)槲覀冞f歸構(gòu)建決策樹(shù)是根據(jù)屬性的消耗進(jìn)行計(jì)算的,所以可能會(huì)存在最后屬性用完了,但是分類 #還是沒(méi)有算完,這時(shí)候就會(huì)采用多數(shù)表決的方式計(jì)算節(jié)點(diǎn)分類 def majorityCnt(classList): classCount = {} for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0 classCount[vote] += 1 return max(classCount) def createTree(dataSet, labels): classList = [example[-1] for example in dataSet] if classList.count(classList[0]) ==len(classList):#類別相同則停止劃分 return classList[0] if len(dataSet[0]) == 1:#所有特征已經(jīng)用完 return majorityCnt(classList) bestFeat = chooseBestFeatureToSplit(dataSet) bestFeatLabel = labels[bestFeat] myTree = {bestFeatLabel:{}} del(labels[bestFeat]) featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) for value in uniqueVals: subLabels = labels[:]#為了不改變?cè)剂斜淼膬?nèi)容復(fù)制了一下 myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) return myTree def main(): data,label = createDataSet() t1 = time.clock() myTree = createTree(data,label) t2 = time.clock() print myTree print 'execute for ',t2-t1 if __name__=='__main__': main()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 決策樹(shù)的python實(shí)現(xiàn)方法
- 基于ID3決策樹(shù)算法的實(shí)現(xiàn)(Python版)
- Python決策樹(shù)和隨機(jī)森林算法實(shí)例詳解
- python利用sklearn包編寫(xiě)決策樹(shù)源代碼
- 機(jī)器學(xué)習(xí)python實(shí)戰(zhàn)之決策樹(shù)
- python實(shí)現(xiàn)決策樹(shù)、隨機(jī)森林的簡(jiǎn)單原理
- Python決策樹(shù)分類算法學(xué)習(xí)
- 基于Python實(shí)現(xiàn)的ID3決策樹(shù)功能示例
- Python決策樹(shù)之基于信息增益的特征選擇示例
相關(guān)文章
python中強(qiáng)制關(guān)閉線程與協(xié)程與進(jìn)程方法
python使用中多線程、多進(jìn)程、多協(xié)程使用是比較常見(jiàn)的。那么如果在多線程等的使用,我們這個(gè)時(shí)候我們想從外部強(qiáng)制殺掉該線程請(qǐng)問(wèn)如何操作?這篇文章帶你介紹,感興趣的同學(xué)可以參考閱讀2023-03-03python數(shù)據(jù)處理67個(gè)pandas函數(shù)總結(jié)看完就用
這篇文章主要介紹了python數(shù)據(jù)處理67個(gè)pandas函數(shù)的梳理總結(jié),看完就可以去用了,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11python實(shí)現(xiàn)mysql的單引號(hào)字符串過(guò)濾方法
這篇文章主要介紹了python實(shí)現(xiàn)mysql的單引號(hào)字符串過(guò)濾方法,以一個(gè)較為詳細(xì)的實(shí)例形式分析了Python針對(duì)MySQL的操作及字符串過(guò)濾的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11python接口自動(dòng)化框架實(shí)戰(zhàn)
這篇文章主要介紹了python接口自動(dòng)化框架實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python構(gòu)造函數(shù)init實(shí)例方法解析
這篇文章主要介紹了python構(gòu)造函數(shù)init實(shí)例方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01通過(guò)代碼簡(jiǎn)單了解django model序列化作用
這篇文章主要介紹了通過(guò)代碼簡(jiǎn)單了解django model序列化作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python解析excel文件存入sqlite數(shù)據(jù)庫(kù)的方法
最近工作中遇到一個(gè)需求,需要使用Python解析excel文件并存入sqlite,本文就實(shí)現(xiàn)的過(guò)程做個(gè)總結(jié)分享給大家,文中包括數(shù)據(jù)庫(kù)設(shè)計(jì)、建立數(shù)據(jù)庫(kù)、Python解析excel文件、Python讀取文件名并解析和將解析的數(shù)據(jù)存儲(chǔ)入庫(kù),有需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11Python多線程結(jié)合隊(duì)列下載百度音樂(lè)的方法
這篇文章主要介紹了Python多線程結(jié)合隊(duì)列下載百度音樂(lè)的方法,實(shí)例分析了Python多線程及文件下載的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07