【ML】决策树:ID3与C4.5、CART回归树,决策树剪枝

决策树(decision tree)是一种基本的分类与回归方法。

决策树模型

  决策树模型呈树形结构,由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node),内部结点表示一个特征或属性,叶结点表示一个类。决策树模型
  决策树表示在给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分(partion)上:

  • 将特征空间划分为互不相交的单元(cell)或区域(region),决策树的一条路径对应于划分中的一个单元;
  • 在每个单元定义一个类的概率分布,这样就构成了一个条件概率分布;
    • 各叶结点(单元)上的条件概率往往偏向某一个类,即属于某一类的概率较大。
  • 所有这些单元上的条件概率分布组成了决策树所表示的条件概率分布。
    • 由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。

决策树的学习

  设 X X X Y Y Y分别为输入和输出变量,如果 Y Y Y为连续变量,研究回归问题,学习一个回归树,如果 Y Y Y为离散变量,研究分类问题,学习一个分类树。
  训练数据集 { ( x ( i ) , y ( i ) ) , i = 1 , . . . , n } \{(x^{(i)},y^{(i)}),i=1,...,n\} {(x(i),y(i)),i=1,...,n},其中 x ( i ) = ( x 1 ( i ) , . . . , x p ( i ) ) x^{(i)}=(x^{(i)}_1,...,x^{(i)}_p) x(i)=(x1(i),...,xp(i))为第 i i i个实例的特征向量, p p p为特征个数, y ( i ) y^{(i)} y(i)为标签。决策树学习是由训练数据集估计条件概率模型。

  • 能对训练集数据进行正确预测的决策树可能有多个,也可能一个没有,我们需要的是一个与训练数据矛盾较小的决策树;
  • 如果特征数量过多,可以在开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
  • 决策树学习的算法通常是一个递归的选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程:
    1. 将所有训练数据都放在根节点;
    2. 选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类;
    3. 如果这些子集已经能够被基本正确分类,则构建叶结点,并将这些子集分到所对应的的叶结点中;
    4. 如果还有子集不能被基本正确分类,则对这些子集选择新的最优特征,继续对其分割,构建相应的结点。
  • 我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测,如果发生过拟合现象,需要对已生成的树进行剪枝,去掉过于细分的叶结点,使其退到父结点,甚至更高的结点,然后将父结点甚至更高的结点改为叶结点。
  • 决策树的生成只考虑局部最优,决策树的剪枝则考虑全局最优。

特征选择

  特征选择是决定用哪个特征来划分特征空间,关键在于选取对训练数据具有分类能力的特征。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的,经验上扔掉这样的特征对决策树学习的精度影响不大。那么如何评价一个特征的分类能力呢?通常特征选择的准则是信息增益或信息增益比。

1.信息增益

  熵(entropy) 是表示随机变量不确定性的度量:熵越大,变量的取值越不确定。
  一个事件发生的概率越大,确定性越强,所携带的信息量越小,函数 − l o g x -log x logx可反映这一特征,定义为信息量。而熵则是所有可能取值的信息量的期望。
  设 X X X的分布为 { p ( x i ) , x i ∈ χ } \{p(x_i),x_i\in\chi\} {p(xi),xiχ},当 X X X是离散型随机变量时,随机变量 X X X的熵定义为
H ( X ) = − ∑ x i ∈ χ p ( x i ) log ⁡ p ( x i ) H(X)=-\sum_{x_i \in \chi} p(x_i) \log p(x_i) H(X)=xiχp(xi)logp(xi)

  • 约定当 p ( x ) → 0 p(x) \rightarrow 0 p(x)0时,有 p ( x ) log ⁡ p ( x ) → 0 p(x) \log p(x) \rightarrow 0 p(x)logp(x)0
  • 熵的单位随着公式中log运算的底数而变化,当底数为2时单位为“比特”(bit),底数为e时单位为“奈特”。
  • 熵只依赖于 X X X的分布,而与 X X X的取值无关,可写 H ( p ) = H ( X ) H(p)=H(X) H(p)=H(X) 0 ≤ H ( X ) ≤ l o g n 0\leq H(X)\leq log n 0H(X)logn

  条件熵(conditional entropy) 是表示在已知随机变量 X X X的条件下随机变量 Y Y Y的不确定性。设 X ∈ { x 1 , x 2 , . . . , x n } X\in\{x_1,x_2,...,x_n\} X{x1,x2,...,xn} Y ∈ { y 1 , y 2 , . . . , y m } Y\in\{y_1,y_2,...,y_m\} Y{y1,y2,...,ym}为离散型随机变量,在已知 X X X的条件下, Y Y Y的条件熵定义为:
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 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)\sum_{j=1}^{m}p(y_j|x_i)\log p(y_j|x_i) H(YX)=i=1np(xi)H(YX=xi)=i=1np(xi)j=1mp(yjxi)logp(yjxi)
它表示已知 X X X的条件下, Y Y Y的条件概率分布的熵对 X X X的数学期望。

