转自
算法杂货铺--决策树
决策树和随机森林学习笔记-欢迎补充
http://www.cnblogs.com/fionacai/p/5894142.html
决策树- 基础概念
熵
熵是表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为
P(X=xi)=pi,i=1,2,⋯,n
则随机变量的熵定义为
另外,0log0=0,当对数的底为2时,熵的单位为bit;为e时,单位为nat。
熵越大,随机变量的不确定性就越大。从定义可验证
0≤H(p)≤logn
算法思想
基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类。
就是通过一棵按照属性分裂出来的二叉树,多叉树,最后决定这一组样本所属的类别。
内部节点标示属性、叶子节点存放所属的类别。
图示如下:
通过根节点根据这些属性对下走,很容易判断出来这组属性的瓜是属于好瓜还是坏瓜。
信息熵下降越快,说明信息越明确,就是寻找纯度最好的分类方法,纯度通俗点理解就是目标变量要分得足够开(y=1的和y=0的混到一起就会不纯)。
决策树分裂算法
决策树使用比较简单,那么如何构建就成了关键。
一般来说,可以选择的属性很多,那么每一步应该选择哪个分支,这是根据前面的原来判断信息熵下降最快的分支作为分裂的分支。
而判断信息熵下降情况的有三种算法:
ID3算法: 使用信息增益作为不纯度,核心思想是以信息增益度量属性选择,选择分裂后的信息增益最大的,也就是熵在分裂前后差值最大的属性进行分裂。
根据log(x)的函数可知,p值越小,熵越大,所以当分组完全是会出现p=0此时熵最大,概率为0说明已经最纯了。
学习数据挖掘技术的最好方法是找到详细案例和看懂计算过程。有时算法虽然不难,但公式表达很难理解。
表中S、M和L分别表示小、中和大。
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,试用ID3算法构造决策树。
解:设D为10个样本集,其中决策属性(真实账户/R)有7个YES、3个NO。决策属性信息熵为:
如果按照日志密度来分类:计算日志密度熵值,日志密度分为3类S,L,M
其中L分类,样本总数10,L类3,L类中假账号0 真实账号3
所以:
所以gain(L) = 0.876-0.603 = 0.273
同理计算好友密度信息增益:
计算真实头像的信息增益:
因为好友密度(F)具有最大的信息增益(好友密度信息熵最小,最易分割),所以第一次分裂选择好友密度F为分裂属性(实际中如果特征非常多是随机选择一些特征然后计算后选取的不能遍历所有情况),分裂后的结果如下:
图中:按好友密度(F)分割树,水平M和L为单一水平决策属性分支(树叶),没有必要继续分割。水平S包含决策属性的不同水平,应该继续分割。待分割决策信息表为:
此时,设D为4个样本集,其中决策属性(真实账户/R)有1个YES、3个NO。决策属性信息熵为:
日志密度属性期望信息熵为:
真实头像属性期望信息熵为:
因为日志密度(L)具有最大的信息增益,所以第二次分裂选择日志密度(L)为分裂属性,分裂后的结果如下图表示:
图中,日志密度为M时,无法做出判断、也无法继续进行分裂。至此,决策树构建完毕。
设某人在SNS社区中的好友密度为L或M,无论其它属性水平取值如何,均可判定为是真实账户;如果某人在SNS社区中的好友密度为S、日志密度也为S,可判定为是虚假账户;如果某人在SNS社区中的好友密度为S、日志密度为M,应根据真实头像信息做出判断,由于样本过少,无法继续进行。
C4.5算法:使用信息增益率作为不纯度。
ID3算法是决策树的一个经典的构造算法,但ID3算法也存在一些问题,比较突出的缺陷是信息增益的计算依赖于特征水平较多的特征,而属性取值最多的属性并不一定最优。例如,投掷一枚分币和一个色子这两个随机试验,所有可能的期望信息熵为:
通过信息熵的定义可知,在给定特征水平数条件下,各水平发生概率相等(如掷筛子6个数字发生的概率都为1/6。期望信息熵最大。所以,当决策信息中某个变量特征水平较多时,ID3算法按信息增益指标往往会选择该变量或属性做为分割节点。
I、“分裂信息”公式
C4.5算法首先定义了“分裂信息”,其定义可以表示成:
II、增益率
III、分裂信息和增益率计算实例
在ID3算法案例中(SNS社区中不真实账号检测),决策属性信息熵为:
把决策属性替换成其它属性,即为各属性分裂信息熵。
日志密度分裂信息:
好友密度分裂信息:
真实头像分裂信息:
由前面ID3算法已知,
各属性增益率为,
由上述计算结果可知“好友密度”在属性中具有最大的信息增益比,取“好友密度”为分割属性,引出一个分枝,样本按此划分。对引出的每一个分枝再用此分类法进行分类,再引出分枝。
某属性的信息增益除以分裂信息,消除了属性水平数量多少的影响,使得分裂属性的选择更加合理。
CART:: 使用基尼系数函数作为不纯度。
决策树方法是会把每个特征都试一遍,然后选取那个,能够使分类分的最好的特征,也就是说将A属性作为父节点,产生的纯度增益(GainA)要大于B属性作为父节点,则A作为优先选取的属性。既可以做分类,也可以做回归。只能形成二叉树。
分支条件:二分类问题
分支方法:对于连续特征的情况:比较阈值,高于某个阈值就属于某一类,低于某个阈值属于另一类。对于离散特征:抽取子特征,比如颜值这个特征,有帅、丑、中等三个水平,可以先分为帅和不帅的,不帅的里面再分成丑和中等的。
得分函数(y):就是上面提到的gt(x),对于分类树取得是分类最多的那个结果(也即众数),对于回归树取得是均值。
损失函数:其实这里的损失函数,就是分类的准则,也就是求最优化的准则
对于分类树(目标变量为离散变量):同一层所有分支假设函数的基尼系数的平均。
对于回归树(目标变量为连续变量):同一层所有分支假设函数的平方差损失
对于分类树(目标变量为离散变量):使用基尼系数作为分裂规则。比较分裂前的gini和分裂后的gini减少多少,减少的越多,则选取该分裂规则,这里的求解方法只能是离散穷举。关于基尼系数,可以参考周志华的西瓜书决策树那章,讲得比较简洁,也比较易懂。“直观来说,(数据集D的基尼系数)Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此Gini(D)越小,则数据集D的纯度越高。”
具体这个的计算,我觉得有例子才好理解,下面这个红绿球的例子很好的说明了,如何根据损失函数最小(也就是基尼系数最小)来选取分裂规则。最后GIINs2更小,因此选择它作为分类规则。
对于回归树(目标变量为连续变量):使用最小方差作为分裂规则。只能生成二叉树。
缺点补充几点,不是很稳点,数据变化一点,你的树就会发生变化;没有考虑变量之间相关性,每次筛选都只考虑一个变量(因此不需要归一化);只能线性分割数据;贪婪算法(可能找不到最好的树)。优点也补充三点,同时可以处理分类变量和数值变量(但是可能决策树对连续变量的划分并不合理,所以可以提前先离散化);可以处理多输出问题;另外决策树不需要做变量筛选,它会自动筛选;适合处理高维度数据。
三种方法对比:
ID3的缺点,倾向于选择水平数量较多的变量,可能导致训练得到一个庞大且深度浅的树;另外输入变量必须是分类变量(连续变量必须离散化);最后无法处理空值。
C4.5选择了信息增益率替代信息增益。
CART以基尼系数替代熵;最小化不纯度而不是最大化信息增益。
剪树:
如何停止分裂
下面这六种情况都会停止分裂。
其中第一种其实属于树的完全长成,但这会出现过拟合问题,所有之前很流行一种抑制这种情况的方法,叫树的剪枝
树的剪枝分为预剪枝和后剪枝,预剪枝,及早的停止树增长控制树的规模,方法可以参考如下6点停止分类的条件。后剪枝在已生成过拟合决策树上进行剪枝,删除没有意义的组,可以得到简化版的剪枝决策树,包括REP(设定一定的误分类率,减掉对误分类率上升不超过阈值的多余树)、PEP,还有一种CCP,即给分裂准则—基尼系数加上惩罚项,此时树的层数越深,基尼系数的惩罚项会越大。
随机森林
尽管有剪枝等等方法,一棵树的生成肯定还是不如多棵树,因此就有了随机森林,解决决策树泛化能力弱的缺点。(可以理解成三个臭皮匠顶过诸葛亮)
而同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。
随机森林在bagging的基础上更进一步:
样本的随机:从样本集中用Bootstrap随机选取n个样本
特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)
重复以上两步m次,即建立了m棵CART决策树
这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)
关于调参:1.如何选取K,可以考虑有N个属性,取K=根号N
2.最大深度(不超过8层)
3.棵数
4.最小分裂样本树
5.类别比例
决策树的重要参数都是防止过拟合的. 有2个参数是关键,min_samples_leaf 这个sklearn的默认值是1,经验上必须大于100,如果一个节点都没有100个样本支持他的决策,一般都被认为是过拟合;max_depth 这个参数控制树的规模。决策树是一个非常直观的机器学习方法。一般我们都会把它的决策树结构打印出来观察,如果深度太深对于我们的理解是有难度的。