日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python3 ID3決策樹判斷申請貸款是否成功的實(shí)現(xiàn)代碼

瀏覽:170日期:2022-07-24 18:50:54
1. 定義生成樹

# -*- coding: utf-8 -*-#生成樹的函數(shù)from numpy import * import numpy as npimport pandas as pdfrom math import log import operator # 計(jì)算數(shù)據(jù)集的信息熵(Information Gain)增益函數(shù)(機(jī)器學(xué)習(xí)實(shí)戰(zhàn)中信息熵叫香農(nóng)熵)def calcInfoEnt(dataSet):#本題中Label即好or壞瓜 #dataSet每一列是一個(gè)屬性(列末是Label) numEntries = len(dataSet) #每一行是一個(gè)樣本 labelCounts = {} #給所有可能的分類創(chuàng)建字典labelCounts for featVec in dataSet: #按行循環(huán):即rowVev取遍了數(shù)據(jù)集中的每一行 currentLabel = featVec[-1] #故featVec[-1]取遍每行最后一個(gè)值即Label if currentLabel not in labelCounts.keys(): #如果當(dāng)前的Label在字典中還沒有 labelCounts[currentLabel] = 0 #則先賦值0來創(chuàng)建這個(gè)詞 labelCounts[currentLabel] += 1 #計(jì)數(shù), 統(tǒng)計(jì)每類Label數(shù)量(這行不受if限制) InfoEnt = 0.0 for key in labelCounts: #遍歷每類Label prob = float(labelCounts[key])/numEntries #各類Label熵累加 InfoEnt -= prob * log(prob,2) #ID3用的信息熵增益公式 return InfoEnt### 對于離散特征: 取出該特征取值為value的所有樣本def splitDiscreteDataSet(dataSet, axis, value): #dataSet是當(dāng)前結(jié)點(diǎn)(待劃分)集合,axis指示劃分所依據(jù)的屬性,value該屬性用于劃分的取值 retDataSet = [] #為return Data Set分配一個(gè)列表用來儲(chǔ)存 for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] #該特征之前的特征仍保留在樣本dataSet中 reducedFeatVec.extend(featVec[axis+1:]) #該特征之后的特征仍保留在樣本dataSet中 retDataSet.append(reducedFeatVec) #把這個(gè)樣本加到list中 return retDataSet### 對于連續(xù)特征: 返回特征取值大于value的所有樣本(以value為閾值將集合分成兩部分)def splitContinuousDataSet(dataSet, axis, value): retDataSetG = [] #將儲(chǔ)存取值大于value的樣本 retDataSetL = [] #將儲(chǔ)存取值小于value的樣本 for featVec in dataSet: if featVec[axis] > value: reducedFeatVecG = featVec[:axis] reducedFeatVecG.extend(featVec[axis+1:]) retDataSetG.append(reducedFeatVecG) else: reducedFeatVecL = featVec[:axis] reducedFeatVecL.extend(featVec[axis+1:]) retDataSetL.append(reducedFeatVecL) return retDataSetG,retDataSetL #返回兩個(gè)集合, 是含2個(gè)元素的tuple形式### 根據(jù)InfoGain選擇當(dāng)前最好的劃分特征(以及對于連續(xù)變量還要選擇以什么值劃分)def chooseBestFeatureToSplit(dataSet,labels): numFeatures = len(dataSet[0])-1 baseEntropy = calcInfoEnt(dataSet) bestInfoGain = 0.0; bestFeature = -1 bestSplitDict = {} for i in range(numFeatures): #遍歷所有特征:下面這句是取每一行的第i個(gè), 即得當(dāng)前集合所有樣本第i個(gè)feature的值 featList = [example[i] for example in dataSet] #判斷是否為離散特征 if not (type(featList[0]).__name__==’float’ or type(featList[0]).__name__==’int’): # 對于離散特征:求若以該特征劃分的熵增 uniqueVals = set(featList) #從列表中創(chuàng)建集合set(得列表唯一元素值) newEntropy = 0.0 for value in uniqueVals: #遍歷該離散特征每個(gè)取值 subDataSet = splitDiscreteDataSet(dataSet, i, value)#計(jì)算每個(gè)取值的信息熵 prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * calcInfoEnt(subDataSet)#各取值的熵累加 infoGain = baseEntropy - newEntropy #得到以該特征劃分的熵增 # 對于連續(xù)特征:求若以該特征劃分的熵增(區(qū)別:n個(gè)數(shù)據(jù)則需添n-1個(gè)候選劃分點(diǎn), 并選最佳劃分點(diǎn)) else: #產(chǎn)生n-1個(gè)候選劃分點(diǎn) sortfeatList=sorted(featList) splitList=[] for j in range(len(sortfeatList)-1): #產(chǎn)生n-1個(gè)候選劃分點(diǎn) splitList.append((sortfeatList[j] + sortfeatList[j+1])/2.0) bestSplitEntropy = 10000 #設(shè)定一個(gè)很大的熵值(之后用) #遍歷n-1個(gè)候選劃分點(diǎn): 求選第j個(gè)候選劃分點(diǎn)劃分時(shí)的熵增, 并選出最佳劃分點(diǎn) for j in range(len(splitList)): value = splitList[j] newEntropy = 0.0 DataSet = splitContinuousDataSet(dataSet, i, value) subDataSetG = DataSet[0] subDataSetL = DataSet[1] probG = len(subDataSetG) / float(len(dataSet)) newEntropy += probG * calcInfoEnt(subDataSetG) probL = len(subDataSetL) / float(len(dataSet)) newEntropy += probL * calcInfoEnt(subDataSetL) if newEntropy < bestSplitEntropy: bestSplitEntropy = newEntropy bestSplit = j bestSplitDict[labels[i]] = splitList[bestSplit]#字典記錄當(dāng)前連續(xù)屬性的最佳劃分點(diǎn) infoGain = baseEntropy - bestSplitEntropy #計(jì)算以該節(jié)點(diǎn)劃分的熵增# 在所有屬性(包括連續(xù)和離散)中選擇可以獲得最大熵增的屬性 if infoGain > bestInfoGain: bestInfoGain = infoGain bestFeature = i #若當(dāng)前節(jié)點(diǎn)的最佳劃分特征為連續(xù)特征,則需根據(jù)“是否小于等于其最佳劃分點(diǎn)”進(jìn)行二值化處理 #即將該特征改為“是否小于等于bestSplitValue”, 例如將“密度”變?yōu)椤懊芏?lt;=0.3815” #注意:以下這段直接操作了原dataSet數(shù)據(jù), 之前的那些float型的值相應(yīng)變?yōu)?和1 #【為何這樣做?】在函數(shù)createTree()末尾將看到解釋 if type(dataSet[0][bestFeature]).__name__==’float’ or type(dataSet[0][bestFeature]).__name__==’int’: bestSplitValue = bestSplitDict[labels[bestFeature]] labels[bestFeature] = labels[bestFeature] + ’<=’ + str(bestSplitValue) for i in range(shape(dataSet)[0]): if dataSet[i][bestFeature] <= bestSplitValue: dataSet[i][bestFeature] = 1 else: dataSet[i][bestFeature] = 0 return bestFeature # 若特征已經(jīng)劃分完,節(jié)點(diǎn)下的樣本還沒有統(tǒng)一取值,則需要進(jìn)行投票:計(jì)算每類Label個(gè)數(shù), 取max者def majorityCnt(classList): classCount = {} #將創(chuàng)建鍵值為Label類型的字典 for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0 #第一次出現(xiàn)的Label加入字典 classCount[vote] += 1 #計(jì)數(shù) return max(classCount)2. 遞歸產(chǎn)生決策樹

