决策树和CART算法的精炼详解(尽可能写到位,不留"论文债")

1 决策树算法

1.1 决策树简介

1.1.1 什么是决策树

  • 决策树主要有二元分支和多元分支.html

  • 决策树是断定树web

    • 内部结点是决策节点: 对某个属性的一次测试
    • 分支: 每条边表明一个测试结果.
    • 叶子: 表明某个类或者类的分布
  • 使用决策树进行判别:算法

    • 决策条件-决策路径-叶子(结果)表明分类
  • 决策树的数学模式解题思路:app

    • 贪心的算法 greedy solution
    • 不是最好的树,全局最优解
    • 当前的树里面找最好的树,局部最优解.

1.1.2 决策树的决策依据

  • 决策树的目标:
    • 最快速完成类别的断定
  • 直观思路
    • 应该凸显这种路径: 最有利作出判别
    • 最大减小在类别断定上的不肯定性
    • 纯度上升的更快,更快速到达纯度更高的集合
  • 怎么选择优先进行决策的断定属性
    • 好的特征是什么原理?
    • 得到更多信息来减小不肯定性
    • 知道的信息越多,信息的不肯定性越小

1.2 信息熵和条件熵

1.2.1 信息熵

1.2.1.1 不肯定性

  • 信息量的度量就等于不肯定性的多少
    • 信息熵高:咱们一无所知的事,就须要了解大量的信息
    • 信息熵低:咱们对某件事已经有了较多的了解,咱们就不须要太多的信息

1.2.1.2 信息熵的公式

  • 对数的运算法则
    l o g a ( m n ) = l o g a m + l o g a n log_a(mn)=log_am+log_an
  • 几率的公式
    p ( x , y ) = p ( x ) p ( y ) p(x,y)=p(x)p(y)
  • 两个事件同时发生的信息等于各自信息的和
    I ( x , y ) = I ( x ) + I ( y ) I(x,y)=I(x)+I(y)

随机变量 x 的自信息
I ( x ) = l o g p ( x ) I(x)=-logp(x) 机器学习

  • 负号是用来保证信息量是正数或者零
  • 描述的是随机变量的某个事件发生所带来的信息量

信息熵: 传送一个随机变量传输的平均信息量是 I ( x ) = l o g p ( x ) I(x)=-logp(x) 的指望
H ( X ) = i = 1 n p ( x i ) l o g ( p ( x i ) ) H\left(X\right)= -\sum_{i=1}^{n}p\left(x_{i}\right)log\left(p\left(x_{i}\right)\right) svg

1.2.1.3 信息熵的解读

  • 随机变量 x 的熵,它是表示随机变量不肯定的度量,是对全部可能发生的事件产生的信息量的指望
  • 随机变量的取值个数越多,状态数也就越多,信息熵就越大,混乱程度就越大

1.2.2 联合熵

H ( X , Y ) = x , y p ( x , y ) l o g p ( x , y ) = i = 1 n j = 1 m p ( x i , y i ) l o g p ( x i , y i ) H(X,Y)=-\displaystyle\sum_{x,y}p(x,y)logp(x,y)=-\sum_{i=1}^{n}\sum_{j=1}^{m}p(x_i,y_i)logp(x_i,y_i) 函数

1.2.3 条件熵

  • 条件熵 H(Y|X) 表示在已知随机变量 X 的条件下, 随机变量 Y 的不肯定性
  • 条件熵 H(Y|X) 定义为 X 给定条件下, Y 的条件几率分布的熵对 X 的数学指望
  • 至关在不一样X的信息熵,加上X的值的几率的加权

1.2.3.1 条件熵公式

假设X有n个取值
H ( Y X ) = i = 1 n p ( x i ) H ( Y X = x i ) H(Y|X)=\sum_{i=1}^{n} p(x_i)H(Y|X=x_i) 学习

见识Y有m个取值
H ( Y X = x i ) = j = 1 m p ( y j X = x i ) log p ( y j X = x i ) H(Y|X=x_i) = - \sum_{j=1}^{m} p(y_j|X=x_i)\log p(y_j|X=x_i) 测试

因此
H ( Y X ) = i = 1 n p ( x i ) H ( Y X = x i ) = i = 1 n p ( x i ) ( j = 1 m p ( y j X = x i ) log p ( y j X = x i ) ) = i = 1 n p ( x i ) j = 1 m p ( y j x i ) log p ( y j x i ) H(Y|X)=\sum_{i=1}^{n} p(x_i)H(Y|X=x_i) \\ =\sum_{i=1}^{n} p(x_i)\left(- \sum_{j=1}^{m} p(y_j|X=x_i) \log p(y_j|X=x_i)\right)\\ =-\sum_{i=1}^{n}p(x_i) \sum_{j=1}^{m} p(y_j|x_i) \log p(y_j|x_i) spa

