鱼C论坛

 找回密码
 立即注册
查看: 2825|回复: 4

决策树运行错误

[复制链接]
发表于 2018-3-29 11:07:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
from numpy import *
import math
import copy
import pickle as pp
class ID3DTree(object):
        def __init__(self):
                self.tree = {}
                self.dataSet = []
                self.labels = []

def loadDataSet(self,path,labels):
        recordlist = []
        fp = open(path,"rb")
        content = fb.read()
        fp.close()
        rowlist = content.splitlines()
        recordlist = [row.split("\t") for row in rowlist if row.strip()]
        self.dataSet = recordlist
        self.labels = labels

def train(self):
        labels = copy.deepcopy(self.labels)
        self.tree = self.buildTree(self.dataSet,labels)

def buildTree(self,dataSet,labels):
        catelist = [data[-1] for data in dataSet]
        if catelist.count(catelist[0]) == len(catelist):
                return catelist[0]
        if len(dataSet[0]) == 1:
                return self.maxCate(catelist)
       
        besfFeat = self.getBestFeat(dataSet)
        bestFeatLabel = labels[besfFeat]
        tree = {bestFeatLabel:{}}
        del(labels[besfFeat])
        uniqueVals = set([data[bestFeat] for data in dataSet])
        for value in uniqueVals:
                subLabels = labels[:]
                splitDataSet = self.splitDataSet(dataSet,besfFeat,value)
                subTree = self.buildTree(splitDataSet,subLabels)
                tree[bestFeatLabel][value] = subTree
        return tree
       
def maxCate(self,catelist):
        items = dict([(catelist.count(i),i) for i in catelist])
        return items[max(items.keys())]
       
def getBestFeat(self,dataSet):
        numFeatures = len(dataSet[0]) - 1
        baseEntropy = self.computeEntropy(dataSet)
        bestInfoGain = 0.0;
        besfFeature = -1
        for i in xrange(numFeatures):
                uniqueVals = set([data[i] for data in dataSet])
                newEntropy = 0.0
                for value in uniqueVals:
                        subDataSet = self.splitDataSet(dataSet,i,value)
                        prob = len(subDataSet)/float(len(dataSet))
                        newEntropy += prob * self.computeEntropy(subDataSet)
                infoGain = baseEntropy - newEntropy
                if (infoGain > bestInfoGain):
                        bestInfoGain = infoGain
                        besfFeature = id
        return besfFeature
       
def computeEntropy(self,dataSet):
        datalen = float(len(dataSet))
        catelist = [data[-1] for data in dataSet]
        items = dict([(i,catelist.count(i)) for i in catelist])
        infoEntropy = 0.0
        for key in items:
                prob = float(items[key])/datalen
                infoEntropy -= prob * math.log(prob,2)
        return infoEntropy

def splitDataSet(self,dataSet,axis,value):
        rtnList = []
        for featVec in dataSet:
                if featVec[axis] == value:
                        rFeatVec = featVec[:axis]
                        rFeatVec.extend(featVec[axis+1:])
                        rtnList.append(rFeatVec)
        return rtnList

捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-29 11:40:32 | 显示全部楼层
难道是缩进问题?从你贴出的缩进来看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 14:47:56 | 显示全部楼层
BngThea 发表于 2018-3-29 11:40
难道是缩进问题?从你贴出的缩进来看

缩进没问题,要是有问题早就报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 15:41:59 | 显示全部楼层
OoDickoO 发表于 2018-3-29 14:47
缩进没问题,要是有问题早就报错了

提示的信息说类中没有这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-29 15:44:06 | 显示全部楼层
BngThea 发表于 2018-3-29 15:41
提示的信息说类中没有这个函数

有这个函数,提示是说我这个ID3DTree调用不了loadDataSet这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 18:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表