文章目录

  • 1 决策树算法简介
  • 2 决策树算法
    • 2.1 引例
      • 例1
      • 例2
    • 2.2 算法分类
      • (1) 信息熵
      • (2) 信息增益
      • (3) 增益率
      • (4) 基尼指数
  • 3 决策树算法优缺点
  • 4 实验
  • 参考资料

注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/96630813

1 决策树算法简介

决策树(Decision Tree) 是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
(以上均来自百度百科)

决策树学习算法的最大优点是,它可以自学习。在学习的过程中,不需要使用者了解过多背景知识,只需要对训练实例进行较好的标注,就能够进行学习。显然,它属于有监督学习。从一类无序、无规则的事物(概念)中推理出决策树表示的分类规则。

2 决策树算法

分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有三种类型:根节点、内部结点和叶节点。
根结点:包含全部样本;
叶结点:对应决策的结果;
内部结点:对应属性测试.

2.1 引例

例1

决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:
女儿:多大年纪了? (年龄)
母亲:26。
女儿:长的帅不帅? (长相)
母亲:挺帅的。
女儿:收入高不? (收入情况)
母亲:不算很高,中等情况。
女儿:是公务员不? (是否公务员)
母亲:是,在税务局上班呢。
女儿:那好,我去见见。

那么以上的对话女儿的最终决定是见,其中,叶节点就是“见”和“不见” ,内部节点就是:年龄、长相、收入情况和公务员。
其决策树如下图所示:

例2

机器学习中的西瓜数据集如下:


由上面西瓜数据集可知,由17个样本,对应6中属性(色泽、根蒂、敲声、纹理,脐部和触感)和最终的结果是不是好瓜。那么叶节点就是“好瓜”和“坏瓜” ,内部节点就是:色泽、根蒂、敲声、纹理,脐部和触感。
决策树的判别类似于人在面临问题决策的问题时的处理机制。我们通常买西瓜会看习惯的颜色,新鲜感,敲一敲是什么声音等。通过这几个问题,最终我们会做出决策,这个是不是好瓜。
其决策树如下图所示:

2.2 算法分类

决策树算法流程如下:


咋一眼,看着上面的算法比较复杂。其实决策树的生成就是一个递归过程。下面以西瓜数据集为例,进行计算。
一般而言,我们希望决策树的分支点所包含的样本尽可能属于同一类别,也就是节点的纯度(purity) 越来越高。在样本集中属性都会编码为一些数字(1,-1等),如何从这些数字进行划分呢? 在实际使用中,我们衡量的常常是不纯度。度量不纯度的指标有很多,例如:信息熵信息增益增益率基尼指数等。也就是通过信息熵,信息增益,增益率,基尼指数等对样本中的数字进行划分。

(1) 信息熵

信息熵定义表示随机变量不确定性的度量,假设有当前样本集合D中第k被样本所占的比例为 ,则DDD的信息熵定义为pk(k=1,2,…,∣y∣){p_k}(k = 1,2, \ldots ,\left| y \right|)pk​(k=1,2,…,∣y∣),则DDD的信息熵定义为
(1)Ent(D)=−∑k=1∣y∣pklog⁡2pk{\rm{Ent}}(D) = - \sum\limits_{k = 1}^{\left| y \right|} {{p_k}{{\log }_2}{p_k}} \tag{1}Ent(D)=−k=1∑∣y∣​pk​log2​pk​(1)
其中, Ent(D){\rm{Ent}}(D)Ent(D)的值越小,则DDD的纯度越高。

下面计算生成数据集然后计算熵(以机器学习实战书上的海洋生物数据为例)。

  1. 函数calEnt()计算熵
  2. 函数createDataSet()生成数据集

代码示例

import numpy as np
import pandas as pd# calEnt 函数功能:计算熵
# 参数说明:
#     dataSet:原始数据集
# 返回:
#     ent:熵的值
# """
def calEnt(dataSet):n = dataSet.shape[0] #数据集总行数iset = dataSet.iloc[:,-1].value_counts() #标签的所有类别p = iset/n #每一类标签所占比ent = (-p*np.log2(p)).sum() #计算信息熵return ent#createDataSet 函数功能: 创建数据集
def createDataSet():row_data = {'no surfacing':[1,1,1,0,0],'flippers':[1,1,0,1,1],'fish':['yes','yes','no','no','no']}dataSet = pd.DataFrame(row_data)return dataSet# 调用
dataSet = createDataSet() # 调用创建数据集 函数
result_calEnt=calEnt(dataSet)# 调用计算熵 函数
print("dataSet=",dataSet)
print("result_calEnt=",result_calEnt)

