Decision Trees

sklearn.tree

  • 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
  • 构造决策树的关键步骤是分裂属性,就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
    1.属性是离散值且不要求生成二叉决策树。此时用属性的每一个结果作为一个分支。
    2.属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于 此子集”和“不属于此子集”分成两个分支
    3.属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。

ID3

  • 决策树ID3算法的核心思想是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。

  • 熵度量了事物的不确定性,越不确定的事物,熵就越大。(如1/2,1/2 > 1/3, 2/3)

  • 随机变量X的熵的表达式: H ( X ) = − ∑ i = 1 n p i l o g p i H(X) = -\sum\limits_{i=1}^{n}p_i logp_i H(X)=i=1npilogpi其中n代表X的n种不同的离散取值。而𝑝𝑖代表了X取值为i的概率,log为以2或者e为底的对数。

  • 条件熵的表达式H(X|Y): H ( X ∣ Y ) = ∑ j = 1 n p ( y j ) H ( X ∣ y j ) H(X|Y) = \sum\limits_{j=1}^{n}p(y_j)H(X|y_j) H(XY)=j=1np(yj)H(Xyj)它度量了在知道Y以后X的不确定性。

  • 信息增益I(X,Y) = H(X)-H(X|Y)

  • ID3决策树算法就是在每次分裂的时候选择信息增益最大的属性,作为本次树分裂属性,所谓信息增益最大,实际上就是对最后的输出影响最大。

举例进行描述
在这里插入图片描述

  • 现状态的信息熵(熵度量): H ( X ) = − ∑ i = 1 n p i l o g p i H(X) = -\sum\limits_{i=1}^{n}p_i logp_i H(X)=i=1npilogpi

    • n即为2

    • p i p_i pi为 yes/no类别在整个训练元组中出现的概率

  • 划分后的信息熵: H ( X ∣ Y ) = ∑ j = 1 n p ( y j ) H ( X ∣ y j ) H(X|Y) = \sum\limits_{j=1}^{n}p(y_j)H(X|y_j) H(XY)=j=1np(yj)H(Xyj)
    如对日志密度进行划分:

    • n为3
    • P s P_s Ps = 3/10
      P l P_l Pl = 3/10
      P m P_m Pm = 4/10
    • H ( X ∣ s ) = − ( 1 / 3 ∗ l o g ( 1 / 3 ) + 2 / 3 ∗ l o g ( 2 / 3 ) ) H(X|s) = -(1/3*log(1/3) + 2/3*log(2/3)) H(Xs)=(1/3log(1/3)+2/3log(2/3))
      H ( X ∣ l ) = − ( 1 ∗ l o g ( 1 ) ) H(X|l) = -(1*log(1)) H(Xl)=(1log(1))
      H ( X ∣ m ) = − ( 1 / 4 ∗ l o g ( 1 / 4 ) + 3 / 4 ∗ l o g ( 3 / 4 ) ) H(X|m) = -(1/4*log(1/4) + 3/4*log(3/4)) H(Xm)=(1/4log(1/4)+3/4log(3/4))

实现

  1. 初始化信息增益的阈值ε
  2. 判断样本是否为同一类输出 D i D_i Di,如果是则返回单节点树T。标记类别为 D i D_i Di
  3. 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别
  4. 计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征 A g A_g Ag
  5. 如果Ag的信息增益小于阈值ε,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
  6. 否则,按特征 A g A_g Ag的不同值 A g i A_{gi} Agi将对应的样本输出D分成不同的类别 D i D_i Di。每个类别产生一个子节点,对应特征值为 A g i A_{gi} Agi。返回增加了节点的树T。
  7. 对于所有子节点,令 D = D i D = D_i D=Di A = A − A g A = A - {A_g} A=AAg递归调用2-6步,得到子树 T i T_i Ti返回。

ID3缺陷

  • ID3没考虑连续特征,比如长度,密度都是连续值
  • ID3用信息增益作为标准容易偏向取值较多的特征。然而在相同条件下,取值比较多的特征比取值少的特征信息增益大。(如:每个ID都对应一个类别)
  • ID3算法没考虑缺失值问题

