决策树
决策树的小结
第一部分: 熵, 条件熵和信息增益
1. 熵
- 熵的定义和变量的概率分布有关, 和变量本身的值无关, 定义如下: $$ H(X) = - \sum\limits_{i=1}^{n} p_i log p_i \\ \text{其中} P(X=x_i) = p_i, i= 1,2,\cdots, n$$
- $H(X)$的一个主要特点是$x$的分布越平均, 熵越大, 因此熵代表了分布的混乱程度
- 另外, 对数底一般取2或e, 其单位为bit或nat
2. 条件熵
- 假设两个随机变量$(X, Y)$的联合概率分布为$$P(X=x_i, Y=y_j) = p_{ij} \\ |X| = n, |Y| = m$$
- 根据贝叶斯公式, $Y$对于$X$的条件概率为$$ P(Y = y_j | X=x_i) = \frac{P(X=x_i, Y=y_j)}{P(X=x_i)} = \frac{p_{ij}}{p_i}$$
- 那么在给定$X= x_i$的条件下$Y$的条件概率分布的熵为 $$ \begin{align} H(Y | X=x_i) & = - \sum\limits_{j=1}^{m} P(Y = y_j | X=x_i) log P(Y = y_j | X=x_i) \\ & = - \sum\limits_{j=1}^{m} \frac{p_{ij}}{p_i}log \frac{p_{ij}}{p_i} \end{align} $$
- 最后, $H(Y | X=x_i)$对于$X$的数学期望就是$Y$对于$X$的条件熵: $$ H(Y | X) = \sum\limits_{i=1}^{n} p_i H(Y | X=x_i)$$
3. 一个例子
条件熵的概念, 可以通过例子理解
- 假设$X$是某位长者前去魔都的概率分布, 去是1, 不去是0 $$P(X=1) = 0.5, P(X=0) = 0.5$$
- 假设$Y$是魔都天气的概率分布, 1是晴, 0是雨 $$P(Y=1) = 0.5, P(X=0) = 0.5$$
- 也就是说, 去不去看心情, 天气好不好看老天. 然而 $$ P(Y=1 |X=1 ) = 1 \\ P(Y=1 |X=0 ) = 0 \\ P(Y=0 |X=1 ) = 0 \\ P(Y=0 |X=0 ) = 1$$ 也就是说主席一来, 天气晴朗, 主席一走, 立马下雨
- 那么求一下$Y$的条件概率分布的熵 $$H(Y | X=1) = - (\frac{P_{11}}{P_{1}} log \frac{P_{11}}{P_{1}} + \frac{P_{01}}{P_{1}} log \frac{P_{01}}{P_{1}}) = -2 \\ H(Y | X=不去) = - (\frac{P_{10}}{P_{0}} log \frac{P_{10}}{P_{0}} + \frac{P_{00}}{P_{0}} log \frac{P_{00}}{P_{0}}) = -2 $$
- 最后得到条件熵 $$ H(Y | X) =p_1 H(Y | X=1) + p_0H(Y | X=0) = -2$$
- 总结一下, $H(X) = H(Y) = 1$, 然而$H(Y | X) = -2$, 也就是在主席到来的约束下, $Y$的条件熵下降了, 也就是天气分布的不确定性下降了, 可见主席来不来对天气好坏是有很大影响的
4. 信息增益
信息增益表示得知特征$X$的信息而使得类Y的信息的不确定性减少的程度. 拿之前的例子来说, 选择主席是否来这个特征对天气数据集的信息增益为 $$ g(Y, X) = H(Y) - H(Y|X) = 1 - (-2) = 3$$
决策树的特征选择基础就是建立在选择最大信息增益的特征上的.
5. 信息增益比
信息增益的一个缺点是决策树会偏向于选择取值较多的特征. 例如假设每个$X$的取值对应于独一无二的值(item_id类型的数据)有:
$$ \begin{align} H(Y | X=x_i) & = - \sum\limits_{j=1}^{m} P(Y = y_j | X=x_i) log P(Y = y_j | X=x_i) \\ & = - \sum\limits_{j=1}^{m} \frac{p_{ij}}{p_i}log \frac{p_{ij}}{p_i} \\ & = - \frac{1/N}{1/N}log \frac{1/N}{1/N} = 0 \end{align} $$
$$ H(Y | X) = \sum\limits_{i=1}^{n} p_i H(Y | X=x_i) = 0 $$ 条件熵降到了0, 显然信息增益是最大的. 但这样的分类毫无意义, 属于极端过拟合, 为了解决这个问题, 引入信息增益比.
首先由于$X$的划分行为, 导致数据集label$Y$的熵增加了(每一类内部的熵减少了)
$$ H_X(Y) = - \sum\limits^{n}_{i=1} P(X = x_i) log P(X = x_i) $$
$$ g_R(Y, X) = \frac{H(Y) - H(Y|X)}{H_X(Y)} $$
这样一来使用之前的例子, $ H_X(Y) = - n \times \frac{1}{n} log \frac{1}{n} = - log \frac{1}{n} $, $n$越大, 分得越细, 信息增益的分母越大, 信息增益比越小.
第二部分: ID3和C4.5算法
1. ID3
Input: Train set $S$, feature set $A$, tolerance $\epsilon$ Output: Decision Tree $T$
- If $s_i \in C_j$ for all $i$: $label = c_k$, return T
- If $A = \varnothing$: $label=c_j: \max(|c_j|)$, return T
- Else: calculate $g(S, A_i)$ for all $i$, choose $A_g$ in which $g = argmax(g(S, A_i))$
- If $g(S, A_g) < \epsilon$: $label= c_j: \max(|c_j|)$, return T
- Else: Split $S$ into $S_i$ for each $a_i$ in $A_g$, $label_i= c_j: \max(|c_j|), c_j \in S_i$, return T
- For each $a_i$ as a node, train set = $S_i$, feature set = $A - A_g$, run (1) ~ (5) recursively, return $T_i$
2. C4.5
使用 信息增益率替代信息增益. 但信息增益率倾向于选择特征取值较少的, 故用启发式算法: 先选择信息增益高于平均水平的特征,再从中选择信息增益率最高的
第三部分: CART
1. 回归树
- 训练集: $$D = \lbrace (X^{(1)}, y^{(1)}), (X^{(2)}, y^{(2)}), \cdots, (X^{(N)}, y^{(N)}) \rbrace \\ X = (x_1, x_2, \cdots, x_n)$$
- 损失函数: 平方损失函数 $$\sum\limits_i (y^{(i)} - f(X^{(i)}))^2$$
- 划分手段: 对于第$f$个维度的特征$X_f$的某个值$v$(假设特征的值都是离散值), 将所有样本划分为两部分: $$ R_1(f, v) = \lbrace X | X_f \leq v \rbrace \\ R_2(f, v) = \lbrace X | X_f > v \rbrace $$
- 搜索最佳特征$f$和值$v$ $$ \min\limits_{f, v}[\sum\limits_{X^{(i)} \in R_1} (y^{(i)} - \hat c_1 ) + \sum\limits_{X^{(i)} \in R_2} (y^{(i)} - \hat c_2 )] $$ 其中$\hat c_1, \hat c_2$是划分区域内部所有样本的$y^{(i)}$的均值, 这样使得平方误差最小.
2. 分类树
- 基尼指数: 从数据集中随机抽取两个样本, 其数据标记不一样的概率.
- 假设$y$有$K$个类, 每个类有$C_k$个样本, 样本容量为|D|, 基尼指数被定义为: $$ \begin{align} Gini(p) & = \sum\limits^{K}_{i = 1} p_i(1-p_i) \\ & = 1 - \sum\limits^{K}_{i = 1}p_i^2 \\ & = 1 - \sum\limits^{K}_{i = 1} (\frac{|C_i|}{D})^2 \end{align} $$
- 和条件熵一样, 当数据集$D$被某一特征$A$按照是否取某一个值a的规则分割为两个集合$D_1, D_2$时, “条件基尼指数"为: $$ Gini(D, A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2) $$
- CART分类树的构造规则和ID3类似, 选择条件基尼指数最大的特征递归构造
第四部分: 剪枝
1. ID3/C4.5的剪枝
损失函数为: $$ C_{\alpha}(T) = \sum\limits_{t=1}^{|T|} N_t H_t(T) + \alpha|T| $$ 其中$N_t$代表第$t$个叶结点的容量, $H_t(T)$代表第$t$个叶结点的熵, 而$\alpha$即为正则化参数
2. CART的剪枝
- 预剪枝: 比较剪枝前后在验证集上的精度来决定是否剪枝
- 后剪枝: 自下而上替换节点, 欠拟合风险小, 泛化能力优于预剪枝
第五部分: 连续与缺失值处理
1. 连续值: 连续特征离散化
二分法(bi-partition), C4.5使用
- 对特征值排序:{啊,吖,阿,( ⊙ o ⊙ )啊!}
- 取两个样本的中点作为分割点, 一共有n-1个分割点, 找到使得信息增益/率最大的分割点, 作为二分类特征处理
- 与离散特征不同, 连续特征使用过的还可以继续使用
2. 缺失值
- 对每个特征, 只取不缺失的行, 假设占总行数的比例为$\rho$
- 改变信息增益计算方法: 在信息增益上乘以系数$\rho$即可
第六部分: 多变量决策树
使用特征的线性组合作为新的特征, 可以做到斜划分
第七部分: python实现
源代码, 注释施工中