写在前面的话

我就是一俗人.我俗我开心.

递归构建决策树

之前我们已经学习了怎么根据信息论的方法,把一个数据集从杂乱无章的数据集中划分出来,我们使用信息论来构建决策树一级一级分类的方法就是一个递归的过程。

它的工作原理如下:

  • 得到原始数据集,然后基于最好的属性值划分数据集。每一次划分数据集,我们都要消耗一个特征,根据某个特征将某些性质相同的元素剥离出来
  • 划分数据的时候我们根据香农熵,计算信息增益之后找到最好的属性值进行数据的划分。
  • 由于特征值可能有多于两个的,因此可能存在大于两个分支的数据集划分
  • 第一次划分数据将向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据集,因此我们可以采用递归的原则来处理数据集。

我们都知道递归必须要有一个终止条件,1)如果程序已经遍历完了所有的特征属性,2)或者每个分支下的所有实例都具有相同的分类,我们得到一个叶子节点或者终止块.这个就是我们递归的终止条件.

出现1这种情况的特殊情况就是我们之前在决策树算法(五)——处理一些特殊的分类 这篇文中已经详细的分析过了.当已经遍历完所有的特征属性但是任然还有一些类别灭有找出,那么我们就根据选举投票的方法来进行分类.

当然对于第一个结束条件算法可以终止,我们还可以设置算法可以划分的最大分组的数目.

创建决策树代码

下面我们来构建决策树的代码,使用递归来进行.
我们还是打开我们之前的文件trees.py, 在这个文件中添加如下的代码:


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[bestFeatLabel])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

之后我们来分析一下这段代码:

还是用我们之前几章的那个数据集:

在这里任然需要注意我们的数据集是前面每一项都是特征值,最后一项是我们的类别信息.如下所示

dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
#这里的第一条语句就是获得dataSet中的所有数据的类别:
classList = [example[-1] for example in dataSet]
#这种写法是python语法的一个特色,简单明了快捷随意.就是喜欢python这么随性,哈哈,像我.
# example中每次取出的是dataSet中的一个元素,e.g. [0,1,'no']
#example[-1] 就是每个元素的最后一列.

我们来看下执行结果:

之后的两个if条件是递归终止条件.

if classList.count(classList[0]) == len (classList):return classList[0]# 这个条件语句是表示所有的数据都已经划分完成,每个类别已经完全相同
#这样递归可以结束
#count()函数中接受一个参数,表示的是这个参数在某个序列中出现的次数
#如果这个classList中的元素完全相同,那么这个参数的count(classList[0])应该是等于这个List的长度的.

 if len(dataSet[0]) == 1:return majorityCnt(classList)# 第二个递归条件表示的只剩最后的类别信息的数据集.#因为决策树算法每做一次信息的划分,都会消耗一个特征,当特征#消耗完之后还有类别不同那么我们就需要投票表决了

看这张图应该很清楚了.

注意 :上面这两个条件语句都是我们递归结束的条件.

bestFeat = chooseBestFeatureToSplit(dataSet)bestFeatLabel = labels[bestFeat]#之后我们调用chooseBestFeatureToSplit函数

chooseBestFeatureToSplit函数的原型如下(我们在之前已经讲过):

def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0])-1baseEntropy = calcShannonEnt(dataSet)bestInfoGain =0.0bestFeature = -1for i in range(numFeatures):featList = [sample[i] for sample 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 = infoGainbestFeature = ireturn bestFeature

这个函数 返回的是最好的特征值,通过计算最大信息增益获得的.

# bestFeat 存储的最好的特征的下标.它和我们的label是一一对应的bestFeatLabel = labels[bestFeat]

在这里我们可以看出,我们的数据集有两个特征,就是no surfing 和 flippers . 每个数据集的第一列表示的是有还是不需要no surfing, 第二列表示的有没有flippers. 1表示有,2表示没有.


我们第一次调用chooseBestFeatureToSplit函数,结果告诉我们选择第一个特征比较好

    bestFeat = chooseBestFeatureToSplit(dataSet)bestFeatLabel = labels[bestFeat]# bestFeatLabel中存储了最佳特征的标签myTree = {bestFeatLabel:{}} # 构建数据字典del(labels[bestFeatLabel])# 删除最佳特征值
#找出最佳特征向量对应的所有特征值
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)#递归调用构建决策树

我们来测试一下我们的实验结果.

mytree 包含了很多代表结构信息的嵌套字典. 在代码中也可以看到我们实际上是用一个数据字典来构建我们的决策树.
第一个 no surfing 是第一个划分数据集的特征名称,在其下面有分为两类,特征是0的不是鱼类,是1的有被继续划分了.


到这里我们决策树算法算是讲完了,我们贴出整个分类的完整代码.

