决策树---使用三种方法对数据建立决策树

目录

一、决策树原理

二、实验过程

2.1信息增益

2.2增益率

2.3基尼指数

 2.4数据集

 2.5创建决策树

2.6保存和读取决策树

2.7绘制决策树

2.8使用决策树进行分类

 2.9主函数


一、决策树原理

        决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。

        决策树学习的关键在于如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点 所包含的样本尽可能属于同一类别,即结点的“纯度 ”(purity)越来越高。经典的属性划分方法有三种:信息增益;增益率;基尼指数。

二、实验过程

2.1信息增益

       离散属性a有V个可能的取值{a1, a2, ..., aV},用a来进行划分,则会产 生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为 av的样本,记为Dv。则可计算出用属性a对样本集D进行划分所获得的 “信息增益”:

 一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的 “纯度提升”越大。

实现代码:
def chooseBestFeatureToSplit(dataSet):
    #特征数量,-1是因为最后一列是类别标签
    numFeatures = len(dataSet[0]) - 1
    #计算数据集的原始香农熵
    baseEntropy = calcShannonEnt1(dataSet)
    bestInfoGain = 0.0                       #信息增益赋初值0
    bestFeature = -1                         #最优特征的索引值
    for i in range(numFeatures):
        #获取dataSet的第i个所有特征存到featList中
        featList = [example[i] for example in dataSet]
        #print(featList)  #每个特征的15项特征值列表
        #创建set集合{},元素不可重复
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            #subDataSet划分后的子集
            subDataSet = splitDataSet(dataSet,i,value)
            #计算子集的概率=子集个数/整个训练样本数
            prob = len(subDataSet)/float(len(dataSet))
            #计算香农熵
            newEntropy += prob * calcShannonEnt(subDataSet)
        #计算信息增益
        infoGain = baseEntropy - newEntropy
        #print("第%d个特征的增益为%.3f" %(i,infoGain))
        #C4.5算法:计算增益比(信息增益率)
        #infoGain2 = (baseEntropy - newEntropy)/baseEntropy
        if (infoGain >bestInfoGain):
            bestInfoGain = infoGain      #更新信息增益,找到最大的信息增益
            bestFeature = i              #记录信息增益最大的特征的索引值
    return bestFeature                   #返回信息增益最大的特征的索引值

2.2增益率

称为属性a的“固有值” [Quinlan, 1993],属性a的可能取值数 目越多(即V越大),则IV(a)的值通常就越大。

增益率准则对可取值数目较少的属性有所偏好。

C4.5 [Quinlan, 1993]采用了一个启发式方法:先从候选划分属性中找出信 息增益高于平均水平的属性,再从中选取增益率最高的

实现代码:

def calcShannonEnt1(dataSet, method = 'none'):
    numEntries = len(dataSet)
    labelCount = {}
    for feature in dataSet:
        if method =='prob': #当参数为prob时转而计算增益率
            label =  feature
        else:
            label = feature[-1]
        if label not in labelCount.keys():
            labelCount[label]=1
        else:
            labelCount[label]+=1
    shannonEnt = 0.0
    for key in labelCount:
        numLabels = labelCount[key]
        prob = numLabels/numEntries
        shannonEnt -= prob*(log(prob,2))
    return shannonEnt
#增益率
def chooseBestFeatureToSplit2(dataSet): #使用增益率进行划分数据集
    numFeatures = len(dataSet[0]) -1 #最后一个位置的特征不算
    baseEntropy = calcShannon
  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值