决策树,生成树的结构(根节点,叶子节点,非叶子节点),可以做分类,也可以做回归任务
问题:
如何构造我们想要的树
构造树的时候容易有什么问题,怎么解决
根节点和非叶子节点都是特征,叶子才是包含样本的节点。
树是什么样的树,怎么构造,它的效果怎么评估
当我们把这颗树构造好了,那么测试它就是走一遍这棵树看最后结果怎么样
那么难点就不是测试它,而是在如何构造我们想要的树
构造的难点在于 我们怎么知道那个是根节点和非叶子节点,即哪个特征才是合适的作为分类的条件
那么我们引入熵——表示混乱程度的量,
如果里面有多个类,比如有1,2,3,4,5五个值五个类那么熵值是大的,
而如果是1,1,1,1,2 五个值中有2类,那么熵值是小的
而通常这个类会是我们的label,即数据中的y
(训练过程中就是为了让熵值尽量小的分类过程)
比较熵值 我们用信息增益——熵值的差值
如果以某个特征作为节点分开了数据,发现熵值减少了,那么信息是增益的,信息增益的值即熵值的差值
但是如果有一个特征是ID,即每个数据的标识,那么用信息增益来计算,会发现ID的熵值是0,信息增益很大
(因为每一个分类中就只有一个数据)
那么这个时候ID会被选为节点。但我们并不是想要这个分类
因此我们这个时候应该要用信息增益率
信息增益率 ,相比信息增益,就是把自身的熵值也考虑进去了,即信息增益除以自身熵值
信息增益是没有把自身熵值考虑进去的,只是考虑了以某个特征作为节点后label分类情况的熵值
我们构造树的时候每次选择哪个作为节点就是利用信息增益或者信息增益率来计算,选择最大的那一个特征作为节点
那么我们可以想到,树其实是很容易过拟合的(不控制参数的情况下),也就是把数据分的十分详细,一个叶子一个数据
这是我们不想要的,那么就需要剪枝策略
剪枝策略就是避免树在训练的过程中出现过拟合现象,把一些不那么重要的分类去除
(毕竟也不是所有的特征都有用,而且重要程度也是不一样的,自己研究的目标也不是和所有的特征都有关)
剪枝策略分为预剪枝和后剪枝
预剪枝是控制参数,如树的深度,叶子节点的个数,叶子节点的样本的个数等等
一边建立模型一边剪枝的方式
而 后剪枝是等模型建立后再去剪枝,通过比较熵值,样本数,叶子个数等等,判断是否要剪枝
很明显,预剪枝的效率会比后剪枝要高得多,通常使用预剪枝。
对于预剪枝来说,如何选择合适的参数(树的深度,叶子节点的个数等等,这两个比较重要)进行剪枝就比较重要了
这里我们使用sklearn的GridSearchCV进行参数的选择,这是通过多组参数不同的组合看一下树的效果,找出效果最好的一组
选择什么参数,参数的数值,这些都可以自己设定,方法中会自动进行组合,看参数组合后的效果。
里面有包含了之前讲到的交叉验证。交叉验证就是一种基于训练集上的参数选择的方法。