Python3.0 實(shí)現(xiàn)決策樹算法的流程
決策樹的一般流程
檢測數(shù)據(jù)集中的每個子項(xiàng)是否屬于同一個分類
if so return 類標(biāo)簽 Else
尋找劃分?jǐn)?shù)據(jù)集的最好特征
劃分?jǐn)?shù)據(jù)集
創(chuàng)建分支 節(jié)點(diǎn)
from math import log
import operator
#生成樣本數(shù)據(jù)集
def createDataSet():
dataSet = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels = ['no surfacing','flipper']
return dataSet,labels
# 計(jì)算香農(nóng)熵 香農(nóng) 大神必須要膜拜啊,信息界的根目錄人物啊
# no surfacing 指的是 不浮出水面能否生存 1 標(biāo)識 是 0 指的是否
# flipper 指的是是否有腳
# yes no指的是否是魚類
def calcShannonEnt(dataSet):
numEntries = len(dataSet) # 用上面的createDataSet dataSet 這個值就是5
#定義標(biāo)簽字典
labelCounts = {}
# 為所有可能的分類創(chuàng)建字典
for featVec in dataSet:
currentLabel = featVec[-1] #這個-1指的是去取最后一個維度 對應(yīng)數(shù)據(jù)dataSet 這里取的是yes和no
if currentLabel not in labelCounts.keys():
# 如果當(dāng)前分類標(biāo)簽不在 標(biāo)簽字典中
labelCounts[currentLabel] = 0
# 其他情況 分類標(biāo)簽分類加1
labelCounts[currentLabel] += 1
#定義香農(nóng)熵 以2為底數(shù)求對數(shù)
shannonEnt = 0.0
for key in labelCounts:
#計(jì)算 yes 或者No 出現(xiàn)的概率
pro = float(labelCounts[key])/numEntries
# 計(jì)算香農(nóng)熵
shannonEnt -= pro*log(pro,2)
return shannonEnt
#dataSet是待劃分的數(shù)據(jù)集, 劃分?jǐn)?shù)據(jù)集的特征 axis 特征的返回值value
#最后是創(chuàng)建了一個新的列表對象
def splitDataSet(dataSet, axis , value):
# 創(chuàng)建新list對象
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
# 選擇最好的特征值進(jìn)行數(shù)據(jù)集劃分
def chooseBestFeatureToSplit(dataSet):
# len(dataSet[0])是計(jì)算這一行有多少列,即有多少個特征值
numFeatures = len(dataSet[0])-1 # -1 是最后一個特征值就不要記錄在內(nèi)了,算baseEntrop的時候已經(jīng)算了最后一個特征值yes no
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
#創(chuàng)建唯一的分類標(biāo)簽列表 也就是說提取dataSet每一行第i個值 就提取dat
featList = [example[i] for example in dataSet]
# 取出有幾種特征值
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
#創(chuàng)建特征值的子數(shù)據(jù)集
subDataSet = splitDataSet(dataSet,i, value)
#計(jì)算該特征值數(shù)據(jù)對總數(shù)在數(shù)據(jù)對總數(shù)出現(xiàn)的概率
pro = len(subDataSet)/float(len(dataSet))
#計(jì)算分割出來的子集香農(nóng)熵
newEntropy += pro*calcShannonEnt(subDataSet)
#計(jì)算信息增益 得到最好的特征值 這個理論是這樣的g(D,A) = H(D)-H(D/A)
infoGain = baseEntropy-newEntropy
#取出最大的信息增益,此時特征值最大
if(infoGain >bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
'''
#構(gòu)建決策樹是根據(jù)特征值的消耗來計(jì)算的,如果后面的特征值已經(jīng)全部用完了
但是還沒有分出結(jié)果,這個時候就需要使用多數(shù)表決方式計(jì)算節(jié)點(diǎn)分類
最后返回最大的分類
'''
def majorityCnt(classList):
# 分類的字典
classCount = {}
for vote in range(classList):
#如果不在 分類字典中
if vote not in classCount.keys(): classCount[vote] = 0
classCount[vote] += 1
# 根據(jù)出現(xiàn)的次數(shù)大到小排序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
#創(chuàng)建決策樹
def createTree(dataSet, labels):
# 獲取數(shù)據(jù)樣本每組最后一組的特征值 這里是yes,no
classList = [example[-1] for example in dataSet]
# 如果說這個classList 全部都是 yes 或者全部是no 那肯定子返回yes 或者no
if(classList.count(classList[0]) == len(classList)):
return classList[0]
#如果遍歷完所有的特征返回出現(xiàn)次數(shù)最多的
#是用消耗特征值的方式進(jìn)行構(gòu)造決策樹的,每次會消掉一個特征值
if len(dataSet[0]) == 1:
return majorityCnt(classList)
#選擇最好的特征值
bestFeat = chooseBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
# 刪除labels中的一特征值
del(labels[bestFeat])
#找到特征值那一列
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
# labels列表的賦值
subLabels = labels[:]
myTree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
return myTree
dataSet,lables = createDataSet()
shannonEnt= calcShannonEnt(dataSet)
my = createTree(dataSet,lables)
print(my)
總結(jié)
以上所述是小編給大家介紹的Python3.0 實(shí)現(xiàn)決策樹算法的流程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python實(shí)現(xiàn)字典(dict)和字符串(string)的相互轉(zhuǎn)換方法
這篇文章主要介紹了python實(shí)現(xiàn)字典(dict)和字符串(string)的相互轉(zhuǎn)換方法,涉及Python字典dict的遍歷與字符串轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-03-03
python3中dict.keys().sort()用不了的解決方法
本文主要介紹了python3中dict.keys().sort()用不了的解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)
直方圖就是對圖像的另外一種解釋,它描述了整幅圖像的灰度分布。通過直方圖我們可以對圖像的亮度、灰度分布、對比度等有了一個直觀的認(rèn)識。本文將為大家詳細(xì)介紹一下如何通過OpenCV實(shí)現(xiàn)直方圖統(tǒng)計(jì),感興趣的可以了解一下2021-12-12
python轉(zhuǎn)換pkl模型文件為txt文件問題
這篇文章主要介紹了python轉(zhuǎn)換pkl模型文件為txt文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Python 處理數(shù)據(jù)庫事務(wù)的操作方法
在Python中,處理數(shù)據(jù)庫事務(wù)通常涉及使用特定的數(shù)據(jù)庫驅(qū)動如sqlite3、PyMySQL和psycopg2等,這些庫提供事務(wù)管理功能,允許開發(fā)者手動控制事務(wù)的提交和回滾,本文給大家介紹Python如何處理數(shù)據(jù)庫事務(wù),感興趣的朋友一起看看吧2024-10-10
趣味Python實(shí)戰(zhàn)練習(xí)之自動更換桌面壁紙腳本附源碼
讀萬卷書不如行萬里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來,本篇文章手把手帶你編寫一個自動更換桌面壁紙的腳本,代碼簡潔而且短,相信你一定看得懂,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
python 虛擬環(huán)境的創(chuàng)建與使用方法
本文先介紹虛擬環(huán)境的基礎(chǔ)知識以及使用方法,然后再深入介紹虛擬環(huán)境背后的工作原理,需要的朋友可以參考下2021-06-06