1.2.3.2 H(Y|X)条件熵的理解

  • 在已知一些信息的状况下,因变量 Y 的不纯度,
    • 即在X 的划分下,Y 被分割愈来愈“纯”的程度,
    • 即信息的加入能够下降熵
  • 条件熵表示在已知随机变量 X 的条件下,Y 的条件几率分布的熵对随机变量 X的数学指望

1.2.4 联合熵和条件熵的关系

H ( Y X ) = H ( X , Y ) H ( X ) H\left( {Y\left| X \right.} \right) = H\left( {X,Y} \right) - H\left( X \right)

引用别人的证实公式为:
H ( Y X ) = H ( X , Y ) H ( X ) = x , y P ( x , y ) log P ( x , y ) + x P ( x ) log P ( x ) = x , y P ( x , y ) log P ( x , y ) + x ( y P ( x , y ) ) log P ( x ) = x , y P ( x , y ) log P ( x , y ) + x y P ( x , y ) log P ( x ) = x , y P ( x , y ) log P ( x , y ) P ( x ) = x , y P ( x , y ) log P ( y x ) = x y P ( x ) P ( y x ) log P ( y x ) = x P ( x ) y P ( y x ) log P ( y x ) = x P ( x ) ( y P ( y x ) log P ( y x ) ) = x P ( x ) H ( Y X = x ) \begin{array}{l} H\left( {Y\left| X \right.} \right) = H\left( {X,Y} \right) - H\left( X \right)\\ = - \sum\limits_{x,y} {P\left( {x,y} \right)} \log P\left( {x,y} \right) + \sum\limits_x {P\left( x \right)} \log P\left( x \right)\\ = - \sum\limits_{x,y} {P\left( {x,y} \right)} \log P\left( {x,y} \right) + \sum\limits_x {\left( {\sum\limits_y {P\left( {x,y} \right)} } \right)} \log P\left( x \right)\\ = - \sum\limits_{x,y} {P\left( {x,y} \right)} \log P\left( {x,y} \right) + \sum\limits_x {\sum\limits_y {P\left( {x,y} \right)} } \log P\left( x \right)\\ = - \sum\limits_{x,y} {P\left( {x,y} \right)} \log \frac{{P\left( {x,y} \right)}}{{P\left( x \right)}}\\ = - \sum\limits_{x,y} {P\left( {x,y} \right)} \log P\left( {y\left| x \right.} \right)\\ = - \sum\limits_x {\sum\limits_y {P\left( x \right)} } P\left( {y\left| x \right.} \right)\log P\left( {y\left| x \right.} \right)\\ = - \sum\limits_x {P\left( x \right)\sum\limits_y {P\left( {y\left| x \right.} \right)} } \log P\left( {y\left| x \right.} \right)\\ = \sum\limits_x {P\left( x \right)\left( { - \sum\limits_y {P\left( {y\left| x \right.} \right)} \log P\left( {y\left| x \right.} \right)} \right)} \\ = \sum\limits_x {P\left( x \right)H\left( {Y\left| {X = x} \right.} \right)} \end{array}

1.3 ID3算法

1.3.1 信息增益

信息增益表示

  • 得知特征X的信息, 使得类Y的信息不肯定性(信息熵)减小的程度
    • 划分前样本集合D的熵是必定的 ,entroy(前),
    • 使用某个特征A划分数据集D,计算划分后的数据子集的熵 entroy(后)
    • 信息增益 = entroy(前) - entroy(后)

信息增益的符合表示

  • 特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) ,定义为集合D的经验熵 H ( D ) H(D) 与特征A给定条件下D的经验条件熵 H ( D A ) H(D|A) 之差:
    g ( D , A ) = H ( D ) H ( D A ) g ( D , A ) = H ( D ) H ( D A ) g(D,A)=H(D)−H(D|A)g(D,A)=H(D)−H(D|A)
  • 考虑条件熵和联合熵的关系
    g ( D , A ) = H ( D ) H ( D A ) = H ( D ) ( H ( D , A ) H ( A ) ) = H ( D ) + H ( A ) H ( D , A ) g(D, A) = H(D) - H(D|A) = H(D) - (H(D,A) - H(A)) = H(D) + H(A) - H(D,A)
  • 这个公式让咱们想到集合的交集公式

信息增益的含义

  • 最大减小在类别断定上的不肯定性,更快的断定类别
  • 纯度上升的更快,更快速到达纯度更高的集合

