sklearn.tree
- 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
- 构造决策树的关键步骤是分裂属性,就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
1.属性是离散值且不要求生成二叉决策树。此时用属性的每一个结果作为一个分支。
2.属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于 此子集”和“不属于此子集”分成两个分支
3.属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。
ID3
- 决策树ID3算法的核心思想是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
- 熵度量了事物的不确定性,越不确定的事物,熵就越大。(如1/2,1/2 > 1/3, 2/3)
举例进行描述
-
现状态的信息熵(熵度量):
- pi为 yes/no类别在整个训练元组中出现的概率
- m即为2
-
划分后的期望信息熵:
如对日志密度进行划分:- v为3,D为10
- Djs = 3
Djl = 3
Djm = 4 - info(Djs) = -(1/3log(1/3) + 2/3log(2/3)) —即yes/no在s中出现的概率
info(Djl) = -(1log(1))
info(Djm) = -(1/4log(1/4) + 3/4*log(3/4))
-
信息增益就是两者的差值:
-
ID3决策树算法就是在每次分裂的时候贪心选择信息增益最大的属性,作为本次树分裂属性,所谓信息增益最大,实际上就是对最后的输出影响最大。
实现
- 初始化信息增益的阈值ε
- 判断样本是否为同一类输出Di,如果是则返回单节点树T。标记类别为Di
- 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别
- 计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征Ag
- 如果Ag的信息增益小于阈值ε,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
- 否则,按特征Ag的不同值Agi将对应的样本输出D分成不同的类别Di。每个类别产生一个子节点。对应特征值为Agi。返回增加了节点的数T。
- 对于所有子节点,令D = Di ,A = A- {Ag}递归调用2-6步,得到子树Ti并返回。
ID3缺陷
- ID3没考虑连续特征,比如长度,密度都是连续值
- ID3用信息增益作为标准容易偏向取值较多的特征。然而在相同条件下,取值比较多的特征比取值少的特征信息增益大。(如:每个ID都对应一个类别)
- ID3算法没考虑缺失值问题
C4.5
- C4.5算法定义的分裂信息(和ID3类似):
- 不同于ID3的信息增益,C4.5将其定义为信息增益率:
- 选择最大增益率的属性来分裂。(特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题)
C4.5将连续的特征离散化
- 将m个样本根据连续特征值从小到大排列。
- 取相邻两样本特征值的平均数,会得m-1个划分点。
- 对于这m-1个点,分别计算以该点作为二元分类点时的信息增益(不是信息增益率)。
- 选择信息增益最大的点作为该连续特征的二元离散分类点。(比如取到的增益最大的点为at,则小于at的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。)
对于缺失值处理的问题
- 将缺失特征的样本同时划分入所有的子节点,划分权重按各个子节点无缺失样本的数量比例来分配
C4.5缺陷
- C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。
- C4.5只能用于分类。
- C4.5生成的是多叉树,相较二叉树运算效率低。
CART
分类树
-
CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(比)相反。
-
样本D的基尼系数表达式:
样本D,个数为|D|,假设K个类别,第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是用训练数据随机计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。