决策树算法
决策树算法也属于分类算法,该算法和我记得的一个游戏的理念相类似,就是很多人,但是当符合一定条件人留下,不符合条件的人将排除,层层晒选。也就和我们的考研模式相类似。接下来就用更具体的图例进行说明。例如,西瓜的生熟判断情景。
假如我们要判断一个西瓜是不是一个好瓜, 如果是你, 你会怎么做?ok, 也许你会去先观察它的【纹理】,然后再去听它的【响声】, 然后可能你还会去看它的【根蒂】… 上面你看的或听的这些我们都称之为西瓜的每个特征,而每个特征都会有不同的属性值, 比如【纹理】就有【清晰】和【模糊】两种属性值,具体如下图所示:接下来用一棵简单的决策树来示意一下上面的决策过程:
估计大家对决策树的决策过程有了大致的了解,接下来我们就说一说这样的一个决策过程到底是怎么生成的。
基于上图决策树,【纹理,响声,根蒂】我们称之为根节点或者分支节点,那么首先决策树的根节点【纹理】我们是如何选择出来的?一般而言, 我们希望随着划分过程的不断进行, 决策树的每一个节点包含的样本尽可能属于同一类,也就是说节点的"纯度"越来越高,因此数据集的划分必须遵循以下原则:
数据集划分的原则:将无序的数据变得有序。我们可以使用多种方法, 在这里我们使用信息论来度量信息, 信息论是量化处理信息的分支学科,我们可以在划分数据之前或者之后使用信息论量化度量信息的内容。
在划分数据集之前之后信息发生的变化称为信息增益,知道了如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是当前最好的划分数据集选择。
学习决策树算法首先就需要掌握一些知识点:
熵、联合熵、条件熵、信息增益、基尼不纯度
熵:熵的本质是一个系统“内在的混乱程度”
联合熵:联合熵是一集变量之间不确定性的衡量手段。
条件熵:
信息增益:
基尼不纯度:基尼不纯度,是指将来自集合中的某种结果随机应用在集合中,某一数据项的预期误差率。是在进行决策树编程 的时候,对于混杂程度的预测中,一种度量方式。其公式为:IG(f)=∑i=1mfi(1−fi)=∑i=1mfi−∑i=1mf2i=1−∑i=1mf2i
2.决策树算法(ID3、C4.5、CART分类树)原理及应用场景
ID3:
ID3算法的核心思想即在决策树的各个节点上使用信息增益选择特征。从根节点开始,计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,再根据该特征的取值建立子节点,对子节点递归调用上述过程
输入:训练数据集D,特征A,阈值beta :
输出:决策树T
1)若D中所有实例属于同一类Ck则T为单节点树,并将Ck作为该节点的类标记,返回T
2)若A为空集,则通过统计D中实例数最大的类作为该节点类标记(即对于某一节点而言,没有其它特征可以进行分辨了,则对将该节点的类设置为分到该节点数据最多属于的类中),返回T
3)否则计算A中各特征对D的信息增益,选择信息增益最大的特征 Ag :
信息增益:g(D,A)=H(D)−H(D|A)
4)若Ag的信息增益小于阈值,则将T作为单节点树,将D中实例数最大的类作为该节点的标记
5)否则,对Ag每一个可能值 ai 将D划分为若干非空子集,将子集中实例数最大的类作为标记,构建子节点,返回树T
6)对第i个子节点,以(5)中的子集作为训练集,A-Ag
作为特征集,递归调用(1)~(5),构建决策树
C4.5:
信息增益与训练数据集D关于特征A的值的熵之比:
gr(D,A)=g(D,A)HA(D)
gr(D,A)=g(D,A)HA(D)
其中:
HA(D)=∑|Di||D|log(|Di||D|)
HA(D)=∑|Di||D|log(|Di||D|)
C4.5算法即是将ID3算法中选择特征的标准用信息增益比代替
CART分类树:
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。
CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。本文我们仅讨论用于分类的CART。对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。
CART生成算法如下:
输入:训练数据集D,停止计算的条件:
输出:CART决策树
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
设结点的训练数据集为D,计算现有特征对该数据集的Gini系数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或 “否”将D分割成D1和D2两部分,计算A=a时的Gini系数。
在所有可能的特征A以及它们所有可能的切分点a中,选择Gini系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
对两个子结点递归地调用步骤l~2,直至满足停止条件。
生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。
3.回归树原理
4.决策树防止过拟合手段
产生原因1:样本问题
(1)样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;(什么是噪音数据?)
(2)样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;
(3)建模时使用了样本中太多无关的输入变量。
针对原因1的解决方法:
合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;
原因2:构建决策树的方法问题
在决策树模型搭建中,我们使用的算法对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据或非事件数据,可以想象,这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。
上面的原因都是现象,但是其本质只有一个,那就是“业务逻辑理解错误造成的”,无论是抽样,还是噪音,还是决策树等等,如果我们对于业务背景和业务知识非常了解,非常透彻的话,一定是可以避免绝大多数过拟合现象产生的。因为在模型从确定需求,到思路讨论,到搭建,到业务应用验证,各个环节都是可以用业务敏感来防止过拟合于未然的。
针对原因2的解决方法(主要):
剪枝:提前停止树的增长或者对已经生成的树按照一定的规则进行后剪枝。
5.模型评估
分类树模型:采用通用的分类模型评估指标
Accuracy
Precision
Recall
F1-score
ROC曲线和AUC
PR曲线
回归树模型:采用通用的回归模型评估指标
MSE
MAE
R^2
6.sklearns参数详解
criterion
默认基尼系数,写’entropy’使用信息增益。
一般,数据维度大、噪音大的时候,用基尼系数;感觉模型拟合程度不够的时候,用信息熵。
random_state
整数,随机数种子,确定之后不管运行多少次这个树不会变。
splitter
默认"best",可以改成"random",树就会更大。
一开始就设置random_state和splitter,防止模型过拟合。
以下参数用于剪枝,防止过拟合的关键:
max_depth
最大深度,最常用的参数,适用于高纬度样本量较少。一般可以从3开始试。
min_samples_split
一个节点想再往下分,需要包含的最少样本数。
整数,就是最小数目;浮点数,分完每个节点样本数的最小比例。
属性
feature_importances_
每个特征的重要性。
方法
xx.apply()
返回每条数据最终落在哪个叶子节点。
xx.fit()
返回建好的模型对象。
xx.predict()
返回每条数据预测的标签。
xx.score()
返回accuracy值
参考链接:
推荐:https://blog.****.net/qq_36400655/article/details/103149814?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158477942119724846425617%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158477942119724846425617&biz_id=0&utm_source=distribute.pc_search_result.none-task
2:https://blog.****.net/shanxuewenjdx/article/details/89006782?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158477942119724846425617%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158477942119724846425617&biz_id=0&utm_source=distribute.pc_search_result.none-task