鱼C论坛

 找回密码
 立即注册
查看: 2689|回复: 6

强大的鱼油求帮助~写了一个决策树类一直有问题

[复制链接]
发表于 2015-3-24 22:12:35 | 显示全部楼层 |阅读模式

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

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

x
用python写了一个决策树类结果一直出错,之前写了一个面向过程的。。。是对的。。。怎么回事啊
QQ截图20150324205719.png
QQ截图20150324205813.png
QQ截图20150324205829.png
QQ截图20150324220712.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-24 22:23:30 | 显示全部楼层
把源代码直接复制上来哦~你想让回答问题的人按图片敲一遍代码?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-24 22:24:58 | 显示全部楼层
好长,机器学习方面的话,如果楼主有兴趣可以看看《机器学习实战》这本书,里面介绍了比较常见的机器学习算法,以及部分实现代码,然后有配套的已经实现 的源代码链接: http://pan.baidu.com/s/1mg7RkI8 密码: v52p
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-24 22:27:15 | 显示全部楼层
lightninng 发表于 2015-3-24 22:24
好长,机器学习方面的话,如果楼主有兴趣可以看看《机器学习实战》这本书,里面介绍了比较常见的机器学习算 ...

我这个代码就是改得机器学习实战里的代码,那里面的代码是面向过程的,我改成面向对象的,但是有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-24 22:32:38 | 显示全部楼层
丸子酱1016 发表于 2015-3-24 22:27
我这个代码就是改得机器学习实战里的代码,那里面的代码是面向过程的,我改成面向对象的,但是有问题

soga~~同道中人啊,
代码还是复制一下放上来吧。你这样。别人怎么帮你调试啊亲~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-24 22:45:08 | 显示全部楼层
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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-24 22:46:15 | 显示全部楼层
lightninng 发表于 2015-3-24 22:32
soga~~同道中人啊,
代码还是复制一下放上来吧。你这样。别人怎么帮你调试啊亲~~

代码粘贴上来了~~~帮忙看看吧···我就用实战那本书的代码改得···我是代码渣···写的不好见谅啊~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-15 09:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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