决策树就是将经验进行总结,在做决策树的时候,会经历两个阶段:构造和剪枝。
构造的过程就是选择什么属性作为节点的过程,分为根节点、内部节点和叶节点,节点之间存在父子关系。
剪枝就是给决策树瘦身,实现目标是,不需要太多判断也能得到不错的结果,是为了防止“过拟合”现象的发生。
左侧为欠拟合,右侧为过拟合。
造成过拟合的原因之一是训练集中样本量较小。,决策树选择的属性过多,模型的“泛化能力”差。
剪枝可以分为“预剪枝”和“后剪枝”。
预剪枝:在决策树构造过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,即划分没有意义,则当前节点为叶节点。
后剪枝:在生成决策树之后进行剪枝,从叶节点开始,逐层向上进行评估,如果剪掉子节点树,在分类准确性上差别不大,或是能带来准确性的提升,就可以进行剪枝,用子树叶子节点代替,类标记为子节点树最频繁的那个类。
例:如何判断是否去打篮球
打篮球的数据集如下:
接下来构造决策树。
1、将哪个属性作为根节点。
有两个指标:纯度和信息熵。
(1)纯度
决策树的构造过程即为寻找纯净划分的过程,纯度,就是让目标分量的分歧最小。
例如:
集合1:六次都去打篮球;
集合2:四次去,两次不去;
集合3:三次去,三次不去。
按纯度指标来说,集合1>2>3。
(2)信息熵
信息的不确定度。
公式如下:
某个事件的不确定性越大时,所包含的信息量就越大,信息熵就越高。
例如:
集合1:五次去打篮球,一次不去;
集合2:三次去,三次不去。
假设,类别1为打篮球,类别2为不去,则根据信息熵公式可计算出,集合1信息熵为0.65,集合2信息熵为1.
即,信息熵越大,纯度越低。当集合中的样本均匀混合时,信息熵最大,纯度最低。
构造决策树,根据纯度来构建,经典“不纯度”的指标有三种:信息增益(ID3算法)、信息增益率(C4.5算法)以及基尼指数(Cart算法)。
1、ID3算法
信息增益就是划分可以带来纯度的提高,信息熵的下降。计算公式是:父亲节点的信息熵减去所有子节点的归一化信息熵,信息增益的公式为:
例如:
D为晴天,D1为刮风,D2为不刮风。
则D作为节点的信息增益为:
基于ID3的算法原则,完整计算此数据集,训练集中的7个数据,3个打篮球,4个不打,所以根节点的信息熵为:
若以天气作为属性的划分,则三个节点的信息熵为
D1晴天,D2阴天,D3小雨。
则它们作为子节点的归一化信息熵为:3/70.918+2/71.0+2/7*1.0=0.965;
则,天气作为属性节点的信息增益为,Gain(D,天气)=0.985-0.965=0.020
同理,可计算以其他属性作为根节点的信息增益:
Gain(D,温度)=0.128
Gain(D,湿度)=0.020
Gain(D,刮风)=0.020
可以看出,温度作为属性的信息增益最大,由于在ID3算法中,以增益最大的属性作为父节点,可以得到纯度高的决策树
然后将D1{1-,2-,3+,4+}进行进一步分裂,完整的决策树如下:
ID3算法规则相对简单,但倾向于选择取值比较多的属性,有些属性对分类任务没有太大作用,仍然可能被选为最优属性。
在ID3算法基础上进行改进的C4.5算法
1、采用信息增益率选择属性;
2、采用悲观剪枝提升泛化能力;
3、离散化处理连续属性;
4、处理缺失值。
ID3算法:方法简单,但对噪声敏感,训练数据若有少量错误,可能会造成分类错误。
C4.5在ID3的基础上,用信息增益率代替信息增益,解决了噪声敏感的问题,而且可以对构造树进行剪枝、处理连续数值及数值缺失等情况,但需要对数据集进行多次扫描,算法效率相对较低。
总结:
思考题:
用ID3算法给出好苹果的决策树。
根节点的信息熵:Entropy(D)=1
以“红”作为属性划分,子节点的归一化信息熵为:0,信息增益为:1-0=1
以‘大’作为属性划分,子节点的归一化信息熵为:1,信息增益为1-1=0
因此,选择“红”作为父节点,纯度很高,不需要再进行划分。
CART,一棵是回归树,另一棵是分类树。
Classification And Regression Tree, 分类回归树。
ID3和C4.5算法既可生成二叉树,又可以生成多叉树,而CART算法只支持二叉树。
分类树与回归树
用该数据构造决策树,若基于数据判断职业身份,就属于分类树,因为是从几个类别中进行选择。若给定数据预测这个人的年龄,那就是回归树。回归树可以处理离散的数据,输出样本类别,而回归树可以对连续型的数据进行预测,输出数值。
CART分类树的工作流程
决策树的核心是寻找纯净的划分,CART属性选择的指标是基尼系数。基尼系数反应了样本的不确定度,基尼系数越小,则样本间的差异越小,不确定程度低。分类的过程是不确定度降低的过程。选择基尼系数最小的属性作为属性划分。
基尼系数
假设t为节点,则改节点的基尼系数计算公式为:
即节点系数t的基尼系数是1减去t属于各类别的概率的平方和。
例子:
集合1:6个都去打篮球;
集合2:3个去,3个不去。
则集合1的基尼系数为1-1=0,集合2的基尼系数为1-(0.50.5+0.50.5)=0.5,即集合1的基尼系数小,样本较稳定。
基于基尼系数,对特征属性进行二元分裂:
D的基尼系数等于子节点D1和D2的归一化基尼系数之和,即
则节点D的基尼系数为0.25。
用CART算法创建分类树****
在python的sklearn中,可以使用DecisionTreeClassifier类,默认情况下criterion参数为gini,即默认采用CART分类树。
基于iris数据集,构造CART分类树代码如下:
import sklearn as skl
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
#准备数据集
iris=load_iris()
#获取特征集和分类标识
features=iris.data
labels=iris