没有哪个机器学习模型可以常胜,如何找到当前问题的最优解是一个永恒的问题。
幸运的是,融合多个机器学习模型往往可以提高整体的预测能力。这是一种非常有效的提升手段,在多分类器系统(multi-classifier system)和集成学习(ensemble learning)中,融合都是最重要的一个步骤。
一般来说,模型融合或多或少都能提高的最终的预测能力,且一般不会比最优子模型差。举个实用的例子,Kaggle比赛中常用的stacking方法就是模型融合,通过结合多个各有所长的子学习器,我们实现了更好的预测结果。基本的理论假设是:不同的子模型在不同的数据上有不同的表达能力,我们可以结合他们擅长的部分,得到一个在各个方面都很“准确”的模型。当然,最基本的假设是子模型的误差是互相独立的,这个一般是不现实的。但即使子模型间的误差有相关性,适当的结合方法依然可以各取其长,从而达到提升效果。
1. 案例分析
让我们给出一个简单的分析。假设我们有天气数据X和对应的标签y,现在希望实现一个可以预测明天天气的模型
。但我们并不知道用什么算法效果最好,于是尝试了十种算法,包括
算法1: 逻辑回归 -
算法2:支持向量机(SVM)-
算法10:随机森林 -
结果发现他们表现都一般,在验证集上的误分率比较高。我们现在期待找到一种方法,可以有效提高最终预测结果。
2. 平均法/投票法
voting
一种比较直白的方法就是对让10个算法模型同时对需要预测的数据进行预测,并对结果取平均数/众数。
但这个时候需要有几个注意的地方:
首先,不同分类器的输出结果取值范围不同,不一定是[0,1],而可以是无限定范围的值。举例,逻辑回归的输出范围是0-1(概率),而k-近邻的输出结果可以是大于0的任意实数,其他算法的输出范围可能是负数。因此整合多个分类器时,需要注意不同分类器的输出范围,并统一这个取值范围。
比如可以先转化为如二分类结果,把输出的范围统一后再进行整合。但这种方法的问题在于我们丢失了很多信息,0.5和0.99都会被转化为1,但明显其可靠程度差别很大。
也可以转化为排序(ranking),再对不同的ranking进行求平均。
更加稳妥的方法是对每个分类器的输出结果做标准化,也就是调整到正态分布上去。之后就可以对多个调整后的结果进行整合。同理,用归一化也可以有类似的效果。
其次,就是整合稳定性的问题。采用平均法的另一个风险在于可能被极值所影响。正态分布的取值是
,在少数情况下平均值会受到少数极值的影响。一个常见的解决方法是,用中位数(median)来代替平均数进行整合。
同时,模型整合面临的另一个问题是子模型良莠不齐。如果10个模型中有1个表现非常差,那么会拖累最终的效果,适得其反。因此,简单、粗暴的把所有子模型通过平均法整合起来效果往往一般。
更进一步:学习分类器权重(stacking)
在4中提到的方法在一定程度上可以缓解问题,但效果有限。那么另一个思路是,我们是否可以学习每个分类器的权重呢?
答案是肯定,这也就是Stacking的核心思路。通过增加一层来学习子模型的权重。
图片来源:https://www.quora.com/What-is-stacking-in-machine-learning
更多有关于stacking的讨论可以参考我最近的文章:「Stacking」与「神经网络」。简单来说,就是加一层逻辑回归或者SVM,把子模型的输出结果当做训练数据,来自动赋予不同子模型不同的权重。
一般来看,这种方法只要使用得当,效果应该比简单取平均值、或者根据准确度计算权重的效果会更好。
Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。
首先介绍Bootstraping,即自助法:它是一种有放回的抽样方法(可能抽到重复的样本)。
1. Bagging (bootstrap aggregating)
Bagging即套袋法,其算法过程如下:
从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
2. Boosting
其主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。
关于Boosting的两个核心问题:
2.1 在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
2.2 通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。
而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
3. Bagging,Boosting二者之间的区别
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
随机森林Random Forest的基本思想
随机森林是Bagging的一个扩展变体,顾名思义其是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输 入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,对于分类算法,看看这个样本应该属于哪一类,然后看看哪一类被选择最多,就预测这个样本为那一类。对回归问题,计算kk个模型的均值作为最后的结果。
二、随机森林的算法步骤
1:首先,通过Bootstrap方法在原始样本集S中抽取kk个训练样本集,一般情况下每个训练集的样本容量与S一致;
2:其次,对kk个训练集进行CART学习,以此生成kk个决策树模型。在决策树生成过程中,假设共有MM个特征向量,从MM个特征向量中随机抽取mm个,各个内部节点均是利用这mm个特征变量上最优的分裂方式来分裂,且mm值在随机森林模型的形成过程中为恒定常数;
3:最后,将kk个决策树的结果进行组合,形成最终结果。针对分类问题,组合方法是简单多数投票法;针对回归问题,组合方法则是简单平均法。
三、随机森林的优缺点
随机森林的主要优点有:基于决策树模型,比较简单,易于实现,对特征缺失不敏感; 因针对不同的样本集训练弱分类器,因此训练可以高度并行化,对于大数据时代的大样本训练速度有优势;在样本特征量很大的时候,可以随机选择决策树节点划分特征,降低训练模型开销;并且采用了随机采样,训练出的模型的方差小,泛化能力强。主要缺点有:在某些噪音比较大的样本集上,随机森林模型容易陷入过拟合;取值划分比较多的特征容易对随机森林的决策产生更大的影响,从而影响拟合的模型的效果。
网友评论