决策树
既可以应用于分类问题,也可以应用于回归问题。
应用
优点
- 非线性
- 交叉效应
- 稀疏性
缺点
- 不稳定
- 表现力较差
- 精度不足
伪代码
def TreeGenerate(D, A):
生成节点node
if D中样本全属于类别C:
将node标记为C类叶节点
return
if A = ∅ or D中样本在A上取值相同:
将node标记为D中样本数最多的类叶节点
return
从A中选择最优划分属性a
for a_v in a:
为node生成一个分支;令Dv表示D中在a上取值为a_v的样本子集
if Dv = ∅:
将node标记为D中样本数最多的类叶节点
else:
以TreeGenerate(Dv, A\{a})为分支节点
三种终止递归条件:
- 当前节点包含样本属于同一类,无需划分
- 当前属性集合为空,或所有样本在所有属性上取值相同,无法划分
- 当前节点包含的样本集合为空,不能划分
划分选择
信息增益 Info Gain
p k p_k pk 是k类别在整体中所占比例。
信息熵 E n t ( D ) = − ∑ k = 1 K p k l o g 2 ( p k ) Ent(D) = -\sum_{k=1}^K p_klog_2(p_k) Ent(D)=−∑k=1Kpklog2(pk)
信息熵的值越小,D的纯度越高。假设离散属性a有V个可能的取值, a 1 , a 2 , . . . , a V {a_1, a_2,..., a_V} a1,a2,...,aV, 若使用a来对样本D进行划分,会产生V个分支节点。计算属性a对样本集D进行划分得到的信息增益。
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V D v D E n t ( D v ) Gain(D, a) = Ent(D) - \sum_{v=1}^V \frac{D_v}{D} Ent(D_v) Gain(D,a)=Ent(D)−∑v=1VDDvEnt(Dv)
ID3决策树算法就是用信息增益为准则来选择划分属性。但是这种算法对可取值数目较多的属性有所偏好。
增益率 Gain Ratio
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain\_ratio(D, a) = \frac{Gain(D, a)}{IV(a)} Gain_ratio(D,a)=IV(a)Gain(D,a)
其中 I V ( a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a) = \sum_{v=1}^V \frac{|D_v|}{|D|}log_2\frac{|D_v|}{|D|} IV(a)=∑v=1V∣D∣∣Dv∣log2∣D∣∣Dv∣被称为a的固有值。
C4.5决策树算法利用增益率来选择最优划分属性。
基尼指数 Gini Index
Gini(D)反映从数据集D中随机抽取两样本,其类别标记不一致的概率。因此Gini(D)越小,数据集D的纯度越高。
Gini impurity G i n i ( D ) = 1 − ∑ k = 1 K p k 2 Gini(D) = 1 - \sum_{k=1}^K p_{k}^2 Gini(D)=1−∑k=1Kpk2
属性a的基尼指数 $ Gini_index(D, a) = \sum_{v=1}^V \frac{|D_v|}{|D|}Gini(D_v)$
选择使得划分后基尼指数最小的属性 a ∗ = a r g m i n a ∈ A G i n i _ i n d e x ( D , a ) a^* = arg min_{a \in A} Gini\_index(D, a) a∗=argmina∈AGini_index(D,a)
sklearn中使用的CART算法就是用Gini impurity做指标。
精度提升方法
剪枝处理是缓和过拟合的主要手段。基本策略有预剪枝和后剪枝。
预剪枝
在决策树生成过程中,若当前节点的划分不能带来泛化性能提升,则停止划分。预剪枝使得决策树的很多分支都没有展开,降低了过拟合风险,减少了训练和测试时间。不过,有些分支的当前划分虽不能提升泛化性能,但是在其基础上进行的后续划分却有可能导致性能显著提高,带来了欠拟合的风险。
后剪枝
训练集生成的一棵完整决策树自下而上对节点进行考察,如果该节点对应子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点。欠拟合风险很小,不过训练时间要比不剪枝大得多。
连续值
连续属性离散化。最简单的策略就是采用二分法。给定样本集D和连续属性a,将该属性所有值排序。基于划分点t可将D分为 D t − D^-_t Dt−和 D t + D^+_t Dt+。之后我们可以计算信息增益来确定合适的分割点。
需要注意的是,与离散属性不同,若当前节点划分属性是连续属性,该属性还可作为其后代节点的划分属性。
缺失值处理
给定训练集D和属性a,用 D ~ \widetilde D D 表示D中在属性a上没有缺失值的样本。为了解决在有属性值缺失的情况下进行属性划分,可以给每一个样本x赋予一个权重 w x w_x wx。
ρ = ∑ x ∈ D ~ w x ∑ x ∈ D w x \rho = \frac{\sum_{x \in \widetilde D}w_x}{\sum_{x \in D}w_x} ρ=∑x∈Dwx∑x∈D wx表示无缺失值样本所占比例
p ~ k = ∑ x ∈ D ~ k w x ∑ x ∈ D ~ w x \widetilde p_k = \frac{\sum_{x \in \widetilde D_k}w_x}{\sum_{x \in \widetilde D}w_x} p k=∑x∈D wx∑x∈D kwx表示无缺失值样本中第k类所占比例
r ~ v = ∑ x ∈ D ~ v w x ∑ x ∈ D ~ w x \widetilde r_v = \frac{\sum_{x \in \widetilde D_v}w_x}{\sum_{x \in \widetilde D}w_x} r v=∑x∈D wx∑x∈D vwx表示无缺失值样本中在属性a上取值是 a v a_v av的样本所占比例
我们可以将信息增益的计算式推广成
G a i n ( D , a ) = ρ ∗ E n t ( D ~ ) − ρ ∗ ∑ v = 1 V r ~ v E n t ( D ~ v ) Gain(D, a) = \rho * Ent(\widetilde D) - \rho* \sum_{v=1}^V \widetilde r_v Ent(\widetilde D_v) Gain(D,a)=ρ∗Ent(D )−ρ∗∑v=1Vr vEnt(D v)
为了解决特定样本在该属性上的值缺失时的样本划分问题,让这个样本以不同的概率划入到不同的子节点中去。
多变量决策树
可以对分类边界进行不是沿着平行轴的方向进行划分的或者进行其他复杂划分的决策树。
Reference
- 《美团机器学习实践》by美团算法团队,第三章
- 《机器学习》by周志华,第三、四章
- 白板推导系列,shuhuai007