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=1∑npilogpi其中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(X∣Y)=j=1∑np(yj)H(X∣yj)它度量了在知道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=1∑npilogpi
-
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(X∣Y)=j=1∑np(yj)H(X∣yj)
如对日志密度进行划分:- 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(X∣s)=−(1/3∗log(1/3)+2/3∗log(2/3))
H ( X ∣ l ) = − ( 1 ∗ l o g ( 1 ) ) H(X|l) = -(1*log(1)) H(X∣l)=−(1∗log(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(X∣m)=−(1/4∗log(1/4)+3/4∗log(3/4))
实现
- 初始化信息增益的阈值ε
- 判断样本是否为同一类输出 D i D_i Di,如果是则返回单节点树T。标记类别为 D i D_i Di
- 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别
- 计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征 A g A_g Ag
- 如果Ag的信息增益小于阈值ε,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
- 否则,按特征 A g A_g Ag的不同值 A g i A_{gi} Agi将对应的样本输出D分成不同的类别 D i D_i Di。每个类别产生一个子节点,对应特征值为 A g i A_{gi} Agi。返回增加了节点的树T。
- 对于所有子节点,令 D = D i D = D_i D=Di , A = A − A g A = A - {A_g} A=A−Ag递归调用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=1∑n∣D∣∣Di∣log2∣D∣∣Di∣其中n为特征A的类别数, D i D_i Di为特征A的第i个取值对应的样本个数。|𝐷|为样本个数。
-
选择最大增益率的属性来分裂。(特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题)
C4.5将连续的特征离散化
- 将m个样本根据连续特征值从小到大排列。
- 取相邻两样本特征值的平均数,会得m-1个划分点。
- 对于这m-1个点,分别计算以该点作为二元分类点时的信息增益(不是信息增益率)。
- 选择信息增益最大的点作为该连续特征的二元离散分类点。(比如取到的增益最大的点为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)=1−k=1∑K(∣D∣∣Ck∣)2
样本D,个数为 ∣ D ∣ |D| ∣D∣,假设K个类别,第k个类别的数量为 ∣ C k ∣ |C_k| ∣Ck∣
-
CART分类树算法每次仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。
- CART分类树算法对连续值的处理:
和C4.5类似,都是将连续的特征离散化。区别在于选择特征划分点时,C4.5是信息增益,CART是基尼系数 - CART分类树算法对离散值的处理:
不停的二分离散特征。 - 二分没有将特征A的取值完全分开,后面还会对子节点特征划分有影响。在ID3或C4.5的一颗子树中,离散特征(连续特征二分除外)只会参与一次节点的建立。
建立实现(基尼系数的阈值,样本个数阈值)
- 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。
- 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
- 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
- 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,左节点的数据集D为D1,右节点的数据集D为D2。
- 对左右的子节点递归的调用1-4步,生成决策树。
回归树
-
分类树的输出是样本的类别
回归树的输出是一个实数。 -
分类模型:采用基尼系数的大小度量特征各个划分点的优劣。
回归模型:采用和方差度量,对于划分特征A划分点s两边的数据集D1和D2,使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。 -
分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。
回归树采用叶子节点的均值或者中位数来预测输出结果。
CART树缺陷
- 选择一个最优的特征做分类决策,但大多数,分类决策不是由某一个特征决定,而是一组特征。
- 样本一点点改动,树结构剧烈改变。
- 比较复杂的关系,决策树很难学习
剪枝处理
-
Overfitting
噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。
缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。
多重比较:决策树在每个变量的每一个值中选取一个作为分割点,所以选出一个噪音分割标准的概率是很大的。 -
停止
决策树的构建过程是一个递归的过程,所以需要确定停止条件。
一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会导致过拟合问题。
另一种可行的方法是当节点中的记录数低于一个阀值时就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。 -
前置裁剪 (prepruning)
在构建决策树的过程时,提前停止。那么会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优,实践证明这种策略无法得到较好的结果。 -
后置裁剪 (postpruning)
决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点采用子树中最主要的分类;2)将一个子树完全替代另一个子树。后置裁剪问题在于计算效率的浪费。 -
K-Fold Cross Validation
计算出决策树T(训练数据集),N个叶节点。剪裁后剩余i个叶节点,i属于[1,N]。
对每种可能的i,使用K-Fold Validataion方法(验证数据集)计算裁剪到i个节点后的决策树的错误率,最后求出平均错误率。
用具有最小错误率对应的i作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。 -
Random Forest
Random Forest是用训练数据随机计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。