当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验上和经验条件熵。

  信息增益(information gain) 特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征 A A A给定条件下 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(DA)之差,即
g ( D ∣ A ) = H ( D ) − H ( D ∣ A ) g(D|A)=H(D)-H(D|A) g(DA)=H(D)H(DA)

  • 经验熵 H ( D ) H(D) H(D)表示对数据集 D D D进行分类的不确定性;
  • 经验条件熵 H ( D ∣ A ) H(D|A) H(DA)表示特征 A A A给定的条件下对数据集 D D D进行分类的不确定性;
  • 信息增益表示得知特征 X X X的信息而使得类 Y Y Y的信息的不确定性减少的程度。

  一般地,熵 H ( Y ) H(Y) H(Y)与条件熵 H ( Y ∣ X ) H(Y|X) H(YX)之差称为互信息(mutual information),决策树学习中的信息增益等价于训练数据集中类与特征的互信息。

  设训练集为 D D D ∣ D ∣ |D| D表示样本个数。设有 K K K个类 C k , k = 1 , 2 , . . . , K C_k,k=1,2,...,K Ck,k=1,2,...,K ∣ C k ∣ |C_k| Ck为属于类 C k C_k Ck的样本个数。设特征 A A A n n n个不同的取值 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} {a1,a2,...,an},根据特征 A A A的取值量 D D D划分为 n n n个子集 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn ∣ D i ∣ |D_i| Di D i D_i Di的样本个数。记子集 D i D_i Di中属于类 C k C_k Ck的样本的集合为 D i k D_{ik} Dik,即 D i k = D i ∩ C k D_{ik}=D_i\cap C_k Dik=DiCk ∣ D i k ∣ |D_{ik}| Dik D i k D_{ik} Dik的样本个数。

信息增益的算法
输入:训练集 D D D和特征集 A A A
输出:特征 A A A对训练集 D D D的信息增益 g ( D , A ) g(D,A) g(D,A)

  1. 计算数据集 D D D的经验熵 H ( D ) H(D) H(D) H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K\frac{ |C_k| }{ |D| } log_2 \frac{ |C_k| }{ |D| } H(D)=k=1KDCklog2DCk

记随机变量 X X X为数据集中任一样本点的类别,则数据集 D D D的经验熵实际上是 X X X的熵,它衡量了,任取数据集 D D D中的一个样本点,该样本点所属类别的不确定性,我们想要预测样本点所属类别,因此希望这种不确定性越小越好。

  1. 计算特征 A A A对数据集 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(DA) H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ l o g 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}^n\frac{ |D_i| }{ |D| }H(D_i)=-\sum_{i=1}^n\frac{ |D_i| }{ |D| }\sum_{k=1}^K\frac{ |D_{ik}| }{ |D_i| } log_2\frac{ |D_{ik}| }{ |D_i| } H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik

衡量了,按照特征A划分数据集后,估计样本点所属类别的不确定性。

  1. 计算信息增益: g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

衡量了划分数据集后,估计样本点所属类别的不确定性的减少程度。

2.信息增益比

  信息增益的大小是相对于训练数据集而言的,没有绝对意义。也就是说在训练数据集的经验熵大的时候,信息增益值会偏大,反之,信息增益值会偏小。信息增益比(information gain ratio)可以对这一问题进行校正。
  特征 A A A对训练集 D D D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练集 D D D的经验熵 H ( D ) H(D) H(D)之比:
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)= \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)

H A ( D ) = − ∑ i ∣ D i ∣ ∣ D ∣ l o g ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_i\frac{|D_i|}{|D|}log\frac{|D_i|}{|D|} HA(D)=iDDilogDDi

决策树的生成

1. ID3算法(分类)

  ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归的构建决策树。
ID3算法
输入:训练集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
输出:决策树 T T T

  1. D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,将类 C k C_k Ck作为该结点的类标记,返回 T T T
  2. A = ∅ A=\varnothing A=,则 T T T为单结点树,将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
  3. 否则,计算 A A A中各特征对 D D D的信息增益,选择信息增益最大的特征 A g A_g Ag
  4. 如果 A g A_g Ag的信息增益小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
  5. 否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai D D D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
  6. 对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A{Ag}为特征集,递归地调用(1)~(5),得到子树 T i T_i Ti,返回 T i T_i Ti

2. C4.5算法(分类)

  C4.5算法在生成的过程中,用信息增益比来选择特征。
C4.5算法
输入:训练集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
输出:决策树 T T T

  1. D D D中所有实例属于同一类 C k C_k Ck,则 T T T为单结点树,将类 C k C_k Ck作为该结点的类标记,返回 T T T
  2. A = ∅ A=\varnothing A=,则 T T T为单结点树,将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
  3. 否则,计算 A A A中各特征对 D D D的信息增益比,选择信息增益比最大的特征 A g A_g Ag
  4. 如果 A g A_g Ag的信息增益比小于阈值 ϵ \epsilon ϵ,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回 T T T
  5. 否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai D D D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T T T,返回 T T T
  6. 对第 i i i个子结点,以 D i D_i Di为训练集,以 A − { A g } A-\{A_g\} A{Ag}为特征集,递归地调用(1)~(5),得到子树 T i T_i Ti,返回 T i T_i Ti

决策树的剪枝

决策树剪枝策略:

  • 预剪枝:边建立决策树边进行剪枝操作(更实用)
    • 限制树的深度,限制叶子结点的个数,限制叶子结点的样本数,信息增益量等。
  • 后剪枝:当建立完决策树后来进行剪枝操作
    • 通过一定的衡量标准:损失函数(loss function)或代价函数(cost function)

  设决策树 T T T的叶结点个数为 ∣ T ∣ |T| T t t t是树 T T T的叶结点,该叶结点有 N t N_t Nt个样本点,其中属于第 k k k类的样本点有 N t k N_{tk} Ntk个, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K,定义决策树学习的损失函数为:
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha |T| Cα(T)=C(T)+αT
其中:

  • ∣ T ∣ |T| T刻画了模型复杂度,叶子结点个数越多,损失越大;
  • C ( T ) C(T) C(T)为模型对训练数据的拟合程度, C ( T ) C(T) C(T)越小,拟合程度越大,
    C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ N t ∑ k = 1 K N t k N t l o g N t k N t = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k l o g N t k N t C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}N_t\sum_{k=1}^K\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t}=-\sum_{t=1}^{|T|}\sum_{k=1}^KN_{tk}log\frac{N_{tk}}{N_t} C(T)=t=1TNtHt(T)=t=1TNtk=1KNtNtklogNtNtk=t=1Tk=1KNtklogNtNtk
  • α ≥ 0 \alpha\geq0 α0为参数,反映叶子结点个数在损失函数中所占比例,控制拟合程度和复杂度之间的影响。

理解 C ( T ) C(T) C(T)的计算:

  • H t ( T ) H_t(T) Ht(T)是决策树 T T T的叶子结点 t t t所代表的的数据集的经验熵,反映了叶子结点 t t t中数据集的混乱程度(类别分散程度);
  • 叶子结点 t t t的类标签为其中样本类别数目最多的那个,数据集越混乱,以一个类标签预测的误差越大,拟合程度越低,因此 H t ( T ) H_t(T) Ht(T)反映了叶子结点 t t t中任一样本点的预测误差,叶子结点 t t t所代表的数据集的预测误差则为 N t H t ( T ) N_tH_t(T) NtHt(T),整棵树的预测误差则为累加和。

树的后剪枝算法
输入:生成算法产生的整个树 T T T,参数 α \alpha α
输出:修剪后的子树 T α T_\alpha Tα

  1. 计算每个结点的经验熵;
  2. 递归地从树的叶结点向上回缩:
    设一组叶结点回缩到其父结点之前与之后的整体树分别为 T B T_B TB T A T_A TA,其对应的损失函数值分别是 C α ( T B ) C_\alpha(T_B) Cα(TB) C α ( T A ) C_\alpha(T_A) Cα(TA),如果 C α ( T A ) ≤ C α ( T B ) C_\alpha(T_A) \leq C_\alpha(T_B) Cα(TA)Cα(TB),则进行剪枝,即将父结点变为新的叶结点。
  3. 返回2,直至不能继续为止,得到损失函数最小的子树 T α T_\alpha Tα
    注:剪枝时只需考虑两个损失函数的差,其计算可以在局部进行,所以,决策树的剪枝算法可以由一种动态规划的算法实现。

CART算法(决策树生成+决策树剪枝)

  分类与回归树(classification and regression tree,CART)模型有Breiman等人在1984年提出,是应用广泛的决策树学习方法。
  CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
  CART算法由两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
  2. 决策树剪枝:用验证集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

CART生成

回归树的生成

特征选择
  平方误差最小化准则。
回归树模型
  一个回归树对应着特征空间的一个划分以及在划分的单元上的输出值。
  假设特征空间被划分为 M M M个单元 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,并且在每一个单元 R m R_m Rm上有一个固定的输出值 c m c_m cm,则回归树模型可表示为:
f ( x ) = ∑ m = 1 M c m I { x ∈ R m } f(x)=\sum_{m=1}^M c_mI\{x\in R_m\} f(x)=m=1McmI{xRm}

最小二乘回归树生成

  • 对于确定的特征空间划分,区域 R m R_m Rm上回归树对训练集的预测误差: ∑ x ( i ) ∈ R m ( y ( i ) − f ( x ( i ) ) ) 2 \sum_{x^{(i)}\in R_m}(y^{(i)}-f(x^{(i)}))^2 x(i)Rm(y(i)f(x(i)))2
    • 每个单元 R m R_m Rm上的最优(平方误差最小的准则)输出值为 1 / n ∑ x ( i ) ∈ R m y ( i ) 1/n\sum_{x^{(i)}\in R_m}y^{(i)} 1/nx(i)Rmy(i)
  • 特征空间的划分(启发式方法):
      前面讲过,CART算法假设决策树是二叉树,根据第 j j j个特征二分特征空间,需要给出一个切分点,定义由切分变量 x j x_j xj和切分点 s s s切分的两个区域
    R 1 ( j , s ) = { x ∣ x j ≤ s } , R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s)=\{x|x_j\leq s\} , R_2(j,s)=\{x|x_j>s\} R1(j,s)={xxjs},R2(j,s)={xxj>s}
    如何选择划分特征及相应的切分点呢?根据最小化误差平方和的准则,最优切分变量 x j x_j xj和最优切分点 s s 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}[\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] j,smin[c1minx(i)R1(j,s)(y(i)c1)2+c2minx(i)R2(j,s)(y(i)c2)2]
    在给定切分变量及切分点的条件下, c 1 c_1 c1 c 2 c_2 c2的最优值分别为:
    c ^ 1 = 1 N 1 ∑ x ( i ) ∈ R 1 ( j , s ) y ( i ) , c ^ 2 = 1 N 2 ∑ x ( i ) ∈ R 2 ( j , s ) y ( i ) \hat{c}_1=\frac{1}{N_1}\sum_{x^{(i)}\in R_1(j,s)}y^{(i)} , \quad\hat{c}_2=\frac{1}{N_2}\sum_{x^{(i)}\in R_2(j,s)}y^{(i)} c^1=N11x(i)R1(j,s)y(i),c^2=N21x(i)R2(j,s)y(i)
    其中 N m N_m Nm R m ( j , s ) , m = 1 , 2 R_m(j,s),m=1,2 Rm(j,s),m=1,2区域中样本点的个数。
    而最优的切分变量和切分点可通过遍历获得。

最小回归树生成算法