1.3.2 ID3的算法流程

  • (1)自上而下贪婪搜索
  • (2)遍历全部的属性,按照信息增益最大的属性进行分裂
  • (3)根据分裂属性划分样本
  • (4)重复上述流程,直至知足条件结束

1.3.3 ID3算法的缺陷

缺陷1

  • 缺点:信息增益偏向取值较多的特征
  • 缘由:当特征的取值较多时,根据此特征划分更容易获得纯度更高的子集,所以划分以后的熵更低,因为划分前的熵是必定的,所以信息增益更大,所以信息增益比较 偏向取值较多的特征

极端状况

  • 二维表的主键id

其余缺陷

  • 不能处理连续值属性
  • 不能处理属性值缺失状况
  • 不能进行剪枝

1.4 C4.5算法

1.4.1 信息增益率

  • 能够理解为: 信息增益率 = 分裂信息将信息增益的标准化
  • 或者理解为: 信息增益率 = 惩罚参数 * 信息增益

分裂信息:

  • 以前是把集合类别做为随机变量,如今把某个特征做为随机变量,按照此特征的特征取值对集合D进行划分v类,计算熵 H A ( D ) H_A(D)
    S p l i t H A ( D ) = j = 1 v D j D l o g D j D SplitH_{A}\left(D\right)= -\sum_{j=1}^{v}\frac{|D_{j}|}{D}log\frac{|D_{j}|}{D}

信息增益率
G a i n R a d i o n ( A ) = g ( A , D ) S p l i t H A ( D ) GainRadion\left(A\right)= \frac{g\left(A,D\right)}{SplitH_{A}\left(D\right)}

1.4.2 连续值属性和分裂点

步骤:

  • (1)连续值属性从小到大排序,每对相邻点的中点做为分裂点
  • (2)数据集D中有N个不一样的连续值属性值, 产生N-1个分裂点
  • (3)按照每一个分裂点,计算每一个二分树的信息增益
  • (4)取得信息增益最大的分裂点

1.4.3 缺失值处理

1.4.3.1 学习过程当中-缺失值处理

信息增益

  • 计算信息熵,忽略缺失值
  • 计算信息增益, 乘以未缺失实例的比例

分裂信息熵

  • 缺失值当作正常值处理

分裂时候

  • 缺失值实例分配给全部判断节点下面的分支上
  • 可是每一个分支的缺失值实例带一个权重: 该分支的几率(频率估算)
  • 其余正常实例权重为1

叶节点定义

  • (N/E)形式
    • N该叶节点的实例数
    • E叶节点中属于其余分类的实例数

1.4.3.2 分类过程-缺失值处理

  • 缺失值该属性的遍历全部的分支
    • 该属性的全部分支的几率: 分支的叶子节点的N必上全部N的比值
  • 由于叶节点是NE的形势.
    • 正例几率: N/E
    • 反例几率: E/N
  • 根据分支的几率,叶节点的正例几率反例几率的加权和

1.4.4 剪枝

1.4.4.1 过拟合

训练样本中的噪声致使过拟合

  • 错误的属性值和标签值

训练样本中缺少表明性样本所致使的

  • 训练样本过少的时候,模型很容易受到过拟合的影响

1.4.4.2 预剪枝

限定树的的最大生长高度

1.4.4.3 后剪枝

后剪枝的目标
在测试集上定义损失函数,经过剪枝使损失函数在测试集上有所下降

步骤

  • (1)自底向上遍历每个非叶子节点, 将当前的非叶子节点剪枝(从树中减去,其下全部的叶节点合并一个节点,代替被剪枝的节点)
  • (2)计算剪枝先后的损失函数
  • (3)若是损失函数变小, 则剪枝. 不然则还原.
  • (4)重复上述过程,遍历全部的节点

子树的损失函数
J ( τ ) = E ( τ ) + λ τ J(\tau) = E(\tau) + \lambda |\tau|

  • 带惩罚项

后剪枝的损失函数阈值
g ( c ) = E ( c ) E ( τ c ) τ c 1 λ k = min ( λ , g ( c ) ) g(c) = \frac{E(c) - E(\tau_c)}{|\tau_c| - 1} \lambda_k = \min(\lambda, g(c))

注意

  • 子树的损失函数不作过多介绍,
  • 感兴趣能够参考博客:CART-分类和回归树
  • https://blog.csdn.net/guoziqing506/article/details/81675022

2 CART算法

2.1 基尼不纯度gini impurity

  • 或者称为基尼指数gini index
  • 区别于基尼系数gini coefficient, 二者概念不一样

