决策树是比较容易的理解的机器学习算法,算法学习过程就是利用数据的属性构造树的过程,根据构建的树,逐步向下决策,最后得到结果。决策树利用树结构进行决策,和人类理解决策问题时的思路很像,比如对于”是否要买下这套房子?”这样的决策问题,人类会思考“地段位置好吗?”。位置好,那再看“房子的价格可以接受吗?”。可以接受,“房子面积够用吗?”……经过一些列的决策判断之后,才会决定买/不买这套房子。
1. 决策树的构建过程
 emsp;决策树既然采用了树结构,那么就会包含树的根节点,若干中间节点和叶节点,而树的构建过程是一个递归的过程。决策树算法构建树的流程可以表示如下:
输入:训练集
属性集
树生成过程: TreeGenerate( )
1. 生成节点node
2. if 中的样本都是同一个类别
3. 将node标记为叶节点,类别为
4. return
5. if 为空 or 中的样本在各个属性上的取值都一样
6. 将node标记为叶节点,类别为 中样本最多的类
7. if 为空
8. 将node标记为叶节点,类别为父节点的类
9. 从 中选择最优划分属性 对节点进行划分, 的每一个属性值 划分一个分支
10. for
11. 生成一个分支,分支的属性集合为 ,数据集合为 ,表示 中在 上取值为 的所有样本
12. TreeGenerate( )
13. 输出:一颗决策树
其中,属性集有 个和样本 的维度是保持一致的。
决策树的构建过程是很明显的递归流程,包括递归返回条件和分而治之的思想。在决策树的构建中,很关键的是如何选择最优划分属性,依据什么准则来选择当前状况下的最优划分属性呢?最直接的想法是希望每次划分,都尽可能使得各个分支节点的样本属于同一个类。那么如何用数学语言描述这个想法呢?决策树一般采用信息增益、增益率和基尼指数。
2. 信息增益
信息增益是比较采用某属性进行划分的前后,信息熵的变化,选择使信息熵变化最大的属性作为当前的最优划分属性。信息熵是度量样本纯度的常用指标。
假定当前样本集合为
,每类样本
占总样本比例为
(
,假设集合
上共有
个类别)。则定义信息熵为:
信息熵的值越小,则样本集 的纯度越高,即大多样本都属于同一个类。比如在所有样本都是同一个类时, 要么是0,要么是1,则 。
针对属性 进行划分( 共有 种取值),划分 个分支,每个分支的样本集合为 。则信息增益为:
考虑根据样本数对 个分支加上权重,样本数越多,权重越大,则信息增益重新表示为:
其中, 表示数据集 中样本的数量。因此,对于属性的选择,就是选择使得 最大的属性,如下。著名的 决策树就是以信息增益为准则来选择最优划分属性。
3. 增益率
分析信息增益会发现,如果某个属性包含较多的属性值,那么就会把数据集划分为很多个子集,那么每个子集的样本数量就会相对较少,信息熵也就会较小。因此取值数目越多的属性,越可能被选择为最优划分属性。即信息增益准则偏好于取值数目较多的属性。
为了削弱信息增益对取值较多属性的偏好,可以使用增益率作为选择最优划分属性的准则。增益率的定义为:
其中, 。 有点像求划分子集的熵,跟属性密切相关,且属性 的取值越多, 越大,那么就有效的抑制了信息增益对取值较多属性的偏好。
决策树算法综合使用信息增益和增益率。首先确定信息增益高于平均水平的属性,再从中选择增益率最大的。
4. 基尼指数
使用基尼指数值来表示数据集
的纯度。
表示从 中随机抽取两个样本类别标记不一致的概率。 越小,数据的纯度越大。而基尼指数表示为:
通过选择使基尼指数最小的属性。
5. 剪枝
在决策树中,为了追求在训练集上更高的准确率,会导致整棵树枝繁叶茂。这样很容易造成模型过拟合,在训练集上表现很好,而在测试集上的准确率却不高。
剪枝是决策树中常用的解决过拟合的手段,包括预剪枝和后剪枝两种策略。预剪枝是在构造决策树时,根据该次划分能否带来泛化性能的提升决定是否执行此次划分,即阻止分枝的生成。后剪枝则是先生成一颗完整的决策树,而后从叶节点开始回溯,考察每个中间节点,若将某个中间节点修改为叶节点可以提升泛化性能,那么将该中间节点替换为叶节点,即剪掉节点下的所有分枝。
不管是预剪枝还是后剪枝,都涉及泛化性能验证的问题,因此需要将数据分为训练集和验证集,使用训练集构建决策树,而使用验证集评估模型的泛化性能。
5.1 预剪枝
在决策树的构建过程中,利用验证集评估当前构建的决策树的准确率,即根据当前最优属性划分后的决策树的准确率。若执行此次划分前的准确率小于划分后的准确率,则执行此次划分,否则不划分。在预剪枝中,当前的划分可能不会提升准确率,但是后续在该划分下的发展,则可能会达到更高的准确率,但是预剪枝策略直接忽略掉了这种可能性,因此预剪枝策略可能会导致模型欠拟合。
5.2 后剪枝
构建好决策树之后,从最底层开始层序遍历决策树。对于非叶节点,利用验证集评估基于该结点进行划分和不划分的准确率,若不划分的准确率高于划分的准确率,则将该节点置为叶节点。
6. 连续属性取值
在决策树的构建中,选择属性划分分枝时,是把属性的所有可能取值作为分枝,这对离散取值的属性是可行的,但对于连续取值的属性应该怎么办呢?
将连续取值离散化是解决该问题的方法。假设
上的数据在属性
上的取值连续,但是数据集中的样本数是有限的,把所有样本在属性
上的值排序
。以所有相邻取值的中间点作为分界点
,可以把
分为两部分,在选择最优划分属性时,把分界点
也作为需要选择的属性之一。因此,分界点
丰富了属性集合,同一属性的不同分界点也可以作为最优的划分规则,因此在有连续值属性的决策树中,相同的属性可能多次出现在决策树中。
对于信息增益而言,
7. 随机森林
随机森林(random forest, RF)可以简单的理解为决策树的组合,“”树(决策树)多了就成了林(随机森林)”。随机森林是集成学习策略bagging在决策树上的应用(关于集成学习更多的了解参见我的博客集成学习),它使用决策树作为基学习器,但对决策树的构建略有改动,即在决策树的构建过程中,对属性的选择引入了随机扰动。
在随机森林算法中,a. 首先是基于自助采样法(自助采样法请参见我的博客机器学习中的模型评估与度量)得到 组训练样本。b. 针对每一组训练样本构建一棵决策树。但在随机森林中,对决策树中的每一个节点,并不是直接选择最优属性进行划分,而是先从该节点的属性集中随机选择包含 个属性的子集,再从这个子集中选择最优属性进行划分(推荐选择 , 表示当前节点的总属性条目)。c. 得到 棵决策树,通过bagging策略,即多数投票的方式做最后的决策。