决策树可以使用不熟悉的数据集合,并从中提取出一系列的规则,这是机器根据数据集创建规则的过程,就是机器学习的过程。用一个小案例分析:

通过No surfacing  和 flippers判断该生物是否是鱼,No surfacing 是离开水面是否可以生存,flippers判断是否有脚蹼

引入信息增益和信息熵的概念:

信息熵:计算熵,我们需要计算所有类别所有可能值包含的信息期望值。

p(x)是类别出现的概率

条件熵(表示在已知随机变量X的条件下随机变量Y的不确定性。):

信息增益(划分数据集前后的信息发生的变化,通俗的说,就是信息熵减去条件熵):

代码实现:

加载数据:

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

计算原始熵:

def calcShannonEnt(dataSet):numEntries = len( dataSet)labelCounts = { }for featVec in dataSet:currentLabel = featVec[-1]if  currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts [currentLabel]+=1shannonEnt = 0.0 for key in labelCounts :prob = float (labelCounts[key])/numEntriesshannonEnt -=prob * log(prob,2)return shannonEnt 

划分数据集

def splitDataSet(dataSet,axis,value):  # 待划分的数据集  ,划分数据集的特征,需要返回的特征的值retDataSet=[]for featVec in dataSet:if featVec[axis] == value :reduceFeatVec=featVec[:axis]  #取不到axis这一行reduceFeatVec.extend(featVec[axis+1:])retDataSet.append(reduceFeatVec)return retDataSet

测试数据及结果:

(myDat,0,1)  myDat是数据集,0是第一次划分数据集,1是第一列为1的数据

计算出条件熵,然后求出信息增益,并找到最大的信息增益,最大的信息增益就是找到最好的划分数据集的特征

def chooseBestFeatureToSplit(dataSet):numFeatures=len(dataSet[0])-1#计算出原始的香农熵baseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0; bestFeature =-1for i in range (numFeatures):#创建唯一的分类标签列表featList = [example[i] for example in dataSet]uniqueVals = set (featList)  #去重复#条件熵的初始化newEntropy = 0.0for value in uniqueVals :#划分   获得数据集subDataSet = splitDataSet(dataSet,i ,value)prob=len(subDataSet)/float(len(dataSet)) # 概率#条件熵的计算newEntropy += prob * calcShannonEnt (subDataSet)# 信息增益infoGain = baseEntropy -newEntropyif (infoGain >bestInfoGain):bestInfoGain = infoGain #找到最大的信息增益bestFeature =i  #找出最好的划分数据集的特征return bestFeature

测试数据:

dataSet,labels = createDataSet()
print(dataSet)
print(chooseBestFeatureToSplit(dataSet))

输入结果:

投票机制:

def majorityCnt(classList):classCount={}for vote in classList:if vote not in classCount.keys() :classCount[vote]=0sortedClassCount = sorted (classCount.iteritems(),key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0] 

创建树:

def createTree(dataSet,labels):classList = [example[-1] for example in dataSet]if classList.count(classList[0] )== len (classList) :return classList[0]if len(dataSet[0]) == 1:return majorityCnt(classList)bestFeat = chooseBestFeatureToSplit(dataSet)bestFeatLabel = labels[bestFeat]myTree={bestFeatLabel:{}}del(labels[bestFeat])featValues = [example[bestFeat] for example in dataSet]uniqueVals = set( featValues)for value in uniqueVals:subLabels =labels[:]myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)return myTree

结果:

该方法是用信息增益的方法来构建树,在查阅其他的博客得知:

ID3算法主要是通过信息增益的大小来判定,最大信息增益的特征就是当前节点,这个算法存在许多的不足,第一,它解决不了过拟合问题,和缺失值的处理,第二,信息增益偏向取值较多的特征,第三,不能处理连续特征问题。

因此,引入C4.5算法,是利用信息增益率来代替信息增益。为了减少过度匹配问题,我们通过剪枝来处理冗余的数据,生成决策树时决定是否要剪枝叫预剪枝,生成树之后进行交叉验证的叫后剪枝。

还有一个是引入基尼指数来进行计算叫CART树,以后再做介绍。

绘制树形图:

decisionNode = dict(boxstyle = "sawtooth", fc="0.8")
leafNode = dict(boxstyle = "round4" ,fc="0.8")
arrow_args = dict(arrowstyle="<-")
def plotNode(nodeTxt,centerPt,parentPt,nodeType):createPlot.ax1.annotate(nodeTxt,xy=parentPt,xycoords='axes fraction' ,\xytext=centerPt ,textcoords='axes fraction',va="center" ,\ha ="center" ,bbox=nodeType,arrowprops = arrow_args)
def getNumLeafs(myTree):numLeafs= 0firstStr =list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__=='dict':numLeafs +=getNumLeafs(secondDict[key])else :  numLeafs+=1return numLeafs
def getTreeDepth(myTree) :maxDepth=0firstStr =list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__=='dict':thisDepth = 1+ getTreeDepth(secondDict[key])else : thisDepth = 1if thisDepth > maxDepth : maxDepth=thisDepthreturn maxDepth
def plotMidText(cntrPt , parentPt ,txtString) :xMid = (parentPt[0]-cntrPt[0])/2.0 +cntrPt[0]yMid = (parentPt[1]-cntrPt[1])/2.0 +cntrPt[1]createPlot.ax1.text(xMid,yMid,txtString)
def plotTree(myTree,parentPt,nodeTxt):numLeafs = getNumLeafs(myTree)depth = getTreeDepth(myTree)firstStr = list(myTree.keys())[0]cntrPt = (plotTree.xOff+(1.0+float(numLeafs))/2.0/plotTree.totalW,plotTree.yOff)plotMidText(cntrPt,parentPt,nodeTxt)plotNode(firstStr,cntrPt,parentPt,decisionNode)secondDict = myTree[firstStr]plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalDfor key in secondDict.keys():if type(secondDict[key]).__name__=='dict':plotTree(secondDict[key],cntrPt,str(key))else:plotTree.xOff = plotTree.xOff +1.0 /plotTree.totalWplotNode(secondDict[key],(plotTree.xOff,plotTree.yOff),cntrPt,leafNode)plotMidText((plotTree.xOff,plotTree.yOff) ,cntrPt,str(key))plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalD
def createPlot(inTree) :fig = plt.figure(1,facecolor = 'white')fig.clf()axprops =dict(xticks=[],yticks=[])createPlot.ax1 = plt.subplot(111,frameon = False ,**axprops)plotTree.totalW =float(getNumLeafs(inTree))plotTree.totalD=float(getTreeDepth(inTree))plotTree.xOff = -0.5/plotTree.totalW;plotTree.yOff = 1.0plotTree(inTree,(0.5,1.0),'')plt.show()
createPlot(myTree)

决策树 算法原理及代码相关推荐

  1. 机器学习(周志华、李航):决策树——算法原理及代码实现(持续更新)

    文章目录 4.1 基本流程 决策树与条件概率分布 决策树学习 4.2 划分(特征)选择 4.2.1 信息增益 李书示例 周书示例 4.2.2 增益率 4.2.3 基尼指数 4.3 剪枝处理 4.3.1 ...

  2. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  3. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  4. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  5. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  6. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  7. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

  8. HoughCircle(霍夫圆)算法原理及代码实现

      此算法建立在Canny算法的基础上,对Canny算法检测出的边缘图像进行拟合,因此要用到Canny算法返回的边缘图像及梯度方向矩阵.Canny算法相关内容详见上一篇博客:Canny边缘检测算法原理 ...

  9. 深度强化学习-Double DQN算法原理与代码

    深度强化学习-Double DQN算法原理与代码 引言 1 DDQN算法简介 2 DDQN算法原理 3 DDQN算法伪代码 4 仿真验证 引言 Double Deep Q Network(DDQN)是 ...

最新文章

  1. 关于StartCoroutine的简单线程使用
  2. 鸟哥学习笔记---网络安全基础
  3. sequential模型编译时的指标设置:sklearn.metrics:指标
  4. pycharm 提示 ennble Code compatibility inspection(代码兼容性检查)
  5. Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数
  6. 地理素养的核心构成和主要特点
  7. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)
  8. Elasticsearch7.15.2 集成ik中文分词器 适用于单机和集群
  9. 前端:CSS/10/伪类选择器,CSS列表属性,CSS边框属性,CSS内边距属性,CSS背景属性
  10. KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
  11. android逐帧播放器,Kinovea(逐帧播放器)
  12. 中国石油大学《安全管理学》第二阶段在线作业
  13. 5G无线技术基础自学系列 | 5G NR和LTE信道结构比较
  14. 如何进行数据安全管理体系建设?
  15. hotmail手机端_hotmail邮箱app下载
  16. 全角数字变半角php,php代码中全角数字转半角的方法
  17. ESP-01S烧录MQTT固件连接阿里云
  18. elasticsearch学习笔记——二.querystring查询document方式与dsl查询document方式
  19. [BZOJ 1135][POI2009]Lyz
  20. AWS亚马逊云注册图文详细教程,多币种充值优势分析

热门文章

  1. AaronYang WCF教程目录
  2. 基于智能手机Android平台音乐播放器全程开发实战
  3. POS机C井例子代码(2)
  4. ipv4到ipv6的过渡
  5. 缺氧游戏计算机,缺氧PC最低什么配置一览 你觉得高吗
  6. tornado学习笔记day08-tornado中的异步
  7. mysql中的内置函数
  8. 【数字图像处理】傅里叶变换在图像处理中的应用
  9. 制作已编译的html帮助文件
  10. 选择排序 冒泡排序 二分查找