#!/usr/bin/env python
# coding=utf-8
# author: chicho
# running: python trees.py
# filename : trees.py
from math import log
import operatordef createDataSet():dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]labels = ['no surfacing','flippers']return dataSet, labelsdef calcShannonEnt(dataSet):countDataSet = len(dataSet)labelCounts={}for featVec in dataSet:currentLabel=featVec[-1]if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1print labelCountsshannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key])/countDataSetshannonEnt -= prob * log(prob,2)return shannonEntdef splitDataSet(dataSet,axis,value):retDataSet = []for featVec in dataSet:if featVec[axis] == value:reduceFeatVec = featVec[:axis]reduceFeatVec.extend(featVec[axis+1:])retDataSet.append(reduceFeatVec)return retDataSetdef chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0])-1baseEntropy = calcShannonEnt(dataSet)bestInfoGain =0.0bestFeature = -1for i in range(numFeatures):featList = [sample[i] for sample 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 = infoGainbestFeature = ireturn bestFeaturedef majorityCnt(classList):classCount={}for vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1sortedClassCount = 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



#写在后面的话
你必须非常努力,才可以看起来毫不费力
加油~~~
要么就不做,要做就做最好

决策树算法(六)——构建决策树相关推荐

  1. 决策树算法原理以及决策树规则生成方法

    决策树算法原理以及决策树规则生成方法 决策树是一种可解释性较强的策略分析工具.creditmodel提供了分类回归树和条件推断树两种决策树生成和提取规则的方法. 每一个风险管理人员都应该掌握使用决策树 ...

  2. c4.5决策树算法 c语言,决策树(三):C4.5算法和CART算法

    ID3选择属性的依据是信息增益: ![Information Gain][equtation] [equtation]: http://latex.codecogs.com/svg.latex?g_r ...

  3. 信息增益率C语言,决策树算法在高职院校成绩分析中的应用研究的论文

    决策树算法在高职院校成绩分析中的应用研究的论文 摘 要:高职院校的学生的成绩是一项重要的数据,它不仅是对学生学习情况的评价,也是对教师教学质量的检查.本文研究了使用决策树算法对学生的成绩进行挖掘分析, ...

  4. 机器学习算法之决策树算法

    决策树 综述 决策树(Decision Tree)算法是一种基本的分类与回归方法,根据数据的属性采用树状结构建立决策模型.决策树模型常常用来解决分类和回归问题.常见的算法包括CART(Classifi ...

  5. 机器学习决策树算法和分类原理

    目录 1 决策树算法简介 2 决策树分类原理 2.1 熵 2.1.1 概念 2.1.2 案例 2.2 划分依据一 :信息增益 2.2.1 概念 2.2.2 案例 2.3 划分依据二 :信息增益率 2. ...

  6. 机器学习 决策树算法 (Decision Tree)

    ____tz_zs学习笔记 决策树算法概念: 决策树(decision tree)是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或 ...

  7. 【决策树】深入浅出讲解决策树算法(原理、构建)

    本文收录于<深入浅出讲解自然语言处理>专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! ​个人主页:有梦想的程序星空 ​个人介绍:小编是人工智能领域硕士,全栈工 ...

  8. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

  9. 决策树算法和CART决策树算法详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

最新文章

  1. opengl库区分:glut、freeglut、glfw、glew、gl3w、glad
  2. python批处理修改文件的名字
  3. 新发现:高速下载Eclipse
  4. JAVA Spring Cloud 注册中心 Eureka 相关配置
  5. IDE之VS:Visual Studio2017版本安装图文教程之详细攻略
  6. 干货 | 双目摄像头实现手势识别,完美还原人体运动手势
  7. ACM10.14题解
  8. nginx工作原理:
  9. 计算机flash逐渐淡入,Flash air制作淡入淡出窗体动画效果
  10. etcd教程(二)—clientv3简单使用
  11. 学长的白日梦C语言题目,bzoj4030【HEOI2015】小L的白日梦
  12. shopnc route.php,shopnc商城专题页的伪静态支持
  13. 【设置版本号】React Native 通过配置文件package.json设置 Android安卓和iOS版本号
  14. 电子书下载:Adobe PDF 文档格式开发参考 PDF Reference 1.7
  15. 职业能力测试试题及答案
  16. 谷歌SEO英文外链建设指南
  17. WIN 11 无法正常运行HCL 模拟器
  18. vb程序设计教程第4版龚沛曾 实验答案解析
  19. sketch放入app组件_Sketch App 3中的基本图像编辑入门
  20. CFA插值基本方法简单介绍

热门文章

  1. Elasticsearch简史:源自给老婆开发烹饪App
  2. Java做爬虫也很牛
  3. 敲代码也能赚大钱吗?
  4. 深入浅出Java微服务视频
  5. 构建更好的敏捷项目管理组织所需的4种工具
  6. putchar函数的基本格式
  7. JSP内置对象-config
  8. 备份一个万能网卡驱动
  9. c# 实现自动搜索串口列表并刷新
  10. c语言实现指定路径文件读取_C语言实现文件复制功能(包括文本文件和二进制文件)...