机器学习(其三) 决策树
前言
由于某些原因,前2个部分的文章还没做出来,以后会补上,但是前后并没有关联性.编号只是一个编号而已.从哪一篇开始看都是可以的.
另外文中引用了他人的文章,会在参考资料部分标明,如有版权.转载等问题我会删掉那部分内容.
最后本人也是刚刚入门机器学习这一领域,如有问题欢迎探讨,希望大家看完都能有点收获.
运行环境是Anaconda3.
其中python版本为3.6.4
skearn版本0.19.1
(感觉很多人写文章都不说运行环境,写的很用心但是别人却运行不了,这太可惜了.)
决策树是什么?
决策树(decision tree)是一种基本的分类与回归方法。举个通俗易懂的例子,如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作为分支(branch),它可以达到另一个判断模块或者终止模块。我们还可以这样理解,分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。如下图所示的决策树,长方形和椭圆形都是结点。长方形的结点属于内部结点,椭圆形的结点属于叶结点,从结点引出的左右箭头就是有向边。而最上面的结点就是决策树的根结点(root node)。这样,结点说法就与模块说法对应上了,理解就好。
决策树的基本步骤
使用决策树做预测需要以下过程:
- 收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
- 准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
- 分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
- 训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
- 测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
ID3决策树和C4.5决策树
假设我们要对一个西瓜是不是一个好瓜进行判别,这个西瓜表示为一个向量
x⃗ =(x色泽,x根蒂,x敲声) x → = ( x 色 泽 , x 根 蒂 , x 敲 声 )
其中有一个瓜为
x1→=(青绿,蜷缩,浊响) x 1 → = ( 青 绿 , 蜷 缩 , 浊 响 )
那么用这个瓜来构建一个决策树应该考虑些什么问题呢?最重要的是如何选择色泽,根蒂,敲声这3个属性的先后顺序.
直观的经验告诉我们,应该首先对最重要的属性进行判别.比如说我们判别一个生物是不是鱼,我们首先判断的大概是它会不会游泳,而不是能不能吃.如果会游泳再判断它是否有鱼的其他特性.
在信息论中我们用信息增益来描述这个属性的重要度.
计算信息增益首先要计算信息熵(information entropy),也叫香农熵
信息熵计算如下:
Ent(D)=−∑|y|k=1pklog2pk E n t ( D ) = − ∑ k = 1 | y | p k l o g 2 p k
其中
D D :表示当前样本集合
:在当前样本集D中第k类样本所占的比例为
pk(k=1,2,...,|y|) p k ( k = 1 , 2 , . . . , | y | )
|y| | y | :在当前样本集D中总的类别总数
信息增益(information gain)为:
Gain(D,a)=Ent(D)−∑Vv=1|Dv||D|Ent(Dv) G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V | D v | | D | E n t ( D v )
其中
|D| | D | 为属性a的可取值范围的全集的元素数量,一般和样本集大小一样
|Dv| | D v | 为属性a的第v个取值的样本个数
列举《机器学习》中的例子来讲解
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 肚部 | 触感 | 好瓜 |
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青色 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
以上表中的数据计算色泽的信息增益,流程如下:
它有3个可能的取值:{青绿,乌黑,浅白}.如果用色泽对测试样本集进行划分可以得到3个子集分别为
D1(色泽=青绿),D2(色泽=乌黑),D3(色泽=浅白) D 1 ( 色 泽 = 青 绿 ) , D 2 ( 色 泽 = 乌 黑 ) , D 3 ( 色 泽 = 浅 白 )
优先计算根节点的信息熵Ent(D)
从表中的西瓜数据集为例,该数据集包含17个训练数据样例,用以学习一颗能预测没剖开的是不是好瓜的决策树,显然
|y|=2 | y | = 2 .(好瓜,坏瓜两个类别)在决策树学习开始时,根节点包含D中的所有样例,其中正例占
p1=817 p 1 = 8 17 ,反例占
p2=917 p 2 = 9 17 ,根据公司计算根节点的信息熵为
Ent(D)=−∑2k=1pklog2pk=−8