假设有K个类,样本点属于第k类的几率为 p k p_{k} ,则几率分布的基尼指数定义为:
G ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2 G(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
知足的条件:
k = 1 K p k = 1 \sum_{k=1}^{K}p_k=1

2.1.1 基尼指数公式的推导

l o g p ( x ) -logp(x) 进行泰勒展开, p ( x ) p(x) 的高阶趋于0,忽略高阶项.就获得基尼指数(不纯度)的公式

  • 基尼不纯度的计算能够看出,它的计算更加方便,
  • 基尼不纯度是熵的一个近似值

2.1.2 二分类的基尼指数

对于二分类问题,若是样本点属于第一类的几率为p,则几率分布的基尼系数为

G i n i ( p ) = 2 p ( 1 p ) Gini(p)=2p(1-p)

C k C_k 为D中属于第k类的样本子集,则基尼指数为
G i n i ( D ) = 1 k = 1 K ( C k D ) 2 Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2

设条件A将样本D切分为D1和D2两个数据子集,则在条件A下的样本D的基尼指数为:
G i n i ( D , A ) = D 1 D G i n i ( D 1 ) + D 2 D G i n i ( D 2 ) Gini(D,A)=\frac{|D_1|}{D}Gini(D_1)+\frac{|D_2|}{D}Gini(D_2)

2.2 CART分类树

条件A, 将样本D, 切分为D1和D2两个数据子集的gini增益为
Δ G i n i ( A ) = G i n i ( D ) G i n i ( D , A ) = ( 1 k = 1 K ( C k D ) 2 ) ( D 1 D G i n i ( D 1 ) + D 2 D G i n i ( D 2 ) ) \Delta Gini(A)=Gini(D)-Gini(D,A)=(1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2)-(\frac{|D_1|}{D}Gini(D_1)+\frac{|D_2|}{D}Gini(D_2))

2.2.1 算法实现步骤

  • 1)计算现有样本D的基尼指数,以后利用样本中每个特征A,及A的每个可能取值a,根据A>=a与A<a将样本分为两部分,并计算Gini(D,A)值
  • 2)找出对应基尼指数最小Gini(D,A)的最优切分特征及取值,并判断是否切分中止条件,否,则输出最优切分点
  • 3)递归调用1)2)
  • 4)生成CART决策树

2.3 CART回归树

2.3.1 CART回归树的概念和公式

  • (1)训练集: D = { ( X 1 , y 1 ) , ( X 2 , y 2 ) , , ( X n , y n ) } D = \{(X_1, y_1), (X_2, y_2), \dots, (X_n, y_n)\} , Y Y 是连续变量

  • (2)输入数据空间 X X 划分为m个区域: { R 1 , R 2 , , R m } \{R_1, R_2, \dots, R_m\}

  • (3)而后赋给每一个输入空间的区域 R i R_i 有一个固定的表明输出值 C i C_i

  • (4)回归树的模型公式:
    f ( X ) = i = 1 m C i I ( X R i ) f(X) = \sum_{i = 1}^m C_i I(X \in R_i)

    • 若是 X R i X \in R_i ,则 I = 1 I=1 ,不然 I = 0 I=0
    • **含义:**先判断X属于哪一个区域,而后返回这个区域的表明值。
  • (5)计算损失函数:

    • R i R_i 这个区域中的元组的y值的均值
      g i = 1 N i X j R i y j g_i = \frac{1}{N_i} \sum_{X_j \in R_i} y_j
    • 某个区域 R i R_i 回归模型的损失函数
      J ( C ) = X j R i ( f ( X j ) g i ) 2 J(C) = \sum_{X_j \in R_i} (f(X_j) - g_i)^2

2.3.2 最小二乘回归树生成算法

: 参考李航的<机器学习>编写, 更详细内容,请自行搜索资料查看

  • (1)选择最优切分变量 j 与切分点 s,求解
    min j , s [ min c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + min c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ] \min_{j,s}\left [\min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c_2}\sum_{x_i \in R_2(j,s)} (y_i-c_2)^2 \right]

  • (2)用选定的对 (j,s) 划分区域并决定相应的输出值
    R 1 ( j , s ) = { x x ( j ) s } , R 2 ( j , s ) = { x x ( j ) > s } R_1(j,s)=\{x|x^{(j)} \le s\},\quad R_2(j,s)=\{x|x^{(j)}\gt s\}

  • (3)继续对两个子区域调用步骤(1),(2),直至知足中止条件

  • (4)将输入空间分为 M 个区域 R 1 , R 2 , , R M R_1,R_2,\cdots,R_M ,生成决策树
    f ( x ) = m = 1 M c ^ m I ( x R m ) f(x)=\sum_{m=1}^M \hat c_m I(x\in R_m)