决策树

客官°小女子只卖身不卖艺 2021-09-15 06:34 556阅读 0赞

熵的定义

5057999-5702853710d12e87.png

计算给定数据集的熵

  1. def calcShannonEnt(dataSet):
  2. numEntires = len(dataSet) #返回数据集的行数
  3. labelCounts = {} #保存每个标签(Label)出现次数的字典
  4. for featVec in dataSet: #对每组特征向量进行统计
  5. currentLabel = featVec[-1] #提取标签(Label)信息
  6. if currentLabel not in labelCounts.keys(): #如果标签(Label)没有放入统计次数的字典,添加进去
  7. labelCounts[currentLabel] = 0
  8. labelCounts[currentLabel] += 1 #Label计数
  9. shannonEnt = 0.0 #经验熵(香农熵)
  10. for key in labelCounts: #计算香农熵
  11. prob = float(labelCounts[key]) /numEntires
  12. #选择该标签(Label)的概率
  13. shannonEnt -= prob * log(prob, 2) #利用公式计算
  14. return shannonEnt #返回经验熵(香农熵)

数据集格式

5057999-cd5960ca5e3eb8d1.png

  1. def createDataSet():
  2. dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
  3. labels=['no surfacing','flippers']
  4. return dataSet,labels

进行测试计算,添加了第三个名为maybe的分类,熵增加。(熵越高,则混合的数据越多)

  1. from decisionTree import *
  2. myDat,labels=createDataSet()
  3. print(myDat)
  4. print(labels)
  5. print(calcShannonEnt(myDat))
  6. myDat[0][-1]='maybe'
  7. print(myDat)
  8. print(calcShannonEnt(myDat))

5057999-3f32bc2d66071141.png


按照给定特征划分数据集

  1. def splitDataSet(dataSet, axis, value):
  2. retDataSet=[]
  3. for featVec in dataSet:
  4. if featVec[axis] == value:
  5. reducedFeatVec=featVec[:axis]
  6. reducedFeatVec.extend(featVec[axis+1:])
  7. retDataSet.append(reducedFeatVec)
  8. return retDataSet

测试及结果

  1. print(splitDataSet(myDat,0,1))
  2. #[[1, 'maybe'], [1, 'yes'], [0, 'no']]
  3. print(splitDataSet(myDat,0,0))
  4. #[[1, 'no'], [1, 'no']]
  5. def chooseBestFeatureToSplit(dataSet):
  6. numFeatures = len(dataSet[0]) - 1 #特征数量
  7. baseEntropy = calcShannonEnt(dataSet) #计算数据集的香农熵
  8. bestInfoGain = 0.0 #信息增益
  9. bestFeature = -1 #最优特征的索引值
  10. for i in range(numFeatures): #遍历所有特征
  11. #获取dataSet的第i个所有特征
  12. featList = [example[i] for example in dataSet]
  13. uniqueVals = set(featList) #创建set集合{},元素不可重复
  14. newEntropy = 0.0 #经验条件熵
  15. for value in uniqueVals: #计算信息增益
  16. subDataSet = splitDataSet(dataSet, i, value) #subDataSet划分后的子集
  17. prob = len(subDataSet) / float(len(dataSet)) #计算子集的概率
  18. newEntropy += prob * calcShannonEnt(subDataSet) #根据公式计算经验条件熵
  19. infoGain = baseEntropy - newEntropy #信息增益
  20. print("第%d个特征的增益为%.3f" % (i, infoGain)) #打印每个特征的信息增益
  21. if (infoGain > bestInfoGain): #计算信息增益
  22. bestInfoGain = infoGain #更新信息增益,找到最大的信息增益
  23. bestFeature = i #记录信息增益最大的特征的索引值
  24. return bestFeature #返回信息增益最大的特征的索引值

发表评论

表情:
评论列表 (有 0 条评论,556人围观)

还没有评论,来说两句吧...

相关阅读

    相关 决策

    1 决策树学习是以实例为基础的归纳学习算法,是应用最广泛的逻辑方法。 2 典型的决策树学习系统采用自顶向下的方法,在部分搜索空间中搜索解决方案。它可以确保求出一个简单的决策树

    相关 决策

    决策树是基于树结构来进行决策,这恰是人类在面临决策问题时一种很自然的处理机制。例如,我们要对“这是好瓜吗?”这样的问题进行决策时,通常会进行一系列的判断或“子决策”:我们先看“

    相关 决策

    一、 决策树简介 决策树是一种特殊的树形结构,一般由节点和有向边组成。其中,节点表示特征、属性或者一个类。而有向边包含有判断条件。如图所示,决策树从根节点开始延伸,经过不

    相关 决策

    决策树:决策树是一个树形结构,每个非叶节点表示一个特征树形的测试,每个分支代表这个特征属性在某个值域上的输出,而叶节点存放一个类别。 使用决策树进行决策的原理就是: 从根

    相关 决策

    1 认识决策树     如何高效的进行决策?     特征的先后顺序(哪个特征先看,哪个特征后看) 2 决策树分类原理详解(看哪个特征能筛掉更多的数据,尽可能通过少

    相关 决策

    决策树 声明 本文是来自网络文档和书本(周老师)的结合。 概述 决策树(Decision Tree)是在已知各种情况发生概率的[基础][Link 1]上,通

    相关 决策

    决策树对实例进行分类的树形结构,由节点和有向边组成。其实很像平时画的流程图。 学习决策树之前要搞懂几个概念: 熵:表示随机变量不确定性的度量,定义:H(p)=-![1409