输入:训练数据集 D D D ,特征集 A A A
输出:回归树 f ( x ) f(x) f(x) 在训练集所在的特征空间中,递归地将每个区域划分为两个子区域并决定每一个子区域上的输出值,构建二叉决策树。

  1. 选择最优切分变量 j j j与切分点 s s s,具体地,依次对每个特征的每个取值进行遍历,计算出当前每一个可能的切分的误差,最后选择切分误差最小的切分变量和切分点对 ( j , s ) (j,s) (j,s)
  2. 用选定的对 ( j , s ) (j,s) (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\leq s\} , R_2(j,s)=\{x|x_j> s\} R1(j,s)={xxjs},R2(j,s)={xxj>s}
    c ^ 1 = 1 N 1 ∑ x ( i ) ∈ R 1 ( j , s ) y ( i ) , c ^ 2 = 1 N 2 ∑ x ( i ) ∈ R 2 ( j , s ) y ( i ) \hat{c}_1=\frac{1}{N_1}\sum_{x^{(i)}\in R_1(j,s)}y^{(i)} , \quad\hat{c}_2=\frac{1}{N_2}\sum_{x^{(i)}\in R_2(j,s)}y^{(i)} c^1=N11x(i)R1(j,s)y(i),c^2=N21x(i)R2(j,s)y(i)
  3. 对两个子区域,训练集为相应区域的数据,调用步骤1和2,直至满足停止条件;
  4. 将特征空间划分为 M M M个区域 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,生成决策树:
    f ( x ) = ∑ m = 1 M c ^ m I { x ∈ R m } f(x)=\sum_{m=1}^M \hat{c}_mI\{x\in R_m\} f(x)=m=1Mc^mI{xRm}
分类树的生成

特征选择
  分类树用基尼指数选择最优特征。
  分类问题中,假设有 K K K个类,样本点属于第 k k k类的概率为 p k p_k pk,则概率分布的基尼指数 定义为
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

  • 二分类问题:设样本点属于第一类的概率为 p p p,则 G i n i ( p ) = 2 p ( 1 − p ) Gini(p)=2p(1-p) Gini(p)=2p(1p)
  • 数据集 D D D,属于第 k k k类的样本子集 C k C_k Ck,其基尼指数为 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 Gini(D)=1k=1K(DCk)2
  • 数据集 D D D根据特征 A A A是否取某一可能值 a a a分割成两部分
    D 1 = { ( x , y ) ∈ D ∣ A ( x ) = a } , D 2 = D − D 1 D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1 D1={(x,y)DA(x)=a},D2=DD1
    则在特征 A A A的条件下, D D 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) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

  基尼指数 G i n i ( D ) Gini(D) Gini(D)表示集合 D D D的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) Gini(D,A)表示经 A = a A=a A=a分割后集合 D D D的不确定性。基尼指数越大,集合的不确定性越大。

CART生成算法
输入:训练集 D D D,停止计算的条件;
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每一个结点进行以下操作,构建二叉决策树:

  1. 设结点的训练数据集为 D D D,计算现有特征对该数据集的基尼指数,此时,对每一个特征 A A A,对其可能取得每个值 a a a,根据样本点对 A = a A=a A=a的测试为“是”或“否”,将 D D D分割成 D 1 D_1 D1 D 2 D_2 D2两部分,计算 A = a A=a A=a的条件下 D D D的基尼指数;
  2. 在所有可能的特征 A A A及其所有可能的切分点 a a a中,选择基尼指数最小的特征及对应的切分点作为最优特征与最优切分点,从现结点生成两个子结点,将训练集依特征分配到两个子结点;
  3. 对两个子结点递归调用1和2,直至满足停止条件;
  4. 生成CART决策树。

  算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(可判断样本基本属于同一类),或者没有更多特征。

CART剪枝