# 主程序:遞歸產(chǎn)生決策樹 # dataSet:當(dāng)前用于構(gòu)建樹的數(shù)據(jù)集, 最開始就是data_full,然后隨著劃分的進(jìn)行越來越小。這是因?yàn)檫M(jìn)行到到樹分叉點(diǎn)上了. 第一次劃分之前17個(gè)瓜的數(shù)據(jù)在根節(jié)點(diǎn),然后選擇第一個(gè)bestFeat是紋理. 紋理的取值有清晰、模糊、稍糊三種;將瓜分成了清晰(9個(gè)),稍糊(5個(gè)),模糊(3個(gè)),這時(shí)應(yīng)該將劃分的類別減少1以便于下次劃分。 # labels:當(dāng)前數(shù)據(jù)集中有的用于劃分的類別(這是因?yàn)橛行㎜abel當(dāng)前數(shù)據(jù)集沒了, 比如假如到某個(gè)點(diǎn)上西瓜都是淺白沒有深綠了) # data_full:全部的數(shù)據(jù) # label_full:全部的類別 numLine = numColumn = 2 #這句是因?yàn)橹笠胓lobal numLine……至于為什么我一定要用global# 我也不完全理解。如果我只定義local變量總報(bào)錯(cuò),我只好在那里的if里用global變量了。求解。def createTree(dataSet,labels,data_full,labels_full): classList = [example[-1] for example in dataSet] #遞歸停止條件1:當(dāng)前節(jié)點(diǎn)所有樣本屬于同一類;(注:count()方法統(tǒng)計(jì)某元素在列表中出現(xiàn)的次數(shù)) if classList.count(classList[0]) == len(classList): return classList[0] #遞歸停止條件2:當(dāng)前節(jié)點(diǎn)上樣本集合為空集(即特征的某個(gè)取值上已經(jīng)沒有樣本了): global numLine,numColumn (numLine,numColumn) = shape(dataSet) if float(numLine) == 0: return ’empty’ #遞歸停止條件3:所有可用于劃分的特征均使用過了,則調(diào)用majorityCnt()投票定Label; if float(numColumn) == 1: return majorityCnt(classList) #不停止時(shí)繼續(xù)劃分: bestFeat = chooseBestFeatureToSplit(dataSet,labels)#調(diào)用函數(shù)找出當(dāng)前最佳劃分特征是第幾個(gè) bestFeatLabel = labels[bestFeat] #當(dāng)前最佳劃分特征 myTree = {bestFeatLabel:{}} featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) if type(dataSet[0][bestFeat]).__name__==’str’: currentlabel = labels_full.index(labels[bestFeat]) featValuesFull = [example[currentlabel] for example in data_full] uniqueValsFull = set(featValuesFull) del(labels[bestFeat]) #劃分完后, 即當(dāng)前特征已經(jīng)使用過了, 故將其從“待劃分特征集”中刪去 #【遞歸調(diào)用】針對當(dāng)前用于劃分的特征(beatFeat)的每個(gè)取值,劃分出一個(gè)子樹。 for value in uniqueVals: #遍歷該特征【現(xiàn)存的】取值 subLabels = labels[:] if type(dataSet[0][bestFeat]).__name__==’str’: uniqueValsFull.remove(value) #劃分后刪去(從uniqueValsFull中刪!) myTree[bestFeatLabel][value] = createTree(splitDiscreteDataSet(dataSet,bestFeat,value),subLabels,data_full,labels_full)#用splitDiscreteDataSet() #是由于, 所有的連續(xù)特征在劃分后都被我們定義的chooseBestFeatureToSplit()處理成離散取值了。 if type(dataSet[0][bestFeat]).__name__==’str’: #若該特征離散【更詳見后注】 for value in uniqueValsFull:#則可能有些取值已經(jīng)不在【現(xiàn)存的】取值中了 #這就是上面為何從“uniqueValsFull”中刪去 #因?yàn)槟切┈F(xiàn)有數(shù)據(jù)集中沒取到的該特征的值,保留在了其中 myTree[bestFeatLabel][value] = majorityCnt(classList) return myTree 3. 調(diào)用生成樹