运行结果如下


注:熵越高,信息的不纯度就越高,即数据越混乱。

(2) 信息增益

信息增益的计算其实就是父节点的信息熵与下面所有节点总信息熵之差。但是不是简单地这里的子节点的总信息熵不能简单地求和,需要在求和前进行修正。
假设离散属性aaa有VVV个可能的取值 {a1,a2,…,aV}\left\{ {{a^1},{a^2}, \ldots ,{a^V}} \right\}{a1,a2,…,aV},若使用属性a对样本集D进行划分,则会产生VVV个分直接点,其中第vvv个分直接点包含了DDD中所有在属性aaa上取值为 aV{a^V}aV的样本,记为 DV{D^V}DV。我们可以通过公式(1)计算 DV{D^V}DV的信息熵,再考虑到不同的分支点所办函的样本数不同,给分支点赋予权重 ∣DV∣/∣D∣\left| {{D^V}} \right|/\left| D \right|∣∣​DV∣∣​/∣D∣,则样本数越多的分支节点的影响最大,于是可以计算出用属性aaa对样本集DDD进行划分所获得的信息增益为:
(2)Gain(D,a)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv){\rm{Gain(}}D{\rm{,a) = Ent}}(D) - \sum\limits_{v = 1}^V {{{\left| {{D^v}} \right|} \over {\left| D \right|}}{\rm{Ent}}({D^v})} \tag{2}Gain(D,a)=Ent(D)−v=1∑V​∣D∣∣Dv∣​Ent(Dv)(2)
其中,信息增益越大,则意味着用属性a来进行划分所获得的纯度提升越大。
著名的ID3(Iterative Dichotomiser, 迭代二分器) 决策树学习算法就是以信息增益为准则来划分属性。
下面使用信息增益在西瓜数据集生成决策树。