C4.5

  • C4.5算法定义信息增益比: I R ( D , A ) = I ( A , D ) H A ( D ) I_R(D,A) = \frac{I(A,D)}{H_A(D)} IR(D,A)=HA(D)I(A,D)它是信息增益和特征熵的比值, D为样本特征的集合,A为样本特征 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(D)=i=1nDDilog2DDi其中n为特征A的类别数, D i D_i Di为特征A的第i个取值对应的样本个数。|𝐷|为样本个数。

  • 选择最大增益率的属性来分裂。(特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题)

C4.5将连续的特征离散化

  1. 将m个样本根据连续特征值从小到大排列。
  2. 取相邻两样本特征值的平均数,会得m-1个划分点。
  3. 对于这m-1个点,分别计算以该点作为二元分类点时的信息增益(不是信息增益率)。
  4. 选择信息增益最大的点作为该连续特征的二元离散分类点。(比如取到的增益最大的点为at,则小于at的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。)

对于缺失值处理的问题

  • 在样本某些特征缺失的情况下选择划分的属性:对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2。 然后计算数据集D1对应的A特征的各个特征值加权重后的信息增益比,最后乘上一个系数,这个系数是D1中样本加权后所占加权总样本的比例。

  • 选定了划分属性,对于在该属性上缺失特征的样本的处理:将缺失特征的样本同时划分入所有的子节点,划分权重按各个子节点无缺失样本的数量比例来分配

C4.5缺陷

  • C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。
  • C4.5只能用于分类。
  • C4.5生成的是多叉树,相较二叉树运算效率低。

CART

分类树

  • CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,纯度越高,特征越好。这和信息增益(比)相反。

  • 基尼系数表达式: G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D) = 1-\sum\limits_{k=1}^{K}(\frac{|C_k|}{|D|})^2 Gini(D)=1k=1K(DCk)2

    样本D,个数为 ∣ D ∣ |D| D,假设K个类别,第k个类别的数量为 ∣ C k ∣ |C_k| Ck

  • CART分类树算法每次仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。

  1. CART分类树算法对连续值的处理:
    和C4.5类似,都是将连续的特征离散化。区别在于选择特征划分点时,C4.5是信息增益,CART是基尼系数
  2. CART分类树算法对离散值的处理:
    不停的二分离散特征。
  3. 二分没有将特征A的取值完全分开,后面还会对子节点特征划分有影响。在ID3或C4.5的一颗子树中,离散特征(连续特征二分除外)只会参与一次节点的建立。

建立实现(基尼系数的阈值,样本个数阈值)

  1. 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。
  2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
  3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
  4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,左节点的数据集D为D1,右节点的数据集D为D2。
  5. 对左右的子节点递归的调用1-4步,生成决策树。

回归树

  • 分类树的输出是样本的类别
    回归树的输出是一个实数。

  • 分类模型:采用基尼系数的大小度量特征各个划分点的优劣。
    回归模型:采用和方差度量,对于划分特征A划分点s两边的数据集D1和D2,使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。

  • 分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。
    回归树采用叶子节点的均值或者中位数来预测输出结果。

CART树缺陷

  • 选择一个最优的特征做分类决策,但大多数,分类决策不是由某一个特征决定,而是一组特征。
  • 样本一点点改动,树结构剧烈改变。
  • 比较复杂的关系,决策树很难学习

剪枝处理

  1. Overfitting
    噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。
    缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。
    多重比较:决策树在每个变量的每一个值中选取一个作为分割点,所以选出一个噪音分割标准的概率是很大的。

  2. 停止
    决策树的构建过程是一个递归的过程,所以需要确定停止条件。
    一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会导致过拟合问题。
    另一种可行的方法是当节点中的记录数低于一个阀值时就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。

  3. 前置裁剪 (prepruning)
    在构建决策树的过程时,提前停止。那么会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优,实践证明这种策略无法得到较好的结果。

  4. 后置裁剪 (postpruning)
    决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点采用子树中最主要的分类;2)将一个子树完全替代另一个子树。后置裁剪问题在于计算效率的浪费。

  5. K-Fold Cross Validation
    计算出决策树T(训练数据集),N个叶节点。剪裁后剩余i个叶节点,i属于[1,N]。
    对每种可能的i,使用K-Fold Validataion方法(验证数据集)计算裁剪到i个节点后的决策树的错误率,最后求出平均错误率。
    用具有最小错误率对应的i作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。

  6. Random Forest
    Random Forest是用训练数据随机计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值