1. 剪枝,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn}

  定义剪枝过程中任一子树 T T T的损失函数为:
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT
其中 C ( T ) C(T) C(T)为对训练数据的预测误差(如基尼指数、平方差函数), ∣ T ∣ |T| T为子树的叶结点个数, α ≥ 0 \alpha\geq0 α0为参数。

  从整体树 T 0 T_0 T0开始剪枝。对 T 0 T_0 T0的任一内部结点 t t t

  • t t t为单结点树的损失函数是: C α ( t ) = C ( t ) + α C_\alpha(t)=C(t)+\alpha Cα(t)=C(t)+α
  • t t t为根结点的子树 T t T_t Tt的损失函数是: C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_\alpha(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+αTt

则剪枝后损失函数的增加量 C α ( t ) − C α ( T t ) = ( C ( t ) − C ( T t ) ) − α ( ∣ T t ∣ − 1 ) C_\alpha(t)-C_\alpha(T_t)=(C(t)-C(T_t))-\alpha(|T_t|-1) Cα(t)Cα(Tt)=(C(t)C(Tt))α(Tt1)是关于 α \alpha α的减函数,且当
α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} α=Tt1C(t)C(Tt)
时, C α ( T t ) = C α ( t ) C_\alpha(T_t)=C_\alpha(t) Cα(Tt)=Cα(t)

参数 α \alpha α反映了对模型复杂度的惩罚力度,考虑两种极端情形:当 α = 0 \alpha=0 α=0时,模型可以任意复杂,肯定复杂的模型预测误差小,即有 C α ( T t ) < C α ( t ) C_\alpha(T_t)<C_\alpha(t) Cα(Tt)<Cα(t);当 α → ∞ \alpha\rightarrow\infty α时,对模型复杂度的惩罚力度非常之大,以至于只能选择最简单的模型,即有 C α ( T t ) > C α ( t ) C_\alpha(T_t)>C_\alpha(t) Cα(Tt)>Cα(t)

  这表明,只要 α > C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha>\frac{C(t)-C(T_t)}{|T_t|-1} α>Tt1C(t)C(Tt),单点树的损失函数小于子树的损失函数,有必要对 T t T_t Tt剪枝,而 α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} α=Tt1C(t)C(Tt)时, T t T_t Tt t t t有相同的损失函数值,但 t t t的结点少,是能够对 T t T_t Tt剪枝的最小的 α \alpha α

  对 T 0 T_0 T0的任一内部结点 t t t,定义
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=Tt1C(t)C(Tt)
它表示剪枝后整体损失函数减少( g ( t ) < 0 g(t)<0 g(t)<0时)的程度。

  记 α 0 = 0 \alpha_0=0 α0=0 I ( T ) \mathcal{I}(T) I(T)表示树 T T T的所有内部结点,设
t 1 = min ⁡ t ∈ I ( T ) g ( t ) t_1=\min_{t\in\mathcal{I}(T)} g(t) t1=tI(T)ming(t)
T 0 T_0 T0中剪去 T t 1 T_{t_1} Tt1得到的子树记作 T 1 T_1 T1,同时将最小的 g ( t ) g(t) g(t)记为 α 1 \alpha_1 α1,则

  • ∀ α ∈ [ α 0 , α 1 ) \forall\alpha\in[\alpha_0,\alpha_1) α[α0,α1),在损失函数 C α ( T ) C_\alpha(T) Cα(T)最小化的准则下,树 T 0 T_0 T0(即不剪枝)是最优决策树,
  • ∀ α ∈ [ α 1 , + ∞ ) \forall\alpha\in[\alpha_1,+\infty) α[α1,+),树 T 1 T_1 T1(即剪枝)是最优决策树;

在树 T 1 T_1 T1的基础上,设
t 2 = min ⁡ t ∈ I ( T 1 ) g ( t ) t_2=\min_{t\in\mathcal{I}(T_1)} g(t) t2=tI(T1)ming(t)
T 1 T_1 T1中剪去 T t 2 T_{t_2} Tt2得到的子树记作 T 2 T_2 T2,同时将最小的 g ( t ) g(t) g(t)记为 α 2 \alpha_2 α2,则

  • ∀ α ∈ [ α 1 , α 2 ) \forall\alpha\in[\alpha_1,\alpha_2) α[α1,α2),在损失函数 C α ( T ) C_\alpha(T) Cα(T)最小化的准则下,树 T 1 T_1 T1(即不剪枝)是最优决策树,
  • ∀ α ∈ [ α 2 , + ∞ ) \forall\alpha\in[\alpha_2,+\infty) α[α2,+),树 T 2 T_2 T2(即剪枝)是最优决策树;