#生成樹調(diào)用的語句df = pd.read_excel(r’E:BaiduNetdiskDownloadspss數(shù)據(jù)實(shí)驗(yàn)data銀行貸款.xlsx’) data = df.values[:,1:].tolist() data_full = data[:] labels = df.columns.values[1:-1].tolist() labels_full = labels[:] myTree = createTree(data,labels,data_full,labels_full)

查看數(shù)據(jù)

data

Python3 ID3決策樹判斷申請貸款是否成功的實(shí)現(xiàn)代碼

labels

Python3 ID3決策樹判斷申請貸款是否成功的實(shí)現(xiàn)代碼

4. 繪制決策樹

#繪決策樹的函數(shù)import matplotlib.pyplot as plt decisionNode = dict(boxstyle = 'sawtooth',fc = '0.8') #定義分支點(diǎn)的樣式leafNode = dict(boxstyle = 'round4',fc = '0.8') #定義葉節(jié)點(diǎn)的樣式arrow_args = dict(arrowstyle = '<-') #定義箭頭標(biāo)識(shí)樣式# 計(jì)算樹的葉子節(jié)點(diǎn)數(shù)量 def getNumLeafs(myTree): numLeafs = 0 firstStr = list(myTree.keys())[0] secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__==’dict’: numLeafs += getNumLeafs(secondDict[key]) else: numLeafs += 1 return numLeafs# 計(jì)算樹的最大深度def getTreeDepth(myTree): maxDepth = 0 firstStr = list(myTree.keys())[0] secondDict = myTree[firstStr] for key in secondDict.keys(): if type(secondDict[key]).__name__==’dict’: thisDepth = 1 + getTreeDepth(secondDict[key]) else: thisDepth = 1 if thisDepth > maxDepth: maxDepth = thisDepth return maxDepth # 畫出節(jié)點(diǎn) def plotNode(nodeTxt,centerPt,parentPt,nodeType): createPlot.ax1.annotate(nodeTxt,xy = parentPt,xycoords = ’axes fraction’,xytext = centerPt,textcoords = ’axes fraction’,va = 'center', ha = 'center',bbox = nodeType,arrowprops = arrow_args) # 標(biāo)箭頭上的文字 def plotMidText(cntrPt,parentPt,txtString): lens = len(txtString) xMid = (parentPt[0] + cntrPt[0]) / 2.0 - lens*0.002 yMid = (parentPt[1] + cntrPt[1]) / 2.0 createPlot.ax1.text(xMid,yMid,txtString) def plotTree(myTree,parentPt,nodeTxt): numLeafs = getNumLeafs(myTree) depth = getTreeDepth(myTree) firstStr = list(myTree.keys())[0] cntrPt = (plotTree.x0ff + (1.0 + float(numLeafs))/2.0/plotTree.totalW,plotTree.y0ff) plotMidText(cntrPt,parentPt,nodeTxt) plotNode(firstStr,cntrPt,parentPt,decisionNode) secondDict = myTree[firstStr] plotTree.y0ff = plotTree.y0ff - 1.0/plotTree.totalD for key in secondDict.keys(): if type(secondDict[key]).__name__==’dict’: plotTree(secondDict[key],cntrPt,str(key)) else: plotTree.x0ff = plotTree.x0ff + 1.0/plotTree.totalW plotNode(secondDict[key],(plotTree.x0ff,plotTree.y0ff),cntrPt,leafNode) plotMidText((plotTree.x0ff,plotTree.y0ff),cntrPt,str(key)) plotTree.y0ff = plotTree.y0ff + 1.0/plotTree.totalD def createPlot(inTree): fig = plt.figure(1,facecolor = ’white’) fig.clf() axprops = dict(xticks = [],yticks = []) createPlot.ax1 = plt.subplot(111,frameon = False,**axprops) plotTree.totalW = float(getNumLeafs(inTree)) plotTree.totalD = float(getTreeDepth(inTree)) plotTree.x0ff = -0.5/plotTree.totalW plotTree.y0ff = 1.0 plotTree(inTree,(0.5,1.0),’’) plt.show()5. 調(diào)用函數(shù)

