决策树的核心思想就是 if else,实现了 conditional aggregation,关键问题在于分裂的时候哪些特征在前哪些特征在后。从 ID3 开始使用熵(entropy)来做为决策选择的度量。决策树能够作分类,也能够作回归,是一种比较灵活的算法。主要包括 ID三、C4.五、CART,能够做为后续许多 ensemble 方法(例如 random forest 和 gradient boosting decision tree)的基础模型。算法
能够把决策树模型从 if else 的角度拆解为 G(x) = ΣTt=1 qt(x)*gt(x) ,其中 qt(x) 表示条件、gt(x) 表示基本假设。从递归角度来拆解,G(x) = ΣCc=1 [b(x) = c]*Gc(x),其中 b(x) 表示分支条件,Gc(x) 表示子树。dom
决策树模型的原则就是每次决策过程越简单越好,很相似人作决策的过程,可解释性强。函数
熵spa
度量随机变量的不肯定性,越混乱熵越大。H(X) = - ∑ p(xi) * log(p(xi)) ,其中 p(xi) b表示随机变量 X 取值到 xi 的几率,熵要对 X 全部可能的取值求和。例如一枚均匀硬币抛一次,正面朝上的次数为 X,那么 H(X) = - 0.5log(0.5) - 0.5log(0.5) = log2。另外定性的分析,均匀的状况下不肯定性最大,因此 H(X) = log2 其实也是这个问题中熵的最大值。rest
对于两个随机变量:blog
联合熵 H(X, Y) = - ∑ p(xi , yi) * log(p(xi , yi)) 排序
条件熵 H(X | Y) = - ∑ p(xi , yi) * log(p(xi | yi)) = Σ p(yj) * H(X | yj) ,度量在知道 Y 之后 X 的剩下的不肯定性递归
互信息(信息增益) I(X , Y) = H(X) - H(X | Y) , 度量在知道 Y 之后 X 的不肯定性的减小程度ci
ID3 决策树it
用信息增益的大小来选择哪一个特征来用于决策树中当前节点的分裂,递归地构建决策树,直到全部特征的信息增益均很小或没有特征能够选择为止。ID3 至关于用极大似然法进行几率模型的选择。
算法流程:
1. 初始化信息增益的阈值 ε
2. 若是样本都属于同一类 Di ,则返回单节点树 T,类别标记为 Di
3. 若是特征为空则返回单节点树 T,类别直接标记为样本中数量最多的类别
4. 计算 A 中全部维度的特征(n 维)对输出 D 的信息增益 I(D, A) = H(D) - H(D | A),选择信息增益最大的特征 Ag 分裂。若是 Ag 的信息增益小于设定的阈值,返回单节点树,类别直接标记为样本中数量最多的类别;不然按 Ag 的全部不一样取值 ai 把样本集 D 分割成若干类别的非空子集 Di ,每一个类别产生一个子节点,对应特征值为 Agi ,类别标记为 Di 中实例数最大的类别。返回增长了节点的树 T
5. 对全部的子节点,令 D = Di,A = A - { Ag},递归调用 2-4,获得子树 Ti 并返回
ID3 决策树存在的问题:
1. 只有树的生成,容易过拟合。
2. 没有考虑连续特征
3. 信息增益做为选择特征的标准存在问题(相同条件下,取值比较多特征信息增益大)
4. 无法处理缺失值
C4.5 决策树
如何改进 ID3:
1. 引入正则化系数初步剪枝
2. 将连续特征离散化。好比 N 个样本的连续特征取值有 N 个,就取相邻两点取值的平均数做为划分点,一共获得 N-1 个划分点。对全部的划分点,分别计算以该点做为二分类点时的信息增益比,选择最大的做为该连续特征的二元离散分类点
3. 用信息增益比。IR(D, A) = I(D, A) / HA(D),其中 HA(D) 是 D 关于 A 的熵,HA(D) = - Σni=1 |Di|/|D| * log(|Di|/|D|),n 是特征 A 取值的个数
4. 缺失值的处理
样本缺失某些特征的状况下如何选择划分:对于某一个有缺失值的特征 A,将数据分红两部分,对每部分样本设置一个权重(初始能够都为1),而后划分数据,一部分是有特征值 A 的数据 D1 ,一部分是没有特征值 A 的数据 D2 。而后对 D1 来和对应的 A 特征的各个特征值一块儿计算加权后的信息增益比,最后乘上系数 ε, ε 为 D1 样本加权后所占加权总样本的比例
选定了划分属性,对于该属性上缺失特征的样本如何处理:能够把缺失特征值的样本同时划分入全部的子节点,同时将该样本的权重按各子节点的样本容量比例来分配。
C4.5 决策树存在的问题:
1. 仍是须要后剪枝
2. 多叉树不如二叉树效率高
3. 只能作分类
4. 大量对数运算耗时,若是是连续特征还会有大量排序运算
CART 决策树
比较优的一种决策树,既能作分类也能作回归,基于二叉树结构,也支持对连续特征的处理和对缺失值的处理,采用后剪枝有效解决过拟合。驱动思想就是,要加权考虑分割后两边的数据都各自比较“纯”(如何衡量?均方偏差或基尼指数)。若是 serving 的过程当中样本缺失某个维度的特征,就找一个 surrogate 来代替缺失的特征(训练的时候为每一个特征的分割找一些替代特征的分割,要和原来的切割方式越接近越好)。
基尼指数
在分类问题中,假设有 K 个类别,样本点属于第 k 类的几率为pk ,则几率分布的基尼指数定义为
Gini(p) = ΣKk=1 pk (1 - pk) = 1 - ΣKk=1 (pk)2
对于给定的样本 D,假设有 K 个类别,第 k 个类别的数量为 Ck ,则样本 D 的基尼指数为
Gini(D) = 1 - ΣKk=1 ( |Ck|/|D| )2
能够看出基尼指数和熵之半很接机,均可以用来近似分类偏差率,但基尼指数中的二次运算比对数运算简单的多。
CART 分类树对连续特征和离散特征的处理
对于连续特征,也是离散化,和C4.5相同。区别在于使用基尼指数做为选择划分点的度量(decision stump),以及若是当前节点为连续属性,该属性后面还能够参与子节点的产生选择过程。
对离散特征的处理就是不停的二分离散特征,例如特征 A 有 A一、A二、A3 三种类别,CART 分类树会选择{A1}和{A2, A3}、{A2}和{A1, A3}、{A3}和{A1, A2}中基尼指数最小的组合(decision subset)。因为没有把 A 特征的取值彻底分开,后面还有机会在子节点继续选到 A 来划分。这和 ID三、C4.5 直接构建多叉树一次彻底分开特征不一样。
CART 分类树算法流程:
从根节点开始,递归地构建 CART 决策树
1. 对当前节点的数据集合 D,若是样本容量小于阈值或没有特征,则返回决策子树,当前节点中止递归
2. 计算 D 的基尼指数,若是小于阈值则返回决策子树,当前节点中止递归
3. 计算当前节点现有的各个特征的各个特征值对 D 的基尼指数,选择最小基尼指数最小的特征 A 和对应的特征值 a,并据此把数据集划分为两部分 D1 和 D2,同时创建当前节点的左右节点,左节点数据集为 D一、右节点为 D2
4. 对左右节点递归调用 1-3,生成决策树
能够发现 CART 处理多分类是很容易的。
CART 回归树
和分类树相比,连续特征处理方法不一样、决策树创建后作预测的方式不一样。其余和 CART 分类树相同
回归树的度量目标是,对于任意划分特征 A,对应的任意划分点 s 两边划分红的数据集 D1 和 D2,求出使 D1 和 D2各自集合的均方差最小、同时 D1 和 D2 的均方差之和最小所对应的特征和特征值划分点:
其中,c1 为 D1 的样本输出均值,c2 为 D2 的样本输出均值。
构建完决策树后,用最终叶子的均值或中位数来作预测。
CART 决策树的剪枝
回归树剪枝用均方差度量损失,分类树剪枝用基尼指数度量损失。至关于一种正则化。
剪枝过程当中,对任意的一颗子树 T, 参数为 α 的总体损失函数为:Cα(T) = C(T) + α|T|,其中 C(T) 是对训练数据的预测偏差,|T| 为叶节点个数,参数 α 衡量训练数据的拟合程度与模型复杂度。对于固定的 α ,必定存在使 Cα(T) 最小的子树(当 α 大的时候最优子树 Tα 偏小,α 小的时候最优子树 Tα 偏大。极端状况 α = 0,总体树最优;α = ∞,根节点构成的单节点树最优)
对于总体树 T0 任意的内部节点 t,以 t 为单节点树的损失为 Cα(t) = C(t) + α ;以 t 为根节点的子树 Tt 的损失为 Cα(Tt) = C(Tt) + α|Tt|
当 α = 0 或充分小时,有不等式 Cα(Tt) < Cα(t) ;当 α 增大时,在某一个 α 有 Cα(Tt) = Cα(t) ;再增大时 Cα(Tt) > Cα(t)
只要 α = (C(t) - C(Tt))/ (|Tt| - 1), t 和 Tt 有相同的损失值,而 t 的节点更少,所以 t 比 Tt 更可取,对 Tt 剪枝。为此,对 T0 中对每个内部节点 t ,计算 g(t) = (C(t) - C(Tt))/ (|Tt| - 1),表示剪枝后总体损失函数减小的程度。在 T0 中剪去 g(t) 最小的 Tt ,将获得的子树做为 T1 ,同时将最小的 g(t) 设为 α1。则 T1 为区间[α1, α2) 的最优子树。如此剪枝下去直到获得根节点。在这个过程当中不断增长 α 的值产生新的区间。
利用独立的数据集进行交叉验证,在 T0, T1, ..., Tn 中选出均方偏差或基尼指数最小的最优子树,同时对应的 α 也就肯定了,即找到 Tα。
CART 决策树剪枝流程:
1. 设 k = 0, T = T0
2. 设 α = ∞
3. 自下而上地对各内部节点 t 计算 C(Tt) ,|Tt| ,以及 g(t) = (C(t) - C(Tt))/ (|Tt| - 1) ;α = min(α, g(t))
4. 对 g(t) = α 的内部节点 t 进行剪枝,并对叶节点 t 以多数表决法决定类别(分类)或取值全部样本输出均值(回归)
5. 设 k = k+1,αk = α , Tk = T
6. 若是 Tk 不是由根节点及两个叶节点构成的树,则回到步骤2;不然令 Tk = Tn
7. 交叉验证法在子树 T0, T1, ..., Tn 中选取最优子树 Tα
CART 决策树存在的问题:
1. 每次分裂决策由一个最优的特征线性组合来决定,可能会更合理(OC1)
2. variance 比较大(样本改动一点点,树结构可能变化剧烈),能够经过 bagging 来改善
3. 寻找最优的决策树是一个 NP hard 问题,通常是采用启发式,但容易陷入局部最优,能够用 ensemble 改善