符号定义
- D D D为训练数据集, ∣ D ∣ |D| ∣D∣为训练数据集样本个数
- C C C为样本所属类别, C k C_k Ck表示样本所属为第 k k k类, ∣ C k ∣ |C_k| ∣Ck∣表示所属第 k k k类的样本数, ∑ k = 1 K ∣ C k ∣ = ∣ D ∣ \sum_{k=1}^K|C_k|=|D| ∑k=1K∣Ck∣=∣D∣
- A A A为特征集, A k A_k Ak表示第 k k k个特征,$a_i\in {a_1,a_2, … , a_n} 是 是 是A_k 的 所 有 取 值 , 的所有取值, 的所有取值,a_i 可 以 把 数 据 集 分 为 可以把数据集分为 可以把数据集分为n 个 子 集 , 个子集, 个子集,D_i \in {D_1,D_2, … , D_n} , , ,\sum_{k=1}^K|D_k|=|D|$
- D i k D_{ik} Dik为子集 D i D_i Di属于 C k C_k Ck的样本集合,即 D i k = D i ∩ C k D_{ik}=D_i \cap C_k Dik=Di∩Ck, ∣ D i k ∣ |D_{ik}| ∣Dik∣为子集 D i D_i Di属于 C k C_k Ck的样本个数
增益计算
-
数据集 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=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣ -
特征 A A A对数据 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A)
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(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
其中 n n n为特征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 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 = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^n \frac {|D_i|} {|D|} log_2 \frac {|D_i|} {|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,其中 n n n为特征A的取值个数。
树的生成
- ID3:特征选择靠信息增益
- C4.5:特征选择靠信息增益率
- CART:回归树靠均方误差,分类树靠Gini系数
- 如果该节点上的数据仅有一种类别,则停止生长置T为单节点树,并将该类别作为节点的输出,返回树T
- 如果特征集 A = ∅ A=\emptyset A=∅,则停止生长置T为单节点树,并将属于该节点样本数最多的类别作为节点的输出,返回树T
- 否则,在特征集中计算增益,ID3计算信息增益,C4.5计算信息增益率,选择最大增益的特征作为父节点
- 如果3中增益小于预设的某一阈值 ϵ \epsilon ϵ,则停止生长置T为单节点树,并选择属于该节点样本数最多的类别作为该节点的输出,返回树T
- 否则,对该特征 A g A_g Ag的每一个取值,将样本分割成若干非空子集 D i D_i Di并设置为子节点 i i i,父子节点构成树T,返回T
- 对节点 i i i,以 D i D_i Di为训练集,以 A − A g A-A_g A−Ag为特征集递归的调用1~5
树的剪枝
- 决策树的剪枝
已生成的整数T,给定的参数α
- 计算每个节点的经验熵, H t ( T ) = − ∑ k ( N t k N t ) ∗ l o g ( N t k N t ) H_t(T)=-\sum_{k}(\frac {N_{tk}}{N_t})*log(\frac {N_{tk}}{N_t}) Ht(T)=−∑k(NtNtk)∗log(NtNtk),损失函数为 C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣
- 递归的从叶节点回溯,自下而上的比较回溯前树 T b T_b Tb和回溯后 T a T_a Ta的损失函数,如果 C α ( T a ) ≤ C α ( T b ) C_{\alpha}(T_a) \le C_{\alpha}(T_b) Cα(Ta)≤Cα(Tb),即剪枝后整树的损失函数减小了,那么将该叶子节点以下的树剪枝,将该叶子设置为新的父节点
- 返回(2),直到不能继续位置,得到损失最小的子树 T α T_{\alpha} Tα
以上过程可以使用动态规划实现
- CART树的剪枝
同ID3和C4.5一样,自下而上的剪枝,比较剪枝前后的loss变化,如果减小了就剪枝,否则保留