实验环境

  • python 3.6.5
  • jupyter

    决策树是什么

      决策论中,决策树(Decision tree)由一个决策图和可能的结果(包括资源成本和风险)组成, 用来创建到达目标的规划。决策树建立并用来辅助决策,是一种特殊的树结构。决策树是一个利用像树一样的图形或决策模型的决策支持工具,包括随机事件结果,资源代价和实用性。它是一个算法显示的方法。决策树经常在运筹学中使用,特别是在决策分析中,它帮助确定一个能最可能达到目标的策略。如果在实际中,决策不得不在没有完备知识的情况下被在线采用,一个决策树应该平行概率模型作为最佳的选择模型或在线选择模型算法。决策树的另一个使用是作为计算条件概率的描述性手段。
      机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。
      从数据产生决策树的机器学习技术叫做决策树学习,通俗说就是决策树。一个决策树包含三种类型的节点:
        1、决策节点:通常用矩形框来表示
        2、机会节点:通常用圆圈来表示
        3、终结点:通常用三角形来表示

      使用决策树做预测需要以下过程:
        1、收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过采访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
        2、准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
        3、分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
        4、训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
        5、测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
        6、使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

    决策树构建的准备工作

      使用决策树做预测的每一步骤都很重要,数据收集不到位,将会导致没有足够的特征让我们构建错误率低的决策树。数据特征充足,但是不知道用哪些特征好,将会导致无法构建出分类效果好的决策树模型。从算法方面看,决策树的构建是我们的核心内容。决策树要如何构建呢?通常,这一过程可以概括为3个步骤:特征选择、决策树的生成和决策树的修剪。
      1、特征选择
      特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的标准是信息增益(information gain)或信息增益比。
      我们选择信息增益作为选择特征的标准,首先来看一组实例,贷款申请样本数据表。

      希望通过所给的训练数据学习一个贷款申请的决策树,用于对未来的贷款申请进行分类,即当新的客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请。特征选择就是决定用哪个特征来划分特征空间。比如,我们通过上述数据表得到两个可能的决策树,分别由两个不同特征的根结点构成。

  •   图(a)所示的根结点的特征是年龄,有3个取值,对应于不同的取值有不同的子结点。图(b)所示的根节点的特征是工作,有2个取值,对应于不同的取值有不同的子结点。两个决策树都可以从此延续下去。问题是:究竟选择哪个特征更好些?这就要求确定选择特征的准则。直观上,如果一个特征具有更好的分类能力,或者说,按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征。信息增益就能够很好地表示这一直观的准则。
      什么是信息增益呢?在划分数据集之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。在之后的小节会举例着重说明特征选择。
      2、决策树的生成和修剪
      构建决策树的算法有很多,比如C4.5、ID3和CART,这些算法在运行时并不总是在每次划分数据分组时都会消耗特征。由于特征数目并不是每次划分数据分组时都减少,因此这些算法在实际使用时可能引起一定的问题。目前我们并不需要考虑这个问题,只需要在算法开始运行前计算列的数目,查看算法是否使用了所有属性即可。
      决策树生成算法递归地产生决策树,直到不能继续下去未为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。

    【实验步骤】特征选择---香浓熵

      在可以评测哪个数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集合信息的度量方式称为香农熵或者简称为熵(entropy),这个名字来源于信息论之父克劳德·香农。熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。如果待分类的事物可能划分在多个分类中,则符号xi的信息定义为:

      其中p(xi)是选择该分类的概率。
      通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:

  •   其中n是分类的数目。熵越大,随机变量的不确定性就越大。
      当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵。我们定义贷款申请样本数据表中的数据为训练数据集D,则训练数据集D的经验熵为H(D),|D|表示其样本容量,及样本个数。设有K个类Ck, = 1,2,3,...,K,|Ck|为属于类Ck的样本个数,因此经验熵公式就可以写为:

  •   根据此公式计算经验熵H(D),分析上节中贷款申请样本数据表中的数据。最终分类结果只有两类,即放贷和不放贷。根据表中的数据统计可知,在15个数据中,9个数据的结果为放贷,6个数据的结果为不放贷。所以数据集D的经验熵H(D)为:

  •   经过计算可知,数据集D的经验熵H(D)的值为0.971。

    【实验步骤】特征选择---编写代码计算经验熵

      在编写代码之前,我们先对数据集进行属性标注。
        年龄:0代表青年,1代表中年,2代表老年;
        有工作:0代表否,1代表是;
        有自己的房子:0代表否,1代表是;
        信贷情况:0代表一般,1代表好,2代表非常好;
        类别(是否给贷款):no代表否,yes代表是。
      确定这些之后,我们就可以创建数据集,并计算经验熵了,代码编写如下:

  • # -*- coding: UTF-8 -*-
    from math import log
    """
    Parameters:无
    Returns:dataSet - 数据集labels - 分类属性
    """
    def createDataSet():dataSet = [[0, 0, 0, 0, 'no'],         #数据集[0, 0, 0, 1, 'no'],[0, 1, 0, 1, 'yes'],[0, 1, 1, 0, 'yes'],[0, 0, 0, 0, 'no'],[1, 0, 0, 0, 'no'],[1, 0, 0, 1, 'no'],[1, 1, 1, 1, 'yes'],[1, 0, 1, 2, 'yes'],[1, 0, 1, 2, 'yes'],[2, 0, 1, 2, 'yes'],[2, 0, 1, 1, 'yes'],[2, 1, 0, 1, 'yes'],[2, 1, 0, 2, 'yes'],[2, 0, 0, 0, 'no']]labels = ['不放贷', '放贷']             #分类属性return dataSet, labels                #返回数据集和分类属性
    """
    函数说明:计算给定数据集的经验熵(香农熵)
    Parameters:dataSet - 数据集
    Returns:shannonEnt - 经验熵(香农熵)
    """
    def calcShannonEnt(dataSet):numEntires = len(dataSet)                        #返回数据集的行数labelCounts = {}                                #保存每个标签(Label)出现次数的字典#在下面添加代码,对每组特征向量进行统计,得到不同label的计数,并保存到labelCounts中countno=0countyes=0for temp in dataSet:if temp[-1]=='no':countno=countno+1else:countyes=countyes+1labelCounts={'不放贷':countno,'放贷':countyes}    shannonEnt = 0.0                                #经验熵(香农熵)#在下面添加代码,计算当前数据集基于labelCounts的经验熵,结果存放在shannonEnt中for i in labelCounts.values():shannonEnt=shannonEnt-i/(countno+countyes)*log(i/(countno+countyes),2)return shannonEnt                                #返回经验熵(香农熵)
    if __name__ == '__main__':dataSet, features = createDataSet()print(dataSet)print(calcShannonEnt(dataSet))

    运行结果如下:

  • [[0, 0, 0, 0, 'no'], [0, 0, 0, 1, 'no'], [0, 1, 0, 1, 'yes'], [0, 1, 1, 0, 'yes'], [0, 0, 0, 0, 'no'], [1, 0, 0, 0, 'no'], [1, 0, 0, 1, 'no'], [1, 1, 1, 1, 'yes'], [1, 0, 1, 2, 'yes'], [1, 0, 1, 2, 'yes'], [2, 0, 1, 2, 'yes'], [2, 0, 1, 1, 'yes'], [2, 1, 0, 1, 'yes'], [2, 1, 0, 2, 'yes'], [2, 0, 0, 0, 'no']]
    0.9709505944546686

 信息增益是相对于特征而言的,信息增益越大,特征对最终的分类结果影响也就越大,我们就应该选择对最终分类结果影响最大的那个特征作为我们的分类特征。在讲解信息增益定义之前,我们还需要明确一个概念,条件熵。
  条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,随机变量X给定的条件下随机变量Y的条件熵(conditional entropy)H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:

  同理,当条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的条件熵称为条件经验熵。
  信息增益是相对于特征而言的。所以,特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:

设特征A有n个不同的取值{a1,a2,···,an},根据特征A的取值将D划分为n个子集{D1,D2,···,Dn},|Di|为Di的样本个数。记子集Di中属于Ck的样本的集合为Dik,即Dik = Di ∩ Ck,|Dik|为Dik的样本个数。于是经验条件熵的公式可以写为:

 以贷款申请样本数据表为例进行说明。看下年龄这一列的数据,也就是特征A1,一共有三个类别,分别是:青年、中年和老年。我们只看年龄是青年的数据,年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现的概率是十五分之五,也就是三分之一。同理,年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是青年的数据的最终得到贷款的概率为五分之二,因为在五个数据中,只有两个数据显示拿到了最终的贷款,同理,年龄是中年和老年的数据最终得到贷款的概率分别为五分之三、五分之四。所以计算年龄的信息增益,过程如下:

 最后,比较特征的信息增益,由于特征A3(有自己的房子)的信息增益值最大,所以选择A3作为最优特征。

【实验步骤】特征选择---编写代码计算信息增益

我们已经学会了通过公式计算信息增益,接下来编写代码,计算信息增益。splitDataSet函数是用来选择各个特征的子集的,比如选择年龄(第0个特征)的青年(用0代表)的自己,我们可以调用splitDataSet(dataSet,0,0)这样返回的子集就是年龄为青年的5个数据集。chooseBestFeatureToSplit是选择选择最优特征的函数。运行代码结果如下:

# -*- coding: UTF-8 -*-"""
函数说明:按照给定特征划分数据集,得到第axis维特征值为value的划分数据子集
Parameters:dataSet - 待划分的数据集axis - 划分数据集的特征value - 需要返回的特征的值
Returns:无
"""
def splitDataSet(dataSet, axis, value):       retDataSet = []             #创建返回的数据集列表#在下面添加代码,将dataSet中第axis维特征等于value的数据取出,存放入retDataSet#注意,为方便后面的计算,存放入retDataSet的每一组记录需要去掉axis特征for temp in dataSet:if temp[axis]==value:temp1=temp[0:axis]temp2=temp[axis+1:]temp1=temp1+temp2retDataSet.append(temp1)#print(retDataSet)return retDataSet     #返回划分后的数据集
"""
函数说明:选择最优特征
Parameters:dataSet - 数据集
Returns:bestFeature - 信息增益最大的(最优)特征的索引值
"""
def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1                    #特征数量baseEntropy = calcShannonEnt(dataSet)                 #计算数据集的香农熵bestInfoGain = 0.0                                  #信息增益bestFeature = -1 #最优特征的索引值L=len(dataSet)#print(L)for i in range(numFeatures):                         #遍历所有特征#获取dataSet的第i个所有特征featList = [example[i] for example in dataSet]uniqueVals = set(featList)                         #创建set集合{},元素不可重复newEntropy = 0.0                                  #经验条件熵#在下方添加代码,计算根据uniqueVals中的特征值划分的数据子集的条件熵,for循环中需要调用splitDataSet函数,结果记录到newEntropy中for temp in uniqueVals:no1=0yes1=0Di=splitDataSet(dataSet,i,temp)print(Di)d=len(Di)print(d)for tem in Di:if tem[-1]=='no':no1=no1+1else:yes1=yes1+1print(no1,yes1)        if no1!=0:newEntropy=newEntropy-d/L*no1/d*log(no1/d,2)if yes1!=0:newEntropy=newEntropy-d/L*yes1/d*log(yes1/d,2)print(newEntropy)infoGain=baseEntropy - newEntropy                     #信息增益print("第%d个特征的增益为%.3f" % (i, infoGain))            #打印每个特征的信息增益if (infoGain > bestInfoGain):                             #计算信息增益bestInfoGain = infoGain                             #更新信息增益,找到最大的信息增益bestFeature = i        #记录信息增益最大的特征的索引值#print(uniqueVals)#print(featList)    return bestFeature                                             #返回信息增益最大的特征的索引值
if __name__ == '__main__':dataSet, features = createDataSet()print("最优特征索引值:" + str(chooseBestFeatureToSplit(dataSet)))

运行结果如下:

[[0, 0, 0, 'no'], [0, 0, 1, 'no'], [1, 0, 1, 'yes'], [1, 1, 0, 'yes'], [0, 0, 0, 'no']]
5
3 2
0.3236501981515562
[[0, 0, 0, 'no'], [0, 0, 1, 'no'], [1, 1, 1, 'yes'], [0, 1, 2, 'yes'], [0, 1, 2, 'yes']]
5
2 3
0.6473003963031124
[[0, 1, 2, 'yes'], [0, 1, 1, 'yes'], [1, 0, 1, 'yes'], [1, 0, 2, 'yes'], [0, 0, 0, 'no']]
5
1 4
0.8879430945988998
第0个特征的增益为0.083
[[0, 0, 0, 'no'], [0, 0, 1, 'no'], [0, 0, 0, 'no'], [1, 0, 0, 'no'], [1, 0, 1, 'no'], [1, 1, 2, 'yes'], [1, 1, 2, 'yes'], [2, 1, 2, 'yes'], [2, 1, 1, 'yes'], [2, 0, 0, 'no']]
10
6 4
0.6473003963031124
[[0, 0, 1, 'yes'], [0, 1, 0, 'yes'], [1, 1, 1, 'yes'], [2, 0, 1, 'yes'], [2, 0, 2, 'yes']]
5
0 5
0.6473003963031124
第1个特征的增益为0.324
[[0, 0, 0, 'no'], [0, 0, 1, 'no'], [0, 1, 1, 'yes'], [0, 0, 0, 'no'], [1, 0, 0, 'no'], [1, 0, 1, 'no'], [2, 1, 1, 'yes'], [2, 1, 2, 'yes'], [2, 0, 0, 'no']]
9
6 3
0.5509775004326938
[[0, 1, 0, 'yes'], [1, 1, 1, 'yes'], [1, 0, 2, 'yes'], [1, 0, 2, 'yes'], [2, 0, 2, 'yes'], [2, 0, 1, 'yes']]
6
0 6
0.5509775004326938
第2个特征的增益为0.420
[[0, 0, 0, 'no'], [0, 1, 1, 'yes'], [0, 0, 0, 'no'], [1, 0, 0, 'no'], [2, 0, 0, 'no']]
5
4 1
0.2406426982957874
[[0, 0, 0, 'no'], [0, 1, 0, 'yes'], [1, 0, 0, 'no'], [1, 1, 1, 'yes'], [2, 0, 1, 'yes'], [2, 1, 0, 'yes']]
6
2 4
0.6079610319175832
[[1, 0, 1, 'yes'], [1, 0, 1, 'yes'], [2, 0, 1, 'yes'], [2, 1, 0, 'yes']]
4
0 4
0.6079610319175832
第3个特征的增益为0.363
最优特征索引值:2

决策树算法原理(python)相关推荐

  1. 决策树算法原理及实现

    决策树算法原理及实现 转载自:https://www.cnblogs.com/sxron/p/5471078.html (一)认识决策树 1.决策树分类原理 决策树是通过一系列规则对数据进行分类的过程 ...

  2. 决策树算法原理(ID3,C4.5)

    决策树算法原理(CART分类树) CART回归树 决策树的剪枝 决策树可以作为分类算法,也可以作为回归算法,同时特别适合集成学习比如随机森林. 1. 决策树ID3算法的信息论基础   1970年昆兰找 ...

  3. 决策树算法原理(下)

    在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处 ...

  4. 决策树算法原理(上)

    决策树算法在机器学习中算是很经典的一个算法系列了.它既可以作为分类算法,也可以作为回归算法,同时也特别适合集成学习比如随机森林.本文就对决策树算法原理做一个总结,上篇对ID3, C4.5的算法思想做了 ...

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

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

  6. 决策树算法及Python 代码示例

    决策树是一种基于树形结构的算法,用于在一系列决策和结果之间建立模型.它通过对特征和目标变量之间的关系进行划分,来预测目标变量的值. 决策树算法示例: 假设我们有一组数据,其中包含天气,温度,湿度和是否 ...

  7. FlyAI小课堂:python机器学习笔记:深入学习决策树算法原理

    分类技术(或分类法)是一种根据输入数据建立分类模型的系统方法,分类法的例子包括决策分类法,基于规则的分类法,神经网络,支持向量机和朴素贝叶斯分类法.这些技术都使用一种学习算法(learning alg ...

  8. 机器学习-决策树算法原理及实现-附python代码

    1.决策树-分类树 sklearn.tree.DecisionTreeClassifier官方地址: https://scikit-learn.org/stable/modules/generated ...

  9. ID3决策树算法及其Python实现

    目录 一.决策树算法 基础理论 决策树的学习过程 ID3算法 二.实现针对西瓜数据集的ID3算法 实现代码 三.C4.5和CART的算法代码实现 C4.5算法 CART算法 总结 参考文章 一.决策树 ...

  10. python决策树算法_决策树算法及python实现

    决策树算法是机器学习中的经典算法 1.决策树(decision tree) 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别. 假设小明去看 ...

最新文章

  1. 安装oracle到create inventory时卡住了怎么办_「推荐」wacom数位板怎么用?教你如何正确的安装数位板驱动...
  2. WiFi安全那些事儿,整理推荐~
  3. JEECG微云快速开发平台
  4. spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构
  5. 很有必要看,这篇 解决 IndexError: list index out of range
  6. 全卷积神经网路【U-net项目实战】U-Net网络练习题: Kaggle - 2018 Data Science Bowl
  7. 自学python困难吗_Python学习难不难?零基础好学吗?
  8. andorid程序UI线程下开启子线程闪退错误解决
  9. python安装多少位_python安装流程
  10. java 包装类方法总结_【源码】java包装类总结
  11. OA项目10:部门管理的三个细节问题的解决及处理懒加载问题
  12. Operations Manager 2007 监控Active Directory SCOM-Part 3
  13. Oracle 存储大文本
  14. TensorFlow:偏微分方程
  15. linux redis 安装部署,Linux Redis安装部署
  16. mysql 5.7 group_mysql,_mysql5.7中group by和mysql5.5中group by的结果不一样,mysql - phpStudy...
  17. mysql语法检查工具_sql语法分析器(sql语法分析工具)
  18. Citavi系列之Word参考文献APA转LaTeX Bib文件
  19. 三菱PLC与威伦触摸屏通过OPC通信连接在线模拟仿真
  20. 分享10个优秀的技术栈社区

热门文章

  1. 高德地图html js开发例子,vue.js高德地图实现热点图代码实例
  2. Activiti工作流教程
  3. 上海python周末培训班_上海python周末班
  4. python怎么计算_python怎么计算
  5. 20来行的Python拼写检查器
  6. java程序设计教程答案解压密码,泛微网络java面试
  7. 流量劫持是如何产生的
  8. DSPE-PEG-GSH
  9. 基于SSM快递取件管理系统
  10. 盘符没有显示,磁盘管理器提示磁盘没有初始化(已解决)