以下内容笔记出自‘跟着迪哥学python数据分析与机器学习实战’,外加个人整理添加,仅供个人复习使用。
决策树顾名思义是以树状图的形式来进行决策。包括根节点、非叶子节点与分支、叶子节点,开始时所有数据都聚集在根节点,然后通过各种条件判断合适的前进方向,最终达到不可再分的节点,因而完成整个生命周期。
那么问题来了,根节点选择什么特征来划分?下一个节点按照什么特征划分?
首先我们要知道,分类模型是希望同一类别的数据放在一起,不同类别的数据分开。如果模型将各种类别的数据混在一起,说明划分效果是比较差的。如何为模型的分类效果确定衡量标准?
熵值 熵值越高,混乱程度越高(对数以2为底): 看图说话,当x=1时,y取值为0,在熵值的计算公式中,p∈[0,1],当p=1时(如果一个节点所有数据都是同一类别),熵值最小为0,当p<1趋近于0时,对数函数的绝对值增大: 如上图,当p=0或p=1时,H§=0,表明随机变量没有不确定性; 当p=0.5时,H§=1,此时随机变量的不确定性最大!信息增益 现在已经知道熵值可以用来表示数据分类的信息量,数据划分前可以计算本身熵值,如果数据划分后的熵值能够降低,说明数据的不确定性降低(划分后数据归属的类比较合适,没那么乱,信息不繁杂了),这次划分是有价值的,因此可以计算划分前后的熵值差,来监测划分是否值得。这个差叫做信息增益: 或者表示的简洁些: 这里选择特征时,数据划分前的H(D)对于任何特征来讲都是不变的,所以H(D|A)越小,g(D,A)越大,重点在H(D|A)上,假设在A特征下,所有样本都是一类,那么: 此时,g(D,A)最大,即信息增益最大,A作为特征节点非常合适!在分类模型中,我们会确定许多特征,选择哪一个特征做划分,标准就依靠信息增益。通过遍历数据集中的所有特征,使信息增益最大的特征,就是我们的目标特征(根节点),然后在剩下的特征中再找使信息增益最大的特征,直到构建完整个模型。 ID3算法使用信息增益作为选择特征节点的依据。
信息增益率 已知信息增益反映了特征A使类不确定性减少的程度,但存在一个问题是,假设样本n个,有一个特征的各样本取值特征值非常多,各不相同(联想ID特征),那么这个特征的每一个值都对应一个样本,计算熵值时: 这种情况下,的确每一个特征下的样本都属于一类(因为只有一个样本…),信息增益会最大,但显然这个特征不是我们想要的特征,因此信息增益失效,需要信息增益比率。 这时再看ID这样的特征,由于取值可能性太多,自身熵值已经足够大,如果将自身熵值作为分母,信息增益作为分子,此时即便信息增益比较大,整体的信息增益率也会小。 C4.5算法使用信息增益比率作为选择特征节点的依据。基尼系数 同样是p=0或p=1时,Gini§=0,不确定性最小;p越接近于1,Gini§越接近于0。基尼系数越大,不确定性越高。现在已经知道如何建立决策树,理想情况是根据特征,决策树尽量大的分裂下去,但实际中容易在测试集中效果变差,形成过拟合,因此需要限制树模型的规模。 剪枝策略: (1)预剪枝 在构造决策时的同时,通过限制参数来限制复杂度,常用的停止条件有树的层数、叶子节点个数、信息增益阈值等指标,当达到停止条件时会停止。 (2)后剪枝 决策树构建完成后,通过一定标准对其中节点进行判断。但比较麻烦,常用的为预剪枝,直接用各种指标限制决策树生长。
连续型自变量特征: 以上是自变量为离散特征的场景,当自变量是连续特征时,这时不仅需要找到最合适的特征,还要找到最合适的特征切分点。如何选择合适的切分点?
需要不断尝试,也就是不断二分: 其实质就是将连续属性离散化,对于每一个分割点,计算当前信息增益值的带下,选择使信息增益最大的切分点,来将这个连续属性值转化为离散值,然后再参与全部特征是否作为划分节点的筛选。 (也可以人为选择合适的切分点)
回归问题: 由熵值与基尼系数的计算过程可以看出,主要是评估分类问题,那回归问题如何解决?
参考信息增益的思想,回归问题同样希望类似数据划分在一起,用来衡量连续数据不同样本之间差异最好的方法是方差,寻找使得方差最小的特征作为特征节点(离散特征、转化为离散特征的连续特征)。
最终的预测结果,分类问题中,某一叶子节点取众数,哪种类别多,叶子节点的最终预测类别就是多数类别的;回归问题中,通常取平均值作为预测结果。