#命令繪決策樹的圖createPlot(myTree)

myTree

總結(jié)

到此這篇關(guān)于Python3 ID3決策樹判斷申請貸款是否成功的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)python ID3 決策樹判斷內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品视频国产| 欧美成a人免费观看久久| 蜜桃传媒麻豆第一区在线观看| 免费观看久久久4p| 日韩av中文字幕一区二区| 国产精品久久久久久模特| 成人污污视频| 亚洲综合电影| 亚洲免费影视| 欧美一区网站| 欧美久久天堂| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩精品视频在线看| 欧美成人一二区| 亚洲成av人片一区二区密柚| 免费在线成人网| 国产精品22p| 激情综合在线| 国产日韩欧美一区在线| 久久国产日本精品| 青青草91视频| 亚洲福利国产| 国产精品巨作av| 日韩在线高清| 日韩和欧美一区二区| 神马午夜在线视频| 亚洲免费毛片| 亚洲免费观看高清完整版在线观| 国产色播av在线| 久久久久亚洲精品中文字幕| 日韩国产在线一| 精品久久久网| 久久亚洲国产| 最新国产精品视频| 欧美中文字幕一区二区| 黄色亚洲精品| 九九99久久精品在免费线bt| 乱人伦精品视频在线观看| 国产美女亚洲精品7777| 午夜国产精品视频免费体验区| 欧美日本久久| 亚洲少妇诱惑| 中文字幕在线高清| 日韩和欧美一区二区三区| 欧美日韩在线二区| 久久伊人亚洲| 亚州欧美在线| 波多野结衣一区| 精品久久福利| 日本aⅴ精品一区二区三区 | 国产欧美久久一区二区三区| 亚洲一级少妇| 国产情侣一区在线| 久久成人一区| 久久中文字幕二区| 国产精品麻豆久久| 国产精品久久久久久av公交车| 免费久久精品视频| 欧美日韩激情| 91精品韩国| 黄色精品视频| 国产精品视频一区二区三区| 亚洲久久在线| 日韩一区二区免费看| 成人在线丰满少妇av| 欧美在线看片| 免费成人在线视频观看| 精品在线99| 视频二区不卡| 91综合网人人| 久久中文字幕一区二区三区| 国产日韩在线观看视频| 日本中文字幕一区二区| 免费精品视频| 欧美久久精品一级c片| 日韩免费福利视频| 国产在线视频欧美一区| 国产精品久久久久av蜜臀| 欧美亚洲一区二区三区| 青青草精品视频| 午夜久久av | 精品伊人久久| 国产精品尤物| 欧美一区久久| 国产日韩欧美一区二区三区| 日本免费新一区视频| 日本中文字幕视频一区| 视频一区二区国产| 久久精品五月| 亚洲精品高潮| 九九综合九九| 成人va天堂| 国产成人精品一区二区三区在线| 日韩欧美激情| 亚洲一区二区成人| 久久伦理在线| 免费高潮视频95在线观看网站| 日韩欧美三级| av免费不卡国产观看| 久久久久久婷| 成人日韩在线| 99精品在线观看| 欧美性www| 久久国产日韩| 精品亚洲成人| 美女视频黄久久| 欧美天堂在线| 黄色国产精品| 98精品久久久久久久| 成人在线免费观看91| 久久这里只有精品一区二区| 欧美1区2区3| 国产一区二区三区久久| 午夜精品成人av| 国产精品美女久久久| 亚洲精品四区| 国产麻豆一区| 成人在线免费观看网站| 999久久久91| 亚洲成人二区| 美女黄网久久| 日韩精品免费观看视频| 国产精品一二| 不卡专区在线| 性欧美69xoxoxoxo| 亚洲欧美一级| 精品国产亚洲一区二区三区| 日韩在线第七页| 久久性天堂网| 国产精品地址| 精品亚洲美女网站| 视频一区视频二区中文字幕| 国产情侣一区| 成人久久久久| 欧美午夜精品一区二区三区电影| 日韩中文首页| 亚洲大全视频| 亚洲免费影视| 天堂va欧美ⅴa亚洲va一国产| 激情不卡一区二区三区视频在线| 九九99久久精品在免费线bt| 欧美日韩一区二区综合| 日韩综合一区二区| 精品国产aⅴ| 99国产精品| 国产精品一区二区三区av麻| 麻豆mv在线观看| 久久99伊人| 美女久久精品| 视频一区中文| 欧美亚洲三级| 久久久久中文| 日韩激情综合| 999国产精品| 国产精品自拍区| 欧美日韩视频| 国产精品2023| 亚洲一区二区三区四区电影| 91久久久精品国产| 日本亚洲不卡| 成人台湾亚洲精品一区二区| 99精品美女| 日本中文字幕不卡| 99精品一区| 一区在线观看| 久久精品国产网站| 亚洲视频国产| 九九色在线视频| 91欧美精品| 国产精品毛片在线| 97精品97| 国产情侣久久| 91久久在线| 丁香婷婷久久| 日韩动漫一区| 亚洲一卡久久| 日韩免费高清| 国产乱子精品一区二区在线观看| 国产精品88久久久久久| 欧美另类中文字幕| 亚洲激情精品| 激情黄产视频在线免费观看| 99在线精品免费视频九九视| 国产亚洲高清一区| 亚洲国产影院| 国产精品亚洲一区二区在线观看| 日韩在线观看不卡| 亚洲四虎影院| 久久久精品网| 精品一区二区三区亚洲| 午夜久久av| 黑丝一区二区| 日韩一区电影| 久久精品国产福利| 亚洲一级大片| 欧美日韩精品免费观看视频完整| 成人片免费看| 老鸭窝一区二区久久精品| 日韩精彩视频在线观看| 亚洲专区一区|