鱼C论坛

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

[已解决]决策树ID3的问题

[复制链接]
发表于 2018-4-27 15:26:34 | 显示全部楼层 |阅读模式

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

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

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,"r")
                content = fp.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 range(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

最佳答案
2018-4-27 18:38:23
你的id哪里来的,
besfFeature = id

错误提示必须是元素或者切片,你的id好像是突然多出来的

出现这个错误怎么解决

出现这个错误怎么解决
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-27 16:25:19 | 显示全部楼层
要不把训练数据贴出来,帮你测试看看(有问题的话?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-27 18:38:23 | 显示全部楼层    本楼为最佳答案   
你的id哪里来的,
besfFeature = id

错误提示必须是元素或者切片,你的id好像是突然多出来的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 14:20:08 | 显示全部楼层
ABC23 发表于 2018-4-27 16:25
要不把训练数据贴出来,帮你测试看看(有问题的话?

这就是数据集的下载地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-3 14:35:27 | 显示全部楼层
塔利班 发表于 2018-4-27 18:38
你的id哪里来的,
besfFeature = id

感谢指出,我找到代码的错误了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-11 01:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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