大神们帮小弟我看看小弟我用python写的决策树类·一直不对

大神们帮我看看我用python写的决策树类··一直不对
我这个代码是改得机器学习实战那本书上得决策树代码,那个上面是面向过程的,我写了个对象的,一直有问题,求大神大神们帮小弟我看看小弟我用python写的决策树类·一直不对大神们帮小弟我看看小弟我用python写的决策树类·一直不对大神们帮小弟我看看小弟我用python写的决策树类·一直不对大神们帮小弟我看看小弟我用python写的决策树类·一直不对
from random import randint
from math import log
class DeciTree():
    def __init__(self,dataSet,labels):
        
        self.dataSet = dataSet
        self.datasize = len(dataSet)
        self.labels = labels
    def bagging(self):
        self.dataAfterBagging = []
        for i in range(self.datasize):
            self.dataAfterBagging.append(self.dataSet[randint(0,self.datasize-1)])
        return self.dataAfterBagging
    
    def calcShannonEnt(self,D):
        numEntries = len(D)
        labelCounts = {}
        for featVec in D:
            currentLabel = featVec[-1]
            if currentLabel not in labelCounts.keys():
                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(self,D,axis,value):
        retDataSet = []
        for featVec in D:
            if featVec[axis] == value:
                reducedFeatVec = featVec[:axis]
                reducedFeatVec.extend(featVec[axis+1:])
                retDataSet.append(reducedFeatVec)
        print(retDataSet)
        return retDataSet
    def chooseBestFeatureToSplit(self,D):
        
        numFeatures = len(D[0]) - 1
        baseEntropy = self.calcShannonEnt(D)
        bestInfoGain = 0.0
        bestFeature = -1
        for i in range(numFeatures):
            featList = [example[i] for example in D]
            uniqueVals = set(featList)
            newEntropy = 0.0
            for value in uniqueVals:
                subDataSet = self.splitDataSet(D,i,value)
                prob = len(subDataSet)/float(len(D))
                newEntropy += prob *self.calcShannonEnt(subDataSet)
            infoGain = baseEntropy - newEntropy
            if(infoGain > bestInfoGain):
                bestInfoGain = infoGain
                bestFeature = i

        return bestFeature

    def majorityCnt(self,classList):
        classCount = {}
        for vote in classList:
            if vote not in classCount.keys():
                classCount[vote] = 0
            classCount[vote] += 1
    
        classListCount = list(classCount.values())
        sorted(classListCount,reverse = True)
        for i in classCount.items():
            if i[1] == classListCount[0]:
                return i[0]

    
    def creatTree(self,D,L):
        classList = [example[-1] for example in D]
        if classList.count(classList[0]) == len(classList):
            return classList[0]
        if len(D) == 1:
            return majorityCnt(classList)
        bestFeat = self.chooseBestFeatureToSplit(D)
        bestFeatLabel = L[bestFeat]
        
    #用字典类型存储树的信息。
        self.tree = {bestFeatLabel:{}}
        del(L[bestFeat])
        
        featValues = [example[bestFeat] for example in D]
        uniqueVals = set(featValues)
        for value in uniqueVals:
            subLabels =L[:]
            self.tree[bestFeatLabel][value] =self.creatTree((self.splitDataSet(D,bestFeat,value)),subLabels)
        return self.tree



 


------解决思路----------------------

    def creatTree(self,D,L):
        classList = [example[-1] for example in D]
        if classList.count(classList[0]) == len(classList):
            return classList[0]
        if len(D) == 1:
            return majorityCnt(classList)
        bestFeat = self.chooseBestFeatureToSplit(D)
        bestFeatLabel = L[bestFeat]
        
    #用字典类型存储树的信息。
        self.tree = {bestFeatLabel:{}}  #这一行有问题
        del(L[bestFeat])
        
        featValues = [example[bestFeat] for example in D]
        uniqueVals = set(featValues)
        for value in uniqueVals:
            subLabels =L[:]
            #下面的语句中右面部分执行时把self.tree给换掉了, 再执行左边的部分就会出问题了.
            self.tree[bestFeatLabel][value] =self.creatTree((self.splitDataSet(D,bestFeat,value)),subLabels)
        return self.tree

(看代码里的注释)
self.tree是用来存储临时生成的树, 不应该是self的属性, 把self.tree改成tree就可以了.