一、决策树模型与学习
1.1决策树模型
决策树由结点(node)和有向边(directed edge)组成,其中结点由内部结点(internal node)和叶子结点(leaf node)组成;
决策树从根结点开始对实例某一特征进行判别,根据判别结果依次往下递归,直到叶子结点,将实例成功分类。
1.2决策树的学习
给定数据集,其中
是特征向量,其中特征有t个;
是类标记,样本总共有K类。
决策树根据不同种类样本的特征分布,学习出一种根据特征来判别未知种类样本的种类。
二、特征选择
在样本众多特征中,我们希望找到一种分类效果好的特征,也就是说,这个特征有比较强的分类能力。
下表是有15个样本组成的贷款申请的训练数据,银行根据申请人的请款,判断是否审批贷款。
样本的特征有四个(年龄,工作,房子,信贷);而样本的类别是是或者否。
我们希望可以通过通过表中的数据学习一种评判标准,当下一位申请者来时可以以过去的标准来做出选择。
2.1熵
统计学习中,熵(entropy)是一个经常被使用的概念,其描述的是一个系统不确定的程度,公式
,定义
熵越大,这个系统不确定程度越高
实际中,对数常以2为底
当随机变量只有0与1两个取值时,
此时,熵的大小与p的关系如下
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件分别称为经验熵(empiricalentropy)和经验条件(empirical conditional entropy)
2.2信息增益
当一个新的特征加入时,我们评价这个特征对系统分类能力的影响,所用的指标便是信息增益。
定义
其中D为讨论的样本总体,而A为某个特征;当特征A加入系统后,系统变得更确定了一些,此时
小于
,二者之差便是特征A带来的收益。
当我们讨论一个系统时,根据样本计算出经验熵。其中为训练数据集,
为样本个数,这些样本对应
类,分别为
;特征A有
个取值,将训练集划分为
。
再计算A特征下的条件经验熵
其中为第
个划分集合的熵
回到我们的贷款实例
年龄将样本分为,分别对应青年,中年与老年;所以样本被分为两类,即基于贷款核拒绝贷款(是和否)。
首先计算经验熵,总共15个样本,否样本占6个,是样本占9个
是 | 否 |
---|---|
9 | 6 |
观察特征年龄,在中有5个样本,是占2个,否占3个;在
中有5个样本,是占3个,否占2个;在
中有5个样本,是占4个,否占1个;
青年 | 中年 | 老年 | |||
---|---|---|---|---|---|
是 | 否 | 是 | 否 | 是 | 否 |
2 | 3 | 3 | 2 | 4 | 1 |
同理计算工作、房子、信贷的信息增益分别为0.324,0.420,0.363,其中房子信息增益最大。
2.3信息增益比
不过单纯使用信息增益来衡量的话,取值较多的特征信息增益往往更大一些,这也就不符合我们对特征获得高分类能力的要求。
于是我们利用信息增益比
其中,即特征A取值的经验熵。
三、树的生成
3.1ID3算法
ID3算法认为信息增益大的特征更优,应距离根节点更近;
从根节点开始选择信息增益最大的特征作为结点特征,由该特征不同取值建立子节点,直到所有特征都用上或者信息增益很小为止。
还是以贷款案例为例,上面已经计算出房子信息增益最大,次大是有工作,于是
样本中所有有房子的都贷到了款,于是直接连接是的叶子节点。而没有房子的个体再考虑是否有工作,有工作的全部贷到了款,而没有的全被拒了,发现不需要其他特征了,于是构建如上图所示决策树。
3.2C4.5
C4.5算法较ID3算法而言使用信息增益比来选取特征
特征分别对应年龄工作房子信贷,其中
发现信息增益比最大的还是房子和工作,树画法和ID3无异
3.3剪枝
理论上来说,只要树足够复杂,都可以把训练数据很好的分类;不过这样,对于未知的数据而言,在这种树上表现就不佳了,这也就是我们常说的过拟合了。
这需要我们对树进行修剪,让其不再那么复杂,这就是剪枝操作;通过裁剪子树或者叶子结点,将根节点或者父结点作为新的叶子结点。
在这里,评价模型的好坏同样是使用损失函数(loss function)。
对于一个树,其叶子结点个数为
,
是叶子结点,其有
个样本,
类的样本点有
个,
为叶子结点
上的经验熵
是参数,损失定义为
我们观察损失的定义,便是某一叶子结点的熵,如果这个叶子结点所含种类多,那么他的熵也就大,说明该分支并没有很好的区分能力,于是损失就大。
同时我们希望树不要太复杂,不希望有太多的叶子结点,于是我们将叶子结点的数量乘上一个参数加入损失,用于控制树的复杂度。
上述公式左端可写作
于是有
我们拿到一棵树后,算出每个结点的经验熵,如果剪枝能让损失变小,就剪掉;如此我们就可以得到一颗修剪过的树了
以这棵树为例,有三个叶子结点,;我们考虑工作属性是否可以作为新的叶子结点,我们计算原树的损失函数;
有房 | 无房 | ||||
---|---|---|---|---|---|
是 | 否 | 有工作 | 无工作 | ||
是 | 否 | 是 | 否 | ||
6 | 0 | 3 | 0 | 0 | 6 |
有房子且为是的样本有6个,有房子且为否的样本为0个,其熵为
。
没有房子的个体中,有工作且是的样本有3个,有工作且否的样本有0个,其熵为
没有房子的个体中,无工作且是的样本有0个,有工作且否的样本有6个,其熵为
此树的损失为
如果我们以有工作为叶子节点,剪去以下的枝,此时,最左端结点熵不变
右端无房结点中的样本有两类分别为是和否,是的样本有3个,否的样本有6个,其熵为
此树的损失为
此时就要考虑树的复杂度和树的精度的平衡了,以此通过来决定是否剪枝
四、CART算法
相比于决策树的分类模型,CART算法输入随机变量后返回的是
的条件概率分布,可以用于回归也可以用于分类。
CART假设决策树是二叉树,内部结点的选择只有是与否。
CART算法而言,对回归树用平方误差最小化准则,对分类树采用基尼指数(Gini index)最小化准则。
4.1回归树
分别为输入,输出变量,且
是连续变量,给定数据集
回归树将样本空间进行划分,并且对于每一个划分赋予一个值
回归模型表示为
上式中,表示回归树,
表示某一样本,
表示
属于空间
的隶属度;
回归模型含义为,样本回归结果为其隶属于不同划分的加权求和
我们用表示误差
上的权值
的最优值为
,其是所有输入实例
的输出
的均值
对于空间划分采用启发式方法,对第个变量
和取值
作为切分变量(splitting variable)和切分点(splitting point),定义区域
求解
通过计算,其中,是
中
的均值点,上式旨在寻找最优特征及切分点
寻找出特征和切分点后,计算区域的权值
4.2分类树
介绍分类树之前,先介绍一下基尼指数的概念
分类问题中,假设有类,样本属于第
类的概率为
,概率分布的基尼指数定义为
二分类问题中,基尼指数
实际问题中,我们以样本出现的频率来代替概率
显然,当类别越多且样本越分散(每一类的概率都趋于0)的时候,基尼系数越大
基尼系数和熵类似,都是描述系统不确定程度的指标
当样本集合能被某一特征
的某一取值切分成两部分
时,在特征
下集合
的基尼指数为:
图中展现了三种指标之间的关系,趋势大致一致
生成CART树,首先取不同取值对特征进行切分,在所有的特征和切分中选取基尼指数最小的一项作为最优特征和最优切分点,以此往复
看个例子,还是上述贷款的例子:
特征选取年龄这一特征,我们先以是否是青年(
)进行切分
再以是否是中年()与是否是老年(
)进行切分
由此都可以做为切分点
观察的基尼指数
综合来看,选择为最优特征,
为最佳切分点,以此往复。
五、代码部分
from sklearn import tree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
d = np.array([[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 1, 1],
[0, 1, 1, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 0, 1, 2, 1],
[1, 0, 1, 2, 1],
[2, 0, 1, 2, 1],
[2, 0, 1, 1, 1],
[2, 1, 0, 1, 1],
[2, 1, 0, 2, 1],
[2, 0, 0, 0, 0]])
label = ['age', 'job', 'house', 'credit']
data=d[:,0:-1]
target=d[:,-1]
f=pd.concat([pd.DataFrame(data,columns=label),pd.DataFrame(target,columns=['loan'])],axis=1)
clf=tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(data,target)
_ = tree.plot_tree(
clf,
feature_names=label,
class_names=['no','yes'],
filled=True
)
plt.show()