机器学习实战——决策树算法
初识决策树:
决策树是一种基本的分类与回归方法,它可以被认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。
决策树学习通常需要3个步骤:特征选择,决策树的生成,决策树的修剪。主要方法有ID3,C4.5以及CART算法。
一、决策树基本概念
1.什么是决策树?
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由节点(node)和有向边(directed edge)组成,节点有两种类型:内部节点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子节点,这时,每一个子节点对应着该特征的一个取值,递归的对实例进行测试并分配,直至达到叶节点。最后将实例分到叶节点的类中。
2.如何进行决策树学习?
本质上,是归纳出一组分类规则,由训练数据集估计条件概率模型,我们选择的条件概率模型应该不仅是对训练数据有很好的拟合作用,而且对未知的数据能有很好的预测。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得每个子数据集有一个很好地分类过程。这一过程对应着特征空间地划分以及决策树的构建。
开始,构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按照这一特征将训练数据集分割成子集,使得每个子集有一个在当前条件下最好的分类;
如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点中去;如果还有子集不能被基本正确分类,那么对这些子集选择新的最优特征,继续对其分割,构建相应的节点;
递归,形成决策树。
以上方法可能出现过拟合现象,需要进行自下而上的剪枝,将树变得简单,从而使它具有泛化能力。即:去掉过于细分饿叶节点,使其回退到父节点,甚至更高的叶节点,然后将父节点或者更高的节点改为新的叶节点。
如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。决策树的生成只考虑局部最优,相对的,决策树的剪支则考虑全局最优。
3.特征选择
度量标准是信息增益或者信息增益比。
首先介绍一下熵的概念。
熵是表示随机变量不确定性的度量,定义如下:
条件熵表示在已知随机变量X的条件下,随机变量Y的不确定性,定义如下:
当熵和条件熵中的概率由数据估计得到时,就分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
知道了熵的概念,可以定义信息增益的概念,那么如何利用信息增益来进行特征选择呢?信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少程度。对训练数据集(或子集)D,计算其每一个特征的信息增益,比较它们的大小,选择信息增益最大的特征。其中ID3算法使用的是信息增益的方法来进行特征选择。
信息增益比,为什么要用到信息增益比呢?当我们的特征可以选取的值过多的时候,比如选择身份证或者学号来进行分类,这样的分类没有任何意义,我们就应该想到如何对树的分支过多的情况进行惩罚,这样就引入了信息增益比:
在C4.5算法中使用的是信息增益比。
4.决策树的生成
首先介绍ID3算法:
然后介绍C4.5算法,这个算法和ID3类似,只是特征选择的方法不同:
5.决策树的剪枝
决策树的剪枝往往通过极小化决策树整体的损失函数来实现。
剪枝是一个从已生成的树上裁掉一些子树或者叶结点,并将其根结点或父节点作为新的叶结点的过程。
下面介绍一下损失函数:
C(T)表示模型预测误差,衡量了拟合程度;|T|表示模型复杂度。损失函数制衡了拟合程度和模型复杂度之间的平衡。
剪枝的总体目标是令损失函数最小化,因此剪枝算法的基本思想是如果剪枝回缩后损失的函数值比不剪枝更小,那么就剪枝回缩,不然不剪枝。
具体算法为:
二、决策树python实现
#计算香农熵
from math import log
import operator
def calcShannonEnt(dataSet):
numEntries=len(dataSet)
labelCounts={
}
for featVec in dataSet:#遍历dataSet中的每一行
currentLabel=featVec[-1]#每行中最后一个数表示数据的类标签
if currentLabel not in labelCounts