Python实现——决策树(部分函数/连续数据)

由于上一例的实现中只针对了离散数据,为了扩充处理范围,我实现了一下对线性数据的简单处理,在其中我选择用中位数作为指标,平均数、众数等等其他数据在我看来异曲同工,最终也都会有较相似的结构。

  • 求连续数据的香农熵
def calcLinerData(dataSet):
    num=len(dataSet)
    count={1:0,0:0}
    shannonEnt=0.0
    for i in range(num):
        feature = [ example[-1] for example in dataSet]
        feature2 = sorted( feature )
    flag = feature[int(num/2)]
    for i in range(num):
        if feature[i]>= flag:
            feature[i]=1
            count[1]+=1
        else:
            feature[i]=0
            count[0]+=1
    for i in [0,1]:
        prob = float(count[i])/num
        shannonEnt -= prob * log(prob,2)
    return shannonEnt

与离散数据的处理极其相似,不过在我看来使用上并不会太多,毕竟我们在分类的时候一般不会还是在用如此繁琐连续的数据进行比对。
简单来说,就是建立一个字典,把通过指标分类的数据分别计数(在这里是大于等于指标一类,剩余为另一类),最后再使用计算香农熵的方法正常计算,变化并不大,只是有了中间一步分类的过度。

  • 求连续数据指标:中位数
def getLinerFlag(dataSet,axis):
    num=len(dataSet)
    for i in range(num):
        feature = [ example[axis] for example in dataSet]
        feature2 = sorted( feature )
    flag = feature[int(num/2)]
    return flag

这个函数并不重要启示,毕竟实际上有更多更好的衡量分类指标,这里只是一个简单和偷懒的衡量方法。其他方法在我看来整体结构上应该类似,可能只是公式不同。

  • 线性划分
def splitDataSet(dataset, axis, value):
    retDataSet = []
    for featVec in dataset:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet

依旧有着相似的性质,主要取决于采取的衡量方法,我觉得连续数据的划分方法比较不同的可能就是指标选取的数目,这里只有一个,所以较轻松。如果有多个,可以从低到高依次抽取,并删除选取过的,当然或许有更多的,需要完全不同方式的衡量方式,我目前还没有考虑到。

  • 加入判断连续以及离散数据的最优划分求解
def chooseLinerSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        featList = [example[i] for example in dataSet]
        uniqueVals=set(featList)
        newEntropy = 0.0
        if len(uniqueVals)>5:
            f=getLinerFlag(dataSet,i)
            datah,datal=LinerSplit(dataSet,i,f)
            newEntropy = len(datal)/float(len(dataSet))*calcShannonEnt(datah)+\
            len(datah)/float(len(dataSet))*calcShannonEnt(datal)
        else:
            for value in uniqueVals:
                subDataSet = splitDataSet(dataSet,i,value)
                prob = len(subDataSet)/float(len(dataSet))
                newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if(infoGain>bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

毕竟离散数据连续数据混用应该是常态,这里我索性就综合的进行了架构。其中我对于连续以及离散的判断非常简单,就是一个属性的分类如果超过了5个,就判定为线性(或者说还得是数字?),可能不是那么的科学,不过...先这样吧。

f=getLinerFlag(dataSet,i)
            datah,datal=LinerSplit(dataSet,i,f)
            newEntropy = len(datal)/float(len(dataSet))*calcShannonEnt(datah)+\
            len(datah)/float(len(dataSet))*calcShannonEnt(datal)

理解起来应该也非常通俗易懂,先求得大于等于以及小于划分指标的两个集合,之后计算此划分的香农熵,就可以正常比对了。

转载于:https://www.cnblogs.com/LOSKI/p/10691480.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树的最大树深度在Python中可以通过设置参数进行控制。在sklearn库中,决策树算法的函数DecisionTreeClassifier中有一个参数max_depth用于指定决策树的最大深度。通过设置这个参数,可以限制决策树生成的深度,以控制模型的复杂度和泛化能力。默认情况下,max_depth的值为None,表示决策树会继续分裂直到所有叶节点都是纯净的(所有样本都属于同一类别)或者达到其他终止条件。如果将max_depth设置为一个正整数,决策树的生成过程会在达到指定深度后停止分裂。例如,将max_depth设置为2,决策树的最大深度就是2层。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python算法:决策树分类](https://blog.csdn.net/qq_52417436/article/details/127022698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python机器学习——决策树](https://blog.csdn.net/calisenanming/article/details/127390253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值