目录
1、决策树
1.1 ID3
1.2 C4.5
1.3 CART
1.4 预剪枝和后剪枝
2 bagging与随机森林
2.1 bagging
2.2 随机森林
3 极端随机树
4 GBDT
5 Adaboost
基本概念:从一组无次序、无规则的实例中推理出决策树表示形式的分类规则。
具体方法是:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归调用以上方法,构建决策树。
- 条件熵:
H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性:
- 信息增益:
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下的经验条件熵H(D|A)之差:
然后计算各特征对数据集D的信息增益。分别以A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征。
根据年龄有取值青年、中年、老年。
青年贷款是2条记录,否3条记录,共5条记录
中年贷款是3条记录,否2条记录,共5条记录
老年贷款是4条记录,否1条记录,共5条记录
年龄条件熵:
D1,D2,D3分别是年龄取值为青年、中年、老年的样本子集。
以年龄为条件的信息增益为
有工作的信息增益
有房子的信息增益
信贷情况的信息增益
由于特征A3(有自己房子)的信息增益值最大,所以选择特征A3作为根节点的特征。它将训练数据集划分为两个子集D1(A3取值为是)和D2(A3取值为否)。由于D1只有同一类样本点,可以明确要贷款给D1,所以它成为一个叶节点,节点类标记为“是”。
对于D2则需要从特征A1(年龄),A2(有工作)和A4(信贷情况)中选择新的特征。计算各个特征的信息增益。
缺点:
1.用信息增益选择属性时偏向于选择分枝比较多的属性值,即取值多的属性。
2.不能处理连续属性。
它是对ID3算法的改进,相对于ID3算法主要有以下几个改进
(1)用信息增益比来选择属性
(2)在决策树的构造过程中对树进行剪枝
(3)对非离散数据也能处理
(4)能够对不完整数据进行处理
信息增益比:
gain_ratio(S,A)=gain(S,A)/Split_info(S,A)
其中Split_info(S,A)为关于属性值的熵,利用熵公式计算。
对连续型变量由小到大递增排序,取相邻两个值的中点作为分裂点,然后按照离散型变量计算信息增益的方法计算信息增益,取其中最大的信息增益作为最终的分裂点。
首先计算不纯度,然后利用不纯度计算Gini指标,选取最小的Gini指标作为分裂属性。
不纯度:
某个自变量的Gini指标的计算方式如下:
算法停止计算的条件是节点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或者没有更多特征。
本次讲解参考的仍是周志华的《机器学习》
1、数据集
其中{1,2,3,6,7,10,14,15,16,17}为测试集,{4,5,8,9,11,12,13}为训练集。
2、预剪枝
预剪枝是在每一次实际对结点进行进一步划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。
(1)在未划分前,根据训练集,类别标记为训练样例数最多的类别,由于训练集中的好瓜与坏瓜是相同多的类别,均为5,因此任选其中一类,书中选择了好瓜作为标记类别。
当所有节点集中在根节点,所有训练集属于标记类别的仅有{4,5,8},因此分类正确的是3/7*100%=42.9%
编号 |
好瓜(正确结果) |
4 |
是 |
5 |
是 |
8 |
是 |
9 |
否 |
11 |
否 |
12 |
否 |
13 |
否 |
|
3/7 |
(2)计算训练集的信息增益,得知脐部的信息增益最大,因此按照脐部进行划分。又因为在训练集中,凹陷特征好瓜的占比多,因此凹陷划分为好瓜,稍凹特征好过占比多,因此将其标记为好瓜,因此按照脐部划分的子树结果如下:
划分后,对比结果如下:
编号 |
好瓜(正确结果) |
按照脐部划分 |
4(凹陷) |
是 |
是 |
5(凹陷) |
是 |
是 |
8(稍凹) |
是 |
是 |
9(稍凹) |
否 |
是(划分错误) |
11(平坦) |
否 |
否 |
12(平坦) |
否 |
否 |
13(凹陷) |
否 |
是(划分错误) |
正确率 |
3/7 |
5/7(精度提高,划分) |
(3)在脐部划分的基础上,进一步计算凹陷、根蒂特征下,其他属性的信息增益,根据计算结果可知,在凹陷的情况下,色泽的信息增益最大,因此对于凹陷的西瓜,进一步确定按照色泽进行划分,划分结果如下:
对于凹陷数据,进一步按照色泽进行划分后,对比划分前后的准确性:
编号 |
好瓜(正确结果) |
按照脐部划分 |
对凹陷,按照色泽划分 |
4(凹陷、青绿) |
是 |
是 |
是 |
5(凹陷、浅白) |
是 |
是 |
否 |
8(稍凹) |
是 |
是 |
是(不满足条件的,按照上一次划分结果照写) |
9(稍凹) |
否 |
是(划分错误) |
是 |
11(平坦) |
否 |
否 |
否 |
12(平坦) |
否 |
否 |
否 |
13(凹陷、青绿) |
否 |
是(划分错误) |
是 |
正确率 |
3/7 |
5/7(精度提高,划分) |
4/7(精度降低,不划分) |
对稍凹数据集,进一步计算其他属性的信息增益,确定根蒂的信息增益最大,因此对稍凹,进一步按照根蒂进行划分:
对于稍凹数据,进一步按照根蒂进行划分后,对比划分前后的准确性:
编号 |
好瓜(正确结果) |
按照脐部划分 |
对稍凹,按照根蒂划分 |
4(凹陷) |
是 |
是 |
是(不满足条件的,按照上次换发你结果照写) |
5(凹陷) |
是 |
是 |
是 |
8(稍凹、蜷缩) |
是 |
是 |
否 |
9(稍凹、蜷缩) |
否 |
是(划分错误) |
否 |
11(平坦) |
否 |
否 |
否 |
12(平坦) |
否 |
否 |
否 |
13(凹陷) |
否 |
是(划分错误) |
是 |
正确率 |
3/7 |
5/7(精度提高,划分) |
5/7(精度不变,不划分) |
(4)因此按照预剪枝,最终形成的决策树如下图,其泛化性为71.4%。
由图可知,预剪枝使得很多分支没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间。但是,有些分支虽当前不能提升泛化性。甚至可能导致泛化性暂时降低,但在其基础上进行后续划分却有可能导致显著提高,因此预剪枝的这种贪心本质,给决策树带来了欠拟合的风险。
3、后剪枝
后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。
(1)我在此生成的决策树上将测试集的数据在此树上进行了标记,如下图所示:
对比标记节点的划分类与各数据的真实分类,计算准确率,如下表所示:
编号 |
好瓜(正确结果) |
按照整棵树进行划分 |
4 |
是 |
是 |
5 |
是 |
否 |
8 |
是 |
否 |
9 |
否 |
是 |
11 |
否 |
否 |
12 |
否 |
否 |
13 |
否 |
是 |
正确率 |
|
3/7 |
生成的决策树,在验证集上的准确度为3/7*100%=42.9%
(2)后剪枝将从决策树的底部往上进行剪枝,先看最底部的纹理,将其领衔的分支减掉,即将其换成叶子节点。由于在训练集上,替换后,包含的样本号为{7,15},好瓜坏瓜比例相等,因此选择好瓜进行标记,剪枝后的决策树为:
编号 |
好瓜(正确结果) |
按照整棵树进行划分 |
减掉底部纹理划分 |
4 |
是 |
是 |
是(其他不变,照写) |
5 |
是 |
否 |
否 |
8 |
是 |
否 |
是(改变) |
9 |
否 |
是 |
是 |
11 |
否 |
否 |
否 |
12 |
否 |
否 |
否 |
13 |
否 |
是 |
是 |
正确率 |
|
3/7 |
4/7(准确率提高) |
当减掉底部纹理划分后,准确率提高,因此按照纹理划分需裁剪掉。
(3)接着往上裁剪,此时应该是色泽部分,由于在训练集上,替换后,包含的样本号为{6,7,15},好瓜(2个)多于坏瓜(1个),因此选择好瓜进行标记,剪枝后的决策树为:
编号 |
好瓜(正确结果) |
按照整棵树进行划分 |
减掉底部纹理划分 |
减掉底部色泽划分 |
4 |
是 |
是 |
是(其他不变,照写) |
是(其他不变,照写) |
5 |
是 |
否 |
否 |
否 |
8 |
是 |
否 |
是(改变) |
是 |
9 |
否 |
是 |
是 |
是 |
11 |
否 |
否 |
否 |
否 |
12 |
否 |
否 |
否 |
否 |
13 |
否 |
是 |
是 |
是 |
正确率 |
|
3/7 |
4/7(准确率提高) |
4/7(准确率不变) |
此时决策树验证集精度仍为57.1%,因此可不进行剪枝,即对于脐部稍凹,根蒂稍蜷部分,可保留按照色泽进一步划分。
(4)接下来,我们看脐部凹陷分支。由于在训练集上,将色泽替换为叶节点后,包含的样本号为{1,2,3,14},好瓜(3个)多于坏瓜(1个),因此选择好瓜进行标记,剪枝后的决策树为:
编号 |
好瓜(正确结果) |
按照整棵树进行划分 |
减掉底部纹理划分 |
减掉底部色泽划分 |
减调色泽划分(最左侧色泽) |
4 |
是 |
是 |
是(其他不变,照写) |
是(其他不变,照写) |
是 |
5 |
是 |
否 |
否 |
否 |
是(新划分,发生改变) |
8 |
是 |
否 |
是(改变) |
是 |
是(其他不变,照写) |
9 |
否 |
是 |
是 |
是 |
是 |
11 |
否 |
否 |
否 |
否 |
否 |
12 |
否 |
否 |
否 |
否 |
否 |
13 |
否 |
是 |
是 |
是 |
是 |
正确率 |
|
3/7 |
4/7(准确率提高) |
4/7(准确率不变) |
5/7(准确率提高) |
当减掉最左侧色泽划分后,准确率提高,因此按照色泽划分需裁剪掉。
(5)整棵树遍历基本完成,因此该决策树最终后剪枝的结果如下图所示,其验证精度为71.4%。
4、总结
对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。
算法流程:
输入为样本集D={(x,y1),(x2,y2),...(xm,ym)},弱学习器算法, 弱分类器迭代次数T。
输出为最终的强分类器f(x)
1)对于t=1,2...,T:
a)对训练集进行第t次随机采样,共采集m次,得到包含m个样本的采样集Dt
b)用采样集Dt训练第t个弱学习器Gt(x)
2) 如果是分类算法预测,则T个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,T个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。
随机森林是bagging的改进,特征随机选择。当可以生成好决策树后,就比较容易生成随机森林了。接下来是随机森林的构造过程,如下所示:
第一、假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
第二、当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
第三、决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
最后、按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
从上面的步骤可以看出,随机森林的随机性体现在每颗数的训练样本是随机的,树中每个节点的分类属性也是随机选择的。有了这2个随机的保证,随机森林就不会产生过拟合的现象了。
随机森林有2个参数需要人为控制,一个是森林中树的数量,一般建议取很大。另一个是m的大小,推荐m的值为M的均方根。其中减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m。通过oob误分率误分率解决。
随机森林分类效果(错误率)与两个因素有关:
缺点:
1. 据观测,如果一些分类/回归问题的训练数据中存在噪音,随机森林中的数据集会出现过拟合的现象。
2. 比决策树算法更复杂,计算成本更高,需要更多的时间来训练。
随机森林里的随机包含的意思是:
样本随机
特征随机
参数随机
模型随机(ID3 ,C4.5)
极限树/极端随机树里的随机包含的意思是:
特征随机
参数随机
模型随机(ID3 ,C4.5)
分裂随机
ET或Extra-Trees(Extremely randomized trees,极端随机树)算法与随机森林算法十分相似,都是由许多决策树构成。极限树与随机森林的主要区别:
1、randomForest应用的是Bagging模型,extraTree使用的所有的样本,只是特征是随机选取的,因为分裂是随机的,所以在某种程度上比随机森林得到的结果更加好
2、随机森林是在一个随机子集内得到最佳分叉属性,而ET是完全随机的得到分叉值,从而实现对决策树进行分叉的。
GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树(基于CART树)。GBDT的原理很简单,就是所有弱分类器的结果相加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(这个残差就是预测值与真实值之间的误差)。
GBDT 既可以做回归也可以做分类,下面先描述一下做回归的算法流程:
已知一个训练数据集 T = {(x1,y1),(x2,y2),...,(xn,yn)}, 如果将训练集分为不同的区域 R1,R2,...,Rn,然后可以确定每个区域输出的常识 c,c 的计算是将每个区域的 y 值相加再除以 y 的个数,其实就是求一个平均值。树可以表示为:
然后通过下图方式来确定具体分割点:
我将李航的统计学方法里面的例子粘出来,就知道提升树是如何计算的了:
以上就是 GBDT 选择分割点的过程, 如果特征有多个的话也是一样的道理,选择特征和特征值使得误差最小的点,作为分割点。所以其实 GBDT 也可以用作特征选择,通过GBDT 可以将重要的特征选择出来,当特征非常多的时候可以用来做降维。然后再融合类似逻辑回归这样的模型再进行训练。
优点
缺点:
例子如下:
Adaboost与GBDT区别:Adaboost强调Adaptive(自适应),通过不断修改样本权重(增大分错样本权重,降低分对样本权重),不断加入弱分类器进行boosting。而GBDT则是旨在不断减少残差(回归),通过不断加入新的树旨在在残差减少(负梯度)的方向上建立一个新的模型。——即损失函数是旨在最快速度降低残差。
优点
1) Adaboost是一种有很高精度的分类器
2) 可以使用各种方法构建子分类器,Adaboost算法提供的是框架
3) 当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单
4) 简单,不用做特征筛选
5) 不用担心overfitting(过度拟合)
缺点
1) 容易受到噪声干扰,这也是大部分算法的缺点
2) 训练时间过长
3) 执行效果依赖于弱分类器的选择
参考博客链接:
https://blog.csdn.net/gumpeng/article/details/51397737
https://blog.csdn.net/zfan520/article/details/82454814
https://blog.csdn.net/lc574260570/article/details/81813889
https://www.jianshu.com/p/405f233ed04b
https://www.cnblogs.com/ScorpioLu/p/8295990.html