首先,在了解树模型以前,天然想到树模型和线性模型有什么区别呢?其中最重要的是,树形模型是一个一个特征进行处理,以前线性模型是全部特征给予权重相加获得一个新的值。决策树与逻辑回归的分类区别也在于此,逻辑回归是将全部特征变换为几率后,经过大于某一律率阈值的划分为一类,小于某一律率阈值的为另外一类;而决策树是对每个特征作一个划分。另外逻辑回归只能找到线性分割(输入特征x与logit之间是线性的,除非对x进行多维映射),而决策树能够找到非线性分割。python
而树形模型更加接近人的思惟方式,能够产生可视化的分类规则,产生的模型具备可解释性(能够抽取规则)。树模型拟合出来的函数实际上是分区间的阶梯函数。git
决策树学习:采用自顶向下的递归的方法,基本思想是以信息熵为度量构造一棵熵值降低最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)。算法
其次,须要了解几个重要的基本概念:根节点(最重要的特征);父节点与子节点是一对,先有父节点,才会有子节点;叶节点(最终标签)。bootstrap
1、决策树机器学习
决策树生成的数学表达式:函数
决策树的生成:学习
决策树思想,实际上就是寻找最纯净的划分方法,这个最纯净在数学上叫纯度,纯度通俗点理解就是目标变量要分得足够开(y=1的和y=0的混到一块儿就会不纯)。另外一种理解是分类偏差率的一种衡量。实际决策树算法每每用到的是,纯度的另外一面也即不纯度,下面是不纯度的公式。不纯度的选取有多种方法,每种方法也就造成了不一样的决策树方法,好比ID3算法使用信息增益做为不纯度;C4.5算法使用信息增益率做为不纯度;CART算法使用基尼系数做为不纯度。优化
决策树要达到寻找最纯净划分的目标要干两件事,建树和剪枝spa
建树:3d
(1)如何按次序选择属性
也就是首先树根上以及树节点是哪一个变量呢?这些变量是从最重要到次重要依次排序的,那怎么衡量这些变量的重要性呢? ID3算法用的是信息增益,C4.5算法用信息增益率;CART算法使用基尼系数。决策树方法是会把每一个特征都试一遍,而后选取那个,可以使分类分的最好的特征,也就是说将A属性做为父节点,产生的纯度增益(GainA)要大于B属性做为父节点,则A做为优先选取的属性。
(根据log(x)的函数可知,p值越小,熵越大,因此当分组彻底是会出现p=0此时熵最大)
(2) 如何分裂训练数据(对每一个属性选择最优的分割点)
如何分裂数据也即分裂准则是什么?依然是经过不纯度来分裂数据的,经过比较划分先后的不纯度值,来肯定如何分裂。
下面作具体的介绍:
——CART算法:既能够作分类,也能够作回归。只能造成二叉树。
分支条件:二分类问题
分支方法:对于连续特征的状况:比较阈值,高于某个阈值就属于某一类,低于某个阈值属于另外一类。对于离散特征:抽取子特征,好比颜值这个特征,有帅、丑、中等三个水平,能够先分为帅和不帅的,不帅的里面再分红丑和中等的。
得分函数(y):就是上面提到的gt(x),对于分类树取得是分类最多的那个结果(也即众数),对于回归树取得是均值。
损失函数:其实这里的损失函数,就是分类的准则,也就是求最优化的准则
对于分类树(目标变量为离散变量):同一层全部分支假设函数的基尼系数的平均。
对于回归树(目标变量为连续变量):同一层全部分支假设函数的平方差损失
对于分类树(目标变量为离散变量):使用基尼系数做为分裂规则。比较分裂前的gini和分裂后的gini减小多少,减小的越多,则选取该分裂规则,这里的求解方法只能是离散穷举。关于基尼系数,能够参考周志华的西瓜书决策树那章,讲得比较简洁,也比较易懂。“直观来讲,(数据集D的基尼系数)Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的几率,所以Gini(D)越小,则数据集D的纯度越高。”
具体这个的计算,我以为有例子才好理解,下面这个红绿球的例子很好的说明了,如何根据损失函数最小(也就是基尼系数最小)来选取分裂规则。最后GIINs2更小,所以选择它做为分类规则。
对于回归树(目标变量为连续变量):使用最小方差做为分裂规则。只能生成二叉树。
CART与逻辑回归的比较:
主要优缺点以下图。缺点补充几点,不是很稳点,数据变化一点,你的树就会发生变化;没有考虑变量之间相关性,每次筛选都只考虑一个变量(所以不须要归一化);只能线性分割数据;贪婪算法(可能找不到最好的树)。优势也补充三点,同时能够处理分类变量和数值变量(可是可能决策树对连续变量的划分并不合理,因此能够提早先离散化);能够处理多输出问题;另外决策树不须要作变量筛选,它会自动筛选;适合处理高维度数据。
ID3算法:使用信息增益做为分裂的规则,信息增益越大,则选取该分裂规则。多分叉树。信息增益能够理解为,有了x之后对于标签p的不肯定性的减小,减小的越多越好,即信息增益越大越好。
C4.5算法:使用信息增益率做为分裂规则(须要用信息增益除以,该属性自己的熵),此方法避免了ID3算法中的概括偏置问题,由于ID3算法会偏向于选择类别较多的属性(造成分支较多会致使信息增益大)。多分叉树。连续属性的分裂只能二分裂,离散属性的分裂能够多分裂,比较分裂先后信息增益率,选取信息增益率最大的。
三种方法对比:
ID3的缺点,倾向于选择水平数量较多的变量,可能致使训练获得一个庞大且深度浅的树;另外输入变量必须是分类变量(连续变量必须离散化);最后没法处理空值。
C4.5选择了信息增益率替代信息增益。
CART以基尼系数替代熵;最小化不纯度而不是最大化信息增益。
剪树:
(2) 如何中止分裂
下面这六种状况都会中止分裂。其中第一种其实属于树的彻底长成,但这会出现过拟合问题,全部以前很流行一种抑制这种状况的方法,叫树的剪枝。树的剪枝分为预剪枝和后剪枝,预剪枝,及早的中止树增加控制树的规模,方法能够参考以下6点中止分类的条件。后剪枝在已生成过拟合决策树上进行剪枝,删除没有意义的组,能够获得简化版的剪枝决策树,包括REP(设定必定的误分类率,减掉对误分类率上升不超过阈值的多余树)、PEP,还有一种CCP,即给分裂准则—基尼系数加上惩罚项,此时树的层数越深,基尼系数的惩罚项会越大。
2、随机森林
尽管有剪枝等等方法,一棵树的生成确定仍是不如多棵树,所以就有了随机森林,解决决策树泛化能力弱的缺点。(能够理解成三个臭皮匠顶过诸葛亮)
而同一批数据,用一样的算法只能产生一棵树,这时Bagging策略能够帮助咱们产生不一样的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在全部样本上,对这n个样本创建分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,得到m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。
随机森林在bagging的基础上更进一步:
1. 样本的随机:从样本集中用Bootstrap随机选取n个样本
2. 特征的随机:从全部属性中随机选取K个属性,选择最佳分割属性做为节点创建CART决策树(泛化的理解,这里面也能够是其余类型的分类器,好比SVM、Logistics)
3. 重复以上两步m次,即创建了m棵CART决策树
4. 这m个CART造成随机森林,经过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)
关于调参:1.如何选取K,能够考虑有N个属性,取K=根号N
2.最大深度(不超过8层)
3.棵数
4.最小分裂样本树
5.类别比例
3、python实现代码
决策树的重要参数都是防止过拟合的. 有2个参数是关键,min_samples_leaf 这个sklearn的默认值是1,经验上必须大于100,若是一个节点都没有100个样本支持他的决策,通常都被认为是过拟合;max_depth 这个参数控制树的规模。决策树是一个很是直观的机器学习方法。通常咱们都会把它的决策树结构打印出来观察,若是深度太深对于咱们的理解是有难度的。