首先计算根节点的信息熵
Ent(D)=−∑k=1∣y∣pklog⁡2pk=−(817log⁡2817+917log⁡2917)=0.998{\rm{Ent}}(D) = - \sum\limits_{k = 1}^{\left| y \right|} {{p_k}{{\log }_2}{p_k}} = - ({8 \over {17}}{\log _2}{8 \over {17}} + {9 \over {17}}{\log _2}{9 \over {17}}) = 0.998 Ent(D)=−k=1∑∣y∣​pk​log2​pk​=−(178​log2​178​+179​log2​179​)=0.998
然后计算当前属性集合(色泽、根蒂、敲声、纹理,脐部和触感)中每个属性的信息增益。属性“色泽”有三个属性(青绿,乌黑,浅白)。若使用该属性对数据集D进行划分,则可以得到3个子集,分别记为: D1{D^1}D1(色泽=青绿), D2{D^2}D2(色泽=乌黑), D2{D^2}D2(色泽=浅白)
子集 D1{D^1}D1包含编号为(1,4,6,10,13,17)的6个样例,其中好瓜占p1=36{p_1} = {3 \over 6}p1​=63​,坏瓜占 p2=36{p_2} = {3 \over 6}p2​=63​;同理子集 D2{D^2}D2中,好瓜占 p1=46{p_1} = {4 \over 6}p1​=64​,坏瓜占 p1=26{p_1} = {2 \over 6}p1​=62​;子集 D3{D^3}D3中,好瓜占 p1=15{p_1} = {1 \over 5}p1​=51​,坏瓜占 p1=45{p_1} = {4 \over 5}p1​=54​。则,根据公式(1)可以计算用属性色泽划分后所获得的3个分支节点的信息熵为
Ent(D1)=−(36log⁡236+36log⁡236)=1{\rm{Ent}}({D^1}) = - ({3 \over 6}{\log _2}{3 \over 6} + {3 \over 6}{\log _2}{3 \over 6}) = 1Ent(D1)=−(63​log2​63​+63​log2​63​)=1 Ent(D2)=−(46log⁡246+26log⁡226)=0.918{\rm{Ent}}({D^2}) = - ({4 \over 6}{\log _2}{4 \over 6} + {2 \over 6}{\log _2}{2 \over 6}) = 0.918Ent(D2)=−(64​log2​64​+62​log2​62​)=0.918 Ent(D3)=−(15log⁡215+45log⁡245)=0.722{\rm{Ent}}({D^3}) = - ({1 \over 5}{\log _2}{1 \over 5} + {4 \over 5}{\log _2}{4 \over 5}) = 0.722Ent(D3)=−(51​log2​51​+54​log2​54​)=0.722
则,根据公式(2)可以计算属性色泽的信息增益
Gain(D,a1)=Ent(D)−∑v=13∣Dv∣∣D∣Ent(Dv)=0.998−(617×1+617×0.918+517×0.722)=0.109{\rm{Gain(}}D{\rm{,}}{a_1}{\rm{) = Ent}}(D) - \sum\limits_{v = 1}^3 {{{\left| {{D^v}} \right|} \over {\left| D \right|}}{\rm{Ent}}({D^v})} = 0.998 - ({6 \over {17}} \times 1 + {6 \over {17}} \times 0.918 + {5 \over {17}} \times 0.722) = 0.109Gain(D,a1​)=Ent(D)−v=1∑3​∣D∣∣Dv∣​Ent(Dv)=0.998−(176​×1+176​×0.918+175​×0.722)=0.109
同理可以计算出其他属性的信息增益(色泽、根蒂、敲声、纹理,脐部和触感分别用 a1,a2,a3,a4,a5,a6{a_1},{a_2},{a_3},{a_4},{a_5},{a_6}a1​,a2​,a3​,a4​,a5​,a6​表示),则
Gain(D,a2)=0.143{\rm{Gain(}}D{\rm{,}}{a_2}{\rm{) = 0}}{\rm{.143}}Gain(D,a2​)=0.143 Gain(D,a3)=0.141{\rm{Gain(}}D{\rm{,}}{a_3}{\rm{) = 0}}{\rm{.141}}Gain(D,a3​)=0.141 Gain(D,a4)=0.381{\rm{Gain(}}D{\rm{,}}{a_4}{\rm{) = 0}}{\rm{.381}}Gain(D,a4​)=0.381 Gain(D,a5)=0.289{\rm{Gain(}}D{\rm{,}}{a_5}{\rm{) = 0}}{\rm{.289}}Gain(D,a5​)=0.289 Gain(D,a6)=0.006{\rm{Gain(}}D{\rm{,}}{a_6}{\rm{) = 0}}{\rm{.006}}Gain(D,a6​)=0.006
显然,属性纹理使的信息增益最大,于是被选为划分属性,下图为基于纹理对根节点进行划分的结果。

然后决策树学习算法将每一个节点做进一步划分,最终得到决策树如下图所示

(3) 增益率

实际中,信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好对决策树带来不利影响,C4.5决策树算法不直接使用信息增益,而是使用增益率来选择最优划分属性,增益率定义为
(3)Gain_ratio(D,a)=Gain(D,a)IV(a){\rm{Gain\_ratio(}}D{\rm{,a) = }}{{{\rm{Gain}}(D,a)} \over {{\rm{IV}}(a)}} \tag{3}Gain_ratio(D,a)=IV(a)Gain(D,a)​(3)
其中 IV(a){\rm{IV}}(a)IV(a)定义为:
(4)IV(a)=−∑v=1V∣Dv∣∣D∣log2∣Dv∣∣D∣{\rm{IV}}(a) = - \sum\limits_{v = 1}^V {{{\left| {{D^v}} \right|} \over {\left| D \right|}}{\rm{lo}}{{\rm{g}}_2}{{\left| {{D^v}} \right|} \over {\left| D \right|}}} \tag{4}IV(a)=−v=1∑V​∣D∣∣Dv∣​log2​∣D∣∣Dv∣​(4)
IV(a){\rm{IV}}(a)IV(a)称为属性aaa的固有值。属性aaa的可能取值数目越多(V越大),则 IV(a){\rm{IV}}(a)IV(a)的值通常越大。增益率准则对可取值数目较少的属性有所偏好,因此C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益最高的。

(4) 基尼指数

CART(Classification and Regression Tree) 决策树使用基尼指数(Gini index)来选择划分属性,则数据集DDD的纯度用基尼值定义为
(5)Gini(D)=∑k=1∣y∣∑k′≠kpkpk′=1−∑k=1∣y∣pk2{\rm{Gini(}}D{\rm{) = }}\sum\limits_{k = 1}^{\left| y \right|} {\sum\limits_{k' \ne k} {{p_k}{p_{k'}}} } = 1 - \sum\limits_{k = 1}^{\left| y \right|} {p_k^2} \tag{5}Gini(D)=k=1∑∣y∣​k′̸​=k∑​pk​pk′​=1−k=1∑∣y∣​pk2​(5)
Gain(D){\rm{Gain(}}D{\rm{)}}Gain(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此, Gain(D){\rm{Gain(}}D{\rm{)}}Gain(D)越小,数据集DDD的纯度越高。
故,属性aaa的基尼指数定义为
(6)Gini_index(D,a)=∑k=1∣y∣∣Dv∣∣D∣Gini(Dv){\rm{Gini\_index(}}D,a{\rm{)}} = \sum\limits_{k = 1}^{\left| y \right|} {{{\left| {{D^v}} \right|} \over {\left| D \right|}}} {\rm{Gini(}}{D^v}{\rm{)}} \tag{6}Gini_index(D,a)=k=1∑∣y∣​∣D∣∣Dv∣​Gini(Dv)(6)
于是,我们选择在候选属性集合AAA中,选择那么使得划分后基尼指数最小的属性作为最优划分属性,
即 a∗=arg⁡a∈AGini_index(D,a){a_*} = \mathop {\arg }\limits_{a \in A} {\rm{Gini\_index(}}D,a{\rm{)}}a∗​=a∈Aarg​Gini_index(D,a)

3 决策树算法优缺点

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据;
缺点:可能会产生过度匹配问题;
适用数据范围:数值型和标称型。

4 实验

以机器学习实战书中的数据为例

trees.py

#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']labels = ['不浮出水面', '脚蹼']#change to discrete valuesreturn dataSet, labelsdef calcShannonEnt(dataSet): #计算熵numEntries = len(dataSet)labelCounts = {}for featVec in dataSet: #the the number of unique elements and their occurancecurrentLabel = featVec[-1]if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1shannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key])/numEntriesshannonEnt -= prob * log(prob,2) #log base 2return shannonEntdef splitDataSet(dataSet, axis, value): # 划分数据retDataSet = []for featVec in dataSet:if featVec[axis] == value:reducedFeatVec = featVec[:axis]     #chop out axis used for splittingreducedFeatVec.extend(featVec[axis+1:])retDataSet.append(reducedFeatVec)return retDataSetdef chooseBestFeatureToSplit(dataSet): # 选择最好的方式划分数据集(利用信息增益)numFeatures = len(dataSet[0]) - 1      #the last column is used for the labelsbaseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0; bestFeature = -1for i in range(numFeatures):        #iterate over all the featuresfeatList = [example[i] for example in dataSet]#create a list of all the examples of this featureuniqueVals = set(featList)       #get a set of unique valuesnewEntropy = 0.0for value in uniqueVals:subDataSet = splitDataSet(dataSet, i, value)prob = len(subDataSet)/float(len(dataSet))newEntropy += prob * calcShannonEnt(subDataSet)     infoGain = baseEntropy - newEntropy     #calculate the info gain; ie reduction in entropyif (infoGain > bestInfoGain):       #compare this to the best gain so farbestInfoGain = infoGain         #if better than current best, set to bestbestFeature = ireturn bestFeature                      #returns an integerdef 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]

main.py

# main.py
from numpy import *
import trees
import treePlotter
import matplotlib.pyplot as plt
myData, labels=trees. createDataSet() # 读取数据
print(myData) # 打印数据entropy=trees.calcShannonEnt(myData) #计算熵
print(entropy)result=trees.chooseBestFeatureToSplit(myData) #利用信息增益得到决策树
print(result)
result_Tree=trees.createTree(myData, labels)
print(result_Tree)

运行结果如下


参考资料

[1] 机器学习实战. 人民邮电出版社.
[2] https://coding.imooc.com/class/chapter/169.html#Anchor
[3] 机器学习, 北京: 清华大学出版社, 2016年1月
[4] 机器学习(西瓜书). 公式推导解析

机器学习(6): 决策树算法 小结与实验相关推荐

  1. python决策树实例_Python机器学习之决策树算法实例详解

    本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. ...

  2. 机器学习:决策树算法(ID3算法)的理解与实现

    机器学习:决策树算法(ID3算法)的理解与实现 文章目录 机器学习:决策树算法(ID3算法)的理解与实现 1.对决策树算法的理解 1.概述 2.算法难点 选择最优划分属性 1.信息熵 2.信息增益 2 ...

  3. 【MATLAB】机器学习:决策树算法实验

    实验内容 1 使用决策数实现西瓜数据集2.0的分类(随机十次的结果取平均): 2 使用决策数实现鸢尾花的分类(随机十次的结果取平均) : 3 画出十次实验的精度变化曲线图. 实验代码 %%****** ...

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

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

  5. 机器学习基础 决策树算法

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

  6. 【机器学习】决策树算法

    在前一期介绍搭建结合机器学习的CI/CD管道时,无意中提到了算法分类.在受监督学习的分类中,有一个既适用于回归又适用于分类的算法,即我们今天要介绍的决策树算法(CART, Classification ...

  7. 机器学习之决策树算法前期(创建、分类及展示)

    一.什么是决策树? 决策树算法是一种逼近离散函数值的方法.它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析.本质上决策树是通过一系列规则对数 ...

  8. 机器学习3决策树算法模型

    决策树算法模型 1.什么是决策树? 2.决策树的归纳 2.1 (选择分裂特征)特征的选择 2.2 决策树的生成 2.2.1 ID3 算法 2.2.2 C4.5 算法 2.2.3 Card算法 2.2 ...

  9. 机器学习之决策树算法-概念和学习过程

    1.      概念 决策树是通过一系列规则对数据进行分类的过程,它提供一种在什么条件下会得到什么值的类似规则的方法.决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树. ...

  10. 『机器学习』 —— 决策树算法(Decision Tree)

    文章首发地址见个人博客 决策树(Decision Tree) 1.机器学习算法中分类和预测算法的评估 准确率 速度 强壮性 可规模性 可解释性 2.什么是决策树(Decision Tree)? 决策树 ...

最新文章

  1. 搜索算法,一触即达:GitHub上有个规模最大的开源算法库
  2. R可视化使用ggplot2将坐标轴设置为对数坐标轴(Log Scale)
  3. 从源码角度来读Handler
  4. 直接启动SDK Manager: $ADNROID_HOME/tools/android
  5. 我们来聊点成年人的话题!
  6. Android传感器模拟器,如何为Android构建传感器模拟器?
  7. 居民小区变配电电力监控系统-安科瑞苏月婷
  8. 一个不简单的Procedure body例子
  9. 函数的连续性以及间断点
  10. 北师大 外国教育史-2(古罗马教育、中世纪教育)
  11. 如何将英文pdf文档在线翻译成中文?
  12. 夫兵形象水,水之行避高趋下,兵之形避实击虚;水因地制流,兵因故制胜。故兵无常势水无常形。能因敌变化取胜者谓之神。
  13. 阿里巴巴P8架构师手码SpringCloud笔记,看完不走弯路
  14. Sony xperia xz1compact - 重刷固件ROM和解锁ROOT教程
  15. 按键精灵怎么打地鼠_和大家聊少儿编程,什么时候学最佳?怎么选课?
  16. home staging_楼市风向不定,让你跌破眼镜的奇葩Home Staging(房屋装饰升级),简直惨不忍睹!有图有真相!...
  17. 苹果开发者账号持有者转移流程
  18. 破壁,宝藏艺术家登场!(一)
  19. 高性能并发队列Disruptor
  20. 微信公众号赞赏功能指引

热门文章

  1. java从数据库映射实体类的代码
  2. 基于QT实现的数独游戏DPLL的SAT求解器设计
  3. ubuntu 安装 tree 命令
  4. netstat 的10个基本用法
  5. 【应急响应】Linux应急响应入侵排查思路
  6. 一般纳税人税额计算_一般纳税人企业缴税计算
  7. js alert追加html,利用JQ来美化Js的alert弹出框
  8. 基于Scala版本的TMDB大数据电影分析项目
  9. JEECG框架创建项目使用步骤
  10. DG半离散格式的转化---基于matlab编写