以此类推,可以得到,在 α ∈ [ α i , α i + 1 ) \alpha\in[\alpha_i,\alpha_{i+1}) α[αi,αi+1)定义的损失函数 C α ( T ) C_\alpha(T) Cα(T)最小化的准则下,树 T i T_i Ti是最优决策树, i = 0 , 1 , . . . , n − 1 i=0,1,...,n-1 i=0,1,...,n1,且 ∀ α ∈ [ α n , + ∞ ) \forall\alpha\in[\alpha_n,+\infty) α[αn,+),树 T n T_n Tn(即剪枝)是最优决策树;但是 α \alpha α取在哪个区域合适呢?即下述2.

2. 在剪枝得到的子树序列中通过交叉验证选取最优子树 T α T_\alpha Tα

  利用独立的验证数据集,测试子树序列中各子树的平均误差或基尼指数,平均误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn都对应一个参数范围 [ α i , α i + 1 ) , i = 0 , 1 , . . . , n − 1 [\alpha_i,\alpha_{i+1}),\quad i=0,1,...,n-1 [αi,αi+1),i=0,1,...,n1,所以,当最优子树 T k T_k Tk确定时,对应的 α k \alpha_k αk也确定了,即得到最优决策树 T α T_\alpha Tα

CART剪枝算法
输入:CART算法生成的决策树 T 0 T_0 T0
输出:最优决策树 T α T_\alpha Tα

  1. k = 0 , T = T 0 k=0,T=T_0 k=0,T=T0
  2. α = 0 \alpha=0 α=0
  3. 自下而上地对各内部结点 t t t计算 C ( T t ) C(T_t) C(Tt) ∣ T t ∣ |T_t| Tt以及
    g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=Tt1C(t)C(Tt)
    α = min ⁡ ( α , g ( t ) ) \alpha=\min (\alpha,g(t)) α=min(α,g(t))
  4. 自上而地访问内部结点 t t t,如果 g ( t ) = α g(t)=\alpha g(t)=α,进行剪枝,并对叶结点 t t t以多数表决法决定其类别,得到树 T T T
  5. k = k + 1 k=k+1 k=k+1 α k = α \alpha_k=\alpha αk=α T k = T T_k=T Tk=T
  6. 如果 T T T不是由根结点单独构成的树,回到步骤3;
  7. 采用交叉验证法在子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn}中选取最优子树 T α T_\alpha Tα

Python决策树

实现决策树

官方手册
class sklearn.tree.DecisionTreeClassifier(criterion=‘gini’, splitter=‘best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=‘deprecated’, ccp_alpha=0.0)
Methods:

  • fit(self, X, y[, sample_weight, …])
    根据训练集 ( X , y ) (X, y) (X,y)创建决策树分类模型。
  • predict(self, X[, check_input])
    预测 X X X的类别或回归值。
  • predict_proba(self, X[, check_input])
    预测样本集 X X X属于每一类的概率。
  • score(self, X, y[, sample_weight])
    返回给定测试集和标签下的平均精度。
from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
    train_test_split(housing.data, housing.target, test_size = 0.1, random_state = 42)#指定了随机种子,每次随机的结果一样,方便复现
#实例化
dtr = tree.DecisionTreeRegressor(random_state = 42)
#拟合
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)

决策树可视化

#在prompt中安装插件
pip install pydotplus
pip install graphviz
#载入库类
from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os       
os.environ["PATH"] += os.pathsep + 'F:\Graphviz2.38\bin'
##载入sciki-learn的自带数据,有决策树拟合,得到模型:
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
##将模型存入dot文件iris.dot。
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)
#1. 用graphviz的dot命令生成决策树的可视化文件
#这个命令在cmd命令行执行
dot -Tpdf iris.dot -o iris.pdf
#2. 用pydotplus生成iris.pdf。
import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None) 
graph = pydotplus.graph_from_dot_data(dot_data) 
graph.write_pdf("iris.pdf") 
#3. 直接把图产生在ipython的notebook。
from IPython.display import Image  
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png())

参考:
统计学习方法—李航
scikit-learn决策树算法类库使用小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值