输入:训练集D={(x1,y1),(x2,y2),...,(xm,ym)}D={(x1,y1),(x2,y2),...,(xm,ym)}, 属性集A={a1,a2,...,ad}A={a1,a2,...,ad}
过程:函数TreeGenerate(D, A)
生成节点`node`
if D中样本全属于同一类别C:
将node标记为C类叶节点
return
if A is 空集 or D中所有样本在A上取值相同:
将node节点标记为叶节点,其类别标记为D中样本数最多的类
return
从A中选择最优划分属性a*
for a*v in a*:
为node生成一个分支;令Dv表示D中在a*上取值为a*v的样本子集
if Dv is 空:
将分支节点标记为叶节点,其类别标记为D中样本最多的类
return
else:
以TreeGenerate(Dv, A\{a*})为分支节点
输出:以node为根节点的一颗决策树
决策树是一个递归过程,有三种情况会导致递归返回:
- 当前节点包含的样本属于同一类别,无需划分
- 当前属性集为空或所有样本在所有属性上取值相同,无法划分
- 当前节点包含的样本集合为空,无法划分
由上述算法的伪代码可以看出,决策树构造最重要的环节就是如何选择划分的属性:
- 信息增益(ID3)
- 信息增益率(C4.5)
- 基尼系数(CART)
ID3
信息熵:样本集合D中第k类样本所占比率为pk,(k=1,2,...,f)pk,(k=1,2,...,f),则该样本的信息熵
属性a对样本D进行划分后的信息熵:
假设属性a有V个可选值,则a将D切成V个子样本D1,D2,…,DV。则划分后的信息熵
其中|Dv||Dv|表示子样本DvDv的个数
对样本D划分属性a的信息增益:
每次划分我们都选择信息增益最大的那个属性
C4.5
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好带来的不利影响,C4.5算法使用增益率来进行属性划分
属性a的固有值:
属性a的可能取值数目越多,则固有值越大。
增益率:
需要注意的是,增益率准则对可取值数目较少的属性有所偏好,所以C4.5算法不是直接取增益率最大的候选划分属性,而是:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的
CART算法
数据集D的基尼系数:
直观来说,基尼系数反映了从数据集中抽取两个样本,其类别不一致的概率。因此,基尼系数越小,则数据集纯度越高
我们在选属性时,选择那个使得划分后基尼指数最小的属性作为最优属性划分
数据集D的基尼系数:
直观来说,基尼系数反映了从数据集中抽取两个样本,其类别不一致的概率。因此,基尼系数越小,则数据集纯度越高
我们在选属性时,选择那个使得划分后基尼指数最小的属性作为最优属性划分
剪枝处理
剪枝是决策树学习算法对付过拟合的主要手段。
剪枝可分为预剪枝和后剪枝两种基本策略。
- 预剪枝:预剪枝是指在决策树的生成过程中,对每个节点在划分前后进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶节点。
- 后剪枝:先从训练集生成一颗完整的决策树,然后自底而上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树的泛化性能提升,则将该子树替换为叶节点。
连续值与缺失值
连续值处理
对于连续的属性,可取值不可数,因此不能直接用连续属性的取值来对节点进行划分。此时就需要将连续属性离散化。最简单的策略就是二分法(C4.5采取的就是这种机制):
- 将连续属性a的所有n个取值升序排列
- 相邻两个取值的均值可作为候选划分点,则有n-1个候选划分点
- 从这n-1个候选划分点选一个最好的:计算这n-1个候选划分点划分后的信息增益,选择信息增益最大的那个候选划分点作为属性a的划分点
缺失值处理
现实任务中,经常会遇到数据不完整的情况,尤其是属性较多的时候,会有大量样本出现缺失值。
我们需要解决两个问题:
- 如何在属性缺失的情况下进行划分属性选择
- 给定划分属性,如何对带缺失属性的样本进行划分
对问题一:
给定训练集D和属性a,计算D中属性a不缺失的子集D’所占比例p
Gain(D,a)=p∗Gain(D′,a)Gain(D,a)=p∗Gain(D′,a)
Gain(D′,a)Gain(D′,a)则把D’当成D,按之前的标准来计算即可
对问题二:
若样本x在属性a上的取值未知,则将x同时划入所有子结点,且样本权值调整为r*w, 其中r为D’中各个属性个数的比例,w为样本在当前子结点的权值(初始权值均为1)
多变量决策树
OC1等 TODO
增量学习 TODO
- ID4
- ID5R
- ITI