一、决策树算法
Ⅰ,树模型
决策树:从根节点开始一步步走到叶子节点(决策)
所有的数据最终都会落到叶子节点,既可以做分类也可以做回归
对于分类:是由众数决定的,例如爷爷奶奶妈妈都是负数,狗蛋儿是正数
对于回归:主要是利用方差来进行计算的,例如按照年龄划分,不同年龄划分到一块,优劣主要看方差的大小数值进行判断。节点的值就是每个划分到一块的年龄的平均值。
举个例子:若要判断谁喜欢打王者农药,如何判断?
首先很容易明白,一般喜欢打农药都是青少年,所以先通过年龄划分,接着,男孩子多数喜欢,然后通过性别划分,最后找到狗蛋儿。这里的年龄和性别判决的先后顺序,能互换吗?不能!换了之后结果可能会大变。在这个案例中,这里的年龄为主要判定决策,其分类效果最强,性别是次要的判定决策。那么问题又来了,凭什么年龄是主要判定决策?凭啥?这就是树模型中主要解决的问题。
Ⅱ,树的组成
根节点:第一个选择点(age<15)
非叶子节点与分支:中间过程(is male?)
叶子节点:最终的决策结果(狗蛋儿、小红、爷爷奶奶妈妈)
学过数据结构的童鞋理解起来很容易,当然光看字面意思也比较容易,这里就不再过多赘述了。
Ⅲ,决策树的训练和测试
训练阶段:从给定的训练集构造出来一棵树(从跟节点开始选择特征,如何进行特征切分)
测试阶段:根据构造出来的树模型从上到下去走一遍就好了
一旦构造好了决策树,那么分类或者预测任务就很简单了,只需要走一遍就可以了,那么难点就在于如何构造出来一颗树,这就没那么容易了,需要考虑的问题还有很多的!
Ⅳ,如何切分特征,选择节点
根节点的选择该用哪个特征呢?接下来呢?如何切分呢?
我们的目标应该是根节点就像一个老大似的能更好的切分数据(分类的效果更好),根节点下面的节点自然就是二当家了。
通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,以此类推。
Ⅴ,衡量标准:熵
熵是表示随机变量不确定性的度量。说白了,越混乱熵越大
。
公式:H(X)=- ∑ (pi * log pi)
, i=1,2, … , n,其中p为概率取值在0-1之间。为啥捏?主要是对数函数的功劳,对数函数,当取值趋向于1的时候,值趋向于0,公式中前面有负号,故不需要考虑对数的负号问题。也就是说,概率越趋于1,对应的熵越小,越稳定。
在分类任务中我们希望通过节点分支后数据类别的熵值小。熵越小越稳定,表示对象都是一类。
概率对熵值的影响:
很明显,概率值越模糊,熵值越混乱。越趋于中间,越不好判断,熵值越高。
信息增益:表示特征X使得类Y的不确定性减少的程度。(分类后的专一性,希望分类后的结果是同类在一起)也就是说分类完之后,熵变小了。信息增益就是分类前后熵的变化值。
Ⅵ,决策树构造实例
这里有狗蛋儿14天的打王者农药情况,看看是什么元素影响狗蛋儿打游戏。如何构建决策树?
①选哪个因素当根节点?
②初始熵值
14天内,有9天打农药,5天不打农药。根据上述的熵的计算公式可得:
初始的熵为0.940。
③outlook
开始对四个因素进行逐一分析,先从outlook开始:
Outlook = sunny时,熵值为0.971。- ((2/5 * log 2/5) + (3/5 * log 3/5))
Outlook = overcast时,熵值为0。
Outlook = rainy时,熵值为0.971。- ( (3/5 * log 3/5) + (2/5 * log 2/5))
根据数据统计,outlook取值分别为sunny,overcast,rainy的概率分别为:5/14, 4/14, 5/14
由于sunny、overcast、rainy出现的天数不一样,故需要在加权求和一下:5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693
系统的熵值从原始的0.940下降到了0.693,增益为0.247
④temperature
同样的道理可得:gain(temperature)=0.029
⑤humidity
同样的道理可得:gain(humidity)=0.152
⑥windy
同样的道理可得:gain(windy)=0.048
选择最大的那个Outlook ,相当于是遍历了一遍特征,找出来了大当家,然后再其余的中继续通过信息增益找二当家!
Ⅶ,决策树版本
ID3:信息增益
C4.5:信息增益率(解决ID3问题,考虑自身熵)
CART:使用GINI系数来当做衡量标准
GINI系数:(和熵的衡量标准类似,计算方式不相同)
Ⅷ,连续值的解决
贪婪算法:例如 60 70 80 90 110 220 300 400,分别依次划分
60、70 80 90 110 220 300 400
60 70、80 90 110 220 300 400
60 70 80、90 110 220 300 400
60 70 80 90、110 220 300 400
60 70 80 90 110、 220 300 400
60 70 80 90 110 220、300 400
60 70 80 90 110 220 300、400
然后依次去计算信息增益,挑选大当家的。实际上就是离散化的过程。
Ⅸ,剪枝策略
决策树过拟合风险很大,理论上可以完全分得开数据,如果树足够庞大,每个叶子节点就成为了一个数据,这样就出现了过拟合现象了。
①预剪枝
边建立决策树边进行剪枝的操作(更实用)
限制深度、叶子节点个数、叶子节点样本数、信息增益量等
②后剪枝
当建立完决策树后来进行剪枝操作
建立完成决策树之后开始后剪枝计算某个节点是否可以去掉,若去掉可以明显减少熵值,那就剪掉。
通过一定的衡量标准叶子节点越多,损失越大
二、集成算法
1,Bagging:训练多个分类器取平均
2,Boosting:从弱学习器开始加强,通过加权来进行训练加入一棵树,要比原来强
3,Stacking:聚合多个分类或回归模型(可以分阶段来做)
Ⅰ,Ensemble learning
目的:让机器学习效果更好,单个不行,群殴走起
Ⅱ,Bagging模型
全称: bootstrap aggregation(说白了就是并行训练一堆分类器)
最典型的代表就是随机森林
随机:数据采样随机,特征选择随机
森林:很多个决策树并行放在一起
①随机森林
构造树模型:
由于二重随机性,使得每个树基本上都不会一样,最终的结果也会不一样
树模型:
之所以要进行随机,是要保证泛化能力,如果树都一样,那就没意义了!
②随机森林优势
它能够处理很高维度(feature很多)的数据,并且不用做特征选择
在训练完后,它能够给出哪些feature比较重要
容易做成并行化方法,速度比较快
可以进行可视化展示,便于分析
③KNN模型
KNN就不太适合,因为很难去随机让泛化能力变强!
树模型:
理论上越多的树效果会越好,但实际上基本超过一定数量就差不多上下浮动了
Ⅲ,Boosting模型
典型代表:AdaBoost, Xgboost
Adaboost会根据前一次的分类效果调整数据权重(如果某一个数据在这次分错了,那么在下一次我就会给它更大的权重)
最终的结果:每个分类器根据自身的准确性来确定各自的权重,再合体
①Adaboost工作流程
每一次切一刀
最终合在一起
弱分类器这就升级了
Ⅳ,Stacking模型
堆叠:很暴力,拿来一堆直接上(各种分类器都来了)
可以堆叠各种各样的分类器(KNN,SVM,RF等等)
分阶段:第一阶段得出各自结果,第二阶段再用前一阶段结果训练
为了刷结果,不择手段!
堆叠在一起确实能使得准确率提升,但是速度是个问题。