文本分类的14种算法(4)
随机森林算法
随机森林就是指通过多个不同的决策树进行预测,最后取多数的预测结果为最终结果。
随机森林算法的核心思想叫bagging,是集成学习的一类(另一类是boosting),类似于生活中的投票表决,但投票表决肯定要建立在各人有不同意见的基础上啊,所以随机森林的决策树必须是不同的(不然一个决策树预测多遍有什么用)。为了实现这个不同决策树的生成,就需要决策树满足如下规则:
1.每棵决策树的训练样本是在训练集中有放回抽样产生的,一般训练集大小为n,则有放回抽样n次。
我最开始对这句话是很费解的,训练集大小为n,抽n次,每次怎么不一样呢?
直到我看到了这张图,它直接点出了有放回抽样的精髓所在:
有放回抽样抽n次不一定抽出n个样本,可能最后抽出来1个2个…n个样本,都可能。这就保证了不同的决策树之间在差异的同时还会有一定的联系,使每棵树不至于各自独立,不至于是根据同一问题的不同方面片面的进行分类,这样只不过是把一颗决策树拆开而已。
2.假设训练集样本特征数为M,会从中选取m(m<M)个作为单一决策树的特征集合,使不同的决策树根据不同的特征进行分类,保证了不同决策树间的差异性。
3.为保证差异性,每棵决策树一般不进行剪枝。
决策树由于其特殊的产生方式,会导致有的训练样本在训练某些树时用不到,这个时候我们就可以把这些样本放进没用过他们的树进行预测,统计他们预测结果的正确率,使得随机森林可以在没有测试集的情况下依然有效的反映模型的正确率。其错误率称为袋外错误率(oob误分率)。
由于随机森林各棵树的生成具有随机选择性,且各树的生成相互独立,具有高并行性,因而随机森林算法在处理高维度、大数据量的数据时具有优势。且由于其bagging思想,不易产生过拟合。
跑一下:
AdaBoosting算法
AdaBoosting属于集成学习中的boosting算法,是先产生一个基分类器,再在基分类器的基础上产生其他弱分类器(比如通过不同特征的权重调参),最后多数表决的算法。而随机森林属于的bagging算法中弱分类器(决策树)的样本抽取与模型训练是相互独立的、无关的,因而随机森林不属于boosting算法。但随机森林(bagging)和AdaBoosting(boosting)都是弱分类器构成强分类器,因而都是集成学习。
集成学习一般对弱分类器(个体分类器)有两个要求:1.个体分类器的效果不能太差;2.个体分类器要有一定的差异性。下面的三张图很好的说明了这两点的重要性:
AdaBoosting算法就是先生成一个分类器(比如利用回归算法进行多项式拟合),然后根据分类结果对错误的样本增加权重,生成另一个分类器,再根据错误的结果调整权值生成另一个个分类器。。。。。。
每次调整权重生成新的分类器称为迭代,最后当分类器性能满足条件时停止迭代,将之前所有生成的弱分类器集合起来,依靠多数表决产生结果。sklearn包里的AdaBoosting算法AdaBoostClassifier默认采用的弱分类算法是决策树,可以调参的。
跑一下:
多层感知器
讲到多层感知器就要讲到感知器,感知器就是对多个输入进行线性二分类的一个分类器。就是利用输入的某个函数关系和某个阈值比较之后进行分类,比如这样:
多层感知器就是用很多层感知器来模拟比较复杂的式子,下图中l指层数,第一层为输入层x,最后一层即为输出,中间的层都被称为隐含层。值得注意的是每一层的输入不是上一层的u=wx+b,而是经过二分类之后的y=f(u),f为分类函数;每一层的分类结果再作为下一层的输入:
神经网络长这样:
比如一个两层的、每层三个分类器,公式长这样:
多层分类器的训练过程就是每个分类器w和b的参数确定过程,一般利用梯度下降法来求:
先随机初始化所有参数,然后不断地迭代求梯度优化参数,直到满足某一优化条件。
跑一下: