IntegratedLearningMethodIntegratedLearningMethod本文参考《机器学习实战》和《机器学习》。之前一共介绍了五种分类算法,分别是KNN、决策树、naiveBay是的、逻辑回归、支持向量机,可以看到每种算法都有自己的优缺点,还有适合的数据集。集成学习方法可以将不同分类算法构建的分类器组合起来,实现更高效、更准确的分类。使用集成学习方法时有多种形式:可以是不同算法的集成,可以是同一算法在不同设置下的集成,也可以是数据集的不同部分分配给不同分类器后的集成.对于集成方法中分类器的组合,集成也可以分为“同构”和“异构”。例如,“决策树集成”中的所有分类器都是决策树,同质集成中的单个分类器可以称为“基分类器”;的各个分类器通常被称为“成分分类器”。集成学习将几个弱学习器组合成一个强分类器,可以实现比单个学习器高得多的准确率。弱分类器通常是指准确率略高于随机猜测的学习器,例如在二元分类问题上准确率略高于50%的分类器。在齐次集成学习中,基分类器有时可以直接称为弱分类器。设备。集成学习方法大致可以分为两种方法:Bagging和Boosting。这两种方法的思想是将多种分类和回归算法按照一定的方式组合起来,得到一个强分类器。下面分别介绍两种方法,比较两种方法的异同。Bagging可以将Bagging方法的主要原理概括为以下几点:采样:在原始数据中提取N次并放回,得到新的采样数据集。新数据集的大小等于原始数据集的大小。由于替换采样,采样数据集中允许有重复值。训练:一共选取M个采样数据集,每个数据集对应一个学习算法,这样就可以得到M个分类器,用这些分类器对数据进行分类。投票:M个分类器会得到M个分类结果,所以最后投票选出分类结果最多的类别作为最终的分类结果。随机森林是Bagging方法的典型代表,它结合了很多决策树和Bagging方法的思想。BoostingBoosting方法与Bagging方法非常相似,但前者主要通过结合权重和串行迭代来学习。Boosting更关注每次分类后被错误分类的样本。在下一次分类之前,Boosting会增加错误分类的样本。weight,这样下一个分类器在训练的时候会更加关注误分类样本的训练。在确定最终分类时,由于每轮分类权重都会发生变化,因此Boosting方法通过加权求和得到分类结果。Boosting方法的典型代表是Adaboost,它是很多决策树和Boosting方法思想的结合,也被称为boosting树,此外还有GBDT和XGBoost。下面给出AdaBoost的流程图,其原理就是Boosting的主要思想。这两种方法区分了两种算法。虽然其思想是将几个弱分类器组合成一个强分类器来提高最终的分类准确率,但是两者还是有很大区别的,如下:Baggingin在原始数据集中,通过随机替换采样得到一个新的样本集;而每一轮Boosting的训练集都是原始数据集,只是训练集中每个样本的权重是变化的。Bagging是并行学习的,各个分类器在学习时互不影响;而Boosting是串行学习的,前一次训练的结果会影响下一次训练集中样本的权重。由于每个分类器在Bagging中的权重相同,因此在确定分类的最终结果时采用投票方式;而在Boosting中,每个分类器都有一个对应的权重,所以通过加权求和来决定分类的最终结果。AdaBoost算法简介算法原理AdaBoost的全称是自适应提升(adaptiveboosting)。它的运行过程可以概括为:训练数据集中的每个样本都会被赋予相同的权重值,这些权重会形成一个向量,暂称D。分类器在训练数据后计算分类器的错误率集,即错误分类样本的概率,根据错误率更新分类器的权重。在训练下一个分类器之前,每个样本的权重都会根据前一个分类器的权重进行调整。减少最后配对样本的权重,增加错误样本的权重。迭代次数是人为设定的。迭代次数达到或满足一定条件后,通过加权求和确定最终的分类结果。相关公式1.样本权重对于包含N个样本的数据集,初始化训练数据的权重分布时,每个样本的权重分布应该相等。2.错误率如果我们把基于不同权重$D(M)$训练出来的分类器称为$h_M(x)$,每个样本实际对应的类别为$f(x)$,那么错误率为$\epsilon$的定义如下:$$\epsilon=\frac{错误分类样本数}{所有样本数}$$$$\epsilon_M=P(h_M(x)\neqf(x))$$3、分类器权重除了样本权重,每个分类器还会有一个权重$\alpha_M$:$$\alpha_M=\frac{1}{2}ln(\frac{1-\epsilon_M}{\epsilon_M})$$可以看下面的流程图:数据集在左边,黑色条的长度代表每个样本的权重。每个分类器训练完成后,会得到一个分类器权重$\alpha$,最后将所有分类器加权后的结果(三角形)在圆圈内求和得到最终的分类结果。4.更新权重D在下一次训练前,为了减少正确分类样本的权重,增加错误分类样本的权重,需要更新权重向量D:当两个公式结合起来时,一般是这样对于二元分类问题,即类别标签为+1和-1。当分类器的预测结果与真实类别相同时,两者的乘积为+1,不同时,两者的乘积为-1。其中$Z_t$称为归一化因子,其作用是保证$D_{M+1}$为概率分布。5、最终的分类器输出可以利用各个弱分类器的线性组合来达到加权求和的目的,通过符号函数确定最终的分类结果。$$H(x)=sign(\sum_{m=1}^M\alpha_mh_m(x))$$组合策略大家可以看到AdaBoost的流程图中有一个“组合策略”。该策略结合所有弱分类器的分类结果,然后判断最终的分类结果。组合策略可以分为三类:平均、投票和学习。平均法对于数值回归预测问题,最常见的组合策略是使用平均法,分为简单平均法和加权平均法。假设有n个弱分类器$(h_1(x),h_2(x),...,h_n(x))$,简单平均法的公式如下:$$H(x)=\frac{1}{n}\sum_{i=1}^nh_i(x)$$加权平均法公式如下:$$H(x)=\sum_{i=1}^nw_ih_i(x)$$其中$w_i$是一个弱分类器$h_i(x)$的权重通常需要$w_i\geq0$,$\sum_{i=1}^nw_i=1$。可见,简单平均法是加权平均法$w_i=\frac{1}{n}$的特例。表决法对于分类的预测,通常采用表决法,表决法可分为相对多数表决法、绝对多数表决法和加权表决法。相对多数表决法常被提及少数服从多数。在预测结果中,选择出现次数最多的类别作为最终的分类类别。如果有多个类别获得最高票数,则随机选择其中一个类别作为最终类别。绝对多数表决法是在相对多数表决法基础上的改进。不仅要求获得最高票数,而且需要50%以上的票数,否则预测被否决。加权投票法类似于加权平均法,即每个分类器得到的分类票数乘以一个权重,最后加上每个类别得票数的加权和,得到该分类器对应的类别最大值作为最终的分类类别。学习方法学习方法比前两种方法复杂,但得到的效果可能更好。学习方法的代表是Stacking。总体思路是在弱分类器之后加一个分类器,弱分类器的输出作为输入重新训练。我们称弱分类器为初级分类器,用于组合的分类器称为二级分类器。当使用学习方法组合策略时,首先使用初级分类器对数据集进行训练,然后使用次级分类器在训练一次后得到最终的预测结果。AdaBoost代码实现单层决策树。单层决策树是一种简单的决策树。它只根据单个特征进行决策,即在获得信息增益后丢弃其他特征,因此单层决策树只有一次分裂过程。实际上也是一个树桩。之所以使用单层决策树构建弱分类器,是因为在下面的数据集中,单层决策树更能体现“弱”的本质。你为什么这么说?在某个轴上选择一个值,显然不可能通过垂直轴和穿过该值的直线来区分两类样本。但是,通过多次划分,即使用多个单层决策树,可以构造出一个完全正确的分类器。我们暂且定义上图中样本的分类为正负,那么我们在划分数据集的时候就可以给出相应的阈值,如下图所示:如果选择X1特征的阈值如1.4,小于该阈值的样本可以指定为负类,对应大于该阈值的样本为正类;但是规定小于阈值的样本为正类也是合理的,大于阈值的样本也是合理的,所以一个特征有两种情况,这是后面函数中唯一的尴尬点。defbuildStump(dataMatrix,classLabels,D):labelMat=np.mat(classLabels).T#将标签列表矩阵化并转置m,n=np.shape(dataMatrix)#获取输入数据矩阵的行数和列数numSteps=10.0#阈值变化次数bestStump={}#用于存储树的空字典bestClasEst=np.mat(np.zeros((m,1)))minError=float('inf')#将最小误差初始化为正无穷大foriinrange(n):#遍历所有特征rangeMin=dataMatrix[:,i].min()#求特征中的最小值rangeMax=dataMatrix[:,i].max()#求特征中的最大值特征stepSize=(rangeMax-rangeMin)/numSteps#计算阈值每次变化的长度,记录为jinrange(-1,int(numSteps)+1)的步长:#阈值变化times#lt(lessthan)表示小于阈值,分类为-1#gt(greaterthan)表示大于阈值,分类为-1表示等于in['lt','gt']:#Inboth案例,需要遍历threshVal=(rangeMin+float(j)*stepSize)#计算阈值predictedVals=stumpClassify(dataMatrix,i,threshVal,inequal)#得到分类结果errArr=np.mat(np.ones((m,1)))#创建一个矩阵来存储错误值errArr[predictedVals==labelMat]=0#将正确分类的样本赋值为0weightedError=D.T*errArr#使用权重计算误差ifweightedError
