在机器学习领域中有这样一类算法,它核心思想并不是非常复杂的数学公式而是简单的逻辑if-then分支,这也就造成了它较为容易理解但又不那么容易理解透的特性,它和它的一些tricks是一些大厂必问必推的重点,也是后续像随机森林,GBDT等算法的基础所在,它就是决策树算法。
它一般可以解决分类问题(离散情况)也可以解决回归问题(连续情况),是对样本进行处理的树形结构,由节点和有向边组成。因为思想较为简单所以它的可解释性性比较强,分类速度比较快,但过拟合现象也十分严重,所以会有后续的剪枝操作。
本文主要讨论决策树用于分类的情况
一般决策树算法有几个步骤:
一般决策树属于有监督学习(即训练集因变量已经标记好了属于哪些类或哪些可能取值),我们要做的就是训练出一个模型使得这个模型能在已知训练集数据上损失最小即正确分类的样本数最多,在未知训练数据上泛化最好(这也是有监督学习模型的生成思想或者叫套路,泛化是指过拟合程度小,模型相对不复杂,对未知数据或测试集数据的拟合性好)
,这里的
指的是每个分类,所以此时节点对应的分类是
剪枝的本质是容忍某些分类误差,决策树过程是模型的局部最优即训练集最优,而剪枝则是为了全局最优
有些场景决策树是有超参数的,比如树高,叶子节点的数量等
目的是为了选出让训练数据具有很强分类能力的特征(可以和随机划分类比,如果选出的特征的结果和随机划分的特征结果没什么区别则说明这个特征不具备分类能力),这里先引入信息学中熵的思想:
所以如果一个特征的增益越大表示训练数据基于这个特征的有序性有规律性越大,所以这个特征能更好的将数据集节点的分裂。
生成树
和过程所描述的一致
1、根节点开始,计算所有特征的信息增益,选择信息增益(ID3树)/信息增益比(C4.5树)最大的特征作为节点分裂的特征,划分出两个子数据集节点
2、判断是否满足树的超参数限制和信息增益的阈值,比如树高,叶子节点数等,没达到则递归步骤1
如果没有参数限制,则决策树很有可能每个叶子都只有一个样本,出现分的太细的情况
感觉大厂经常问,笔者被问到至少两次
之前所述,剪枝是为了缓解过拟合现象或者提高泛化能力,它主要是从已经生成的树上裁剪掉一些分的太细的子节点,并将此时的父节点或其他辈分更高的节点作为新的子节点,剪枝的依据是极小化决策树的整体损失函数。
GBDT,xgboost,rf后续再讨论