26 Python 分类:一个模型不够稳怎么办?一文认识组合分类

26 Python 分类:一个模型不够稳怎么办?一文认识组合分类 Python 数据分析入门一个模型不够稳怎么办一文认识组合分类适合人群Python 初学者 / 数据分析入门 / 机器学习入门 / 教学案例分享前面几篇文章里我们已经陆续认识了几种常见的分类方法K近邻看谁和新样本更像决策树像老师一样一步步做判断ID3、C4.5、CART决定树该怎么分剪枝防止树长得太复杂学到这里很多人会自然冒出一个问题如果单个模型判断得不够稳有没有办法让结果更可靠一点比如还是“学生能否通过技能考核”这个案例。有时候一个模型在当前这批数据上效果还不错但换一批数据结果就会有波动。这说明什么说明单个分类器可能会受样本波动、噪声和局部数据分布的影响。这时候一个很自然的想法就出现了如果一个模型不够稳能不能让多个模型一起判断多个模型综合起来会不会比单独一个更靠谱这正是这一篇文章要讲的内容组合分类Ensemble Classification从基本思想上看组合方法是通过学习和组合一系列个体分类器来提高整体分类效果和总体准确率的。常见的组合方法包括装袋Bagging提升Boosting随机森林Random Forest不过先别急着记这些名字。这一篇文章最重要的任务不是一下子把所有集成算法细节都学完而是先建立一个清晰认识为什么多个模型一起判断有时候会更稳一、先从一个很生活化的问题开始一个老师判断和多个老师判断哪个更稳还是回到“学生能否通过技能考核”这个例子。如果只让一个老师根据经验来判断可能会出现什么情况老师经验有限老师可能特别看重某一个方面数据一变判断结果也可能跟着波动比如有的老师特别看重实训成绩有的老师更重视出勤率有的老师会把培训经历看得更重要这说明一个人的判断可能带有局部性。那如果换一种方式不是只让一个老师判断而是让多个老师分别判断最后综合大家的意见通常会发生什么很多时候结果会更稳一些。因为某一个人的偏差可能被别人拉回来某一个人的误判不至于直接决定最终结果多个人综合后偶然性通常会下降这其实就是组合分类最容易理解的起点。所以你可以先把组合分类理解成一句很直白的话一个模型可能会看偏那就让多个模型一起来判断。二、什么是组合分类组合分类说白了就是把多个分类器组合起来让它们共同完成分类任务。这里的关键不是“多放几个模型”这么简单而是通过多个模型共同决策提高整体分类效果。这个定义里有两个词特别重要个体分类器组合1什么是个体分类器个体分类器就是一个单独的模型。比如一棵决策树一个 K近邻模型一个支持向量机模型这些都可以单独做分类。2什么叫组合组合就是不只看某一个模型的结果而是把多个模型的结果综合起来再给出最终判断。所以组合分类最核心的意思就是不是一个模型说了算而是多个模型一起决定。三、为什么多个模型一起判断往往会更稳这是组合分类里最核心的问题。很多人第一次接触这部分内容时最自然的疑问就是为什么多个模型一起判断就可能更好这个问题可以从两个角度来理解。1单个模型容易受数据波动影响再好的模型也是在当前这批训练数据上学出来的。如果这批数据里刚好有噪声异常点分布不均衡偶然样本那模型就可能被“带偏”。比如一棵决策树就可能因为几个特殊样本长出一些不太稳定的分支。这也是为什么前面讲决策树时会专门提到过拟合和剪枝。所以单个模型的问题可以简单理解成它可能把当前数据的局部特征看得太重。2多个模型组合后可以降低偶然性如果不是只用一个模型而是让多个模型分别学习、分别判断再把它们的结果合起来那很多时候结果会更稳一些。为什么因为某个模型判断失误不代表所有模型都会一起失误某个模型特别偏也可能被其他模型的结果中和掉多个模型的差异反而可能成为一种互补这就像集体决策一个人可能看走眼但多个人一起判断通常不容易完全跑偏所以组合分类最重要的直觉就是多个模型不一定每个都完美但组合起来往往能降低单个模型的偶然偏差。四、但要注意组合分类并不是“模型越多越好”这一点很重要而且特别值得单独说清楚。很多人一开始会误以为只要模型够多效果肯定更好。其实不是。组合分类如果弄不好结果也可能更差。为什么1如果基础模型都很差组合起来也未必会变好如果每个个体分类器本身判断能力就很弱那把它们放在一起不会自动变强。换句话说组合方法不是“点石成金”。它更像是把几个还不错、但各有偏差的模型想办法组合得更稳。2如果这些模型太像组合意义也会变小如果所有模型都学到了差不多的东西、犯的也是差不多的错误那把它们组合起来提升就有限。组合之所以可能有效往往是因为模型之间存在一定差异能够互相补充。3如果组合规则不合理结果也可能被带偏这也是非常关键的一点。如果组合方式本身不合理比如明显不靠谱的模型和靠谱模型拥有同样话语权每个模型的结果都被机械平均模型之间根本没有形成互补那最后结果不一定更好。所以组合分类真正的关键不在于“模型数量多”而在于这些模型是怎么生成的、怎么组合的、最后按什么规则协同决策。这也是为什么组合方法强调的是“有策略地组合”而不是“简单叠加”。五、组合分类是不是“简单堆模型”不是。这也是最容易产生误解的地方。很多人一开始会把组合方法理解成“不就是把好几个模型放在一起吗”如果只是机械地堆几个模型当然谈不上真正的组合学习。组合分类强调的不是“数量”而是这些模型怎么来它们之间有没有差异最后怎么把结果合起来所以更准确一点地说组合分类不是简单堆模型而是一种有明确生成规则和组合规则的方法。这句话非常重要因为它能帮你把“组合分类”和“模型凑数”彻底区分开。六、组合分类里最常见的几种思路在分类任务中比较常见的组合方法主要包括装袋Bagging提升Boosting随机森林Random Forest这一篇文章先不深入讲每种方法的数学细节而是先建立整体感觉。1装袋让多个模型各自学习再综合结果装袋的核心思路可以理解成从原始训练数据中反复抽样训练出多个模型然后把这些模型的结果综合起来。重点在于每个模型看到的数据不完全一样所以学出来的判断也会有差异最后再把这些差异化模型的结果综合起来这种方法的好处是可以降低单个模型因为样本波动带来的不稳定。2提升让后面的模型重点纠正前面的错误提升的思路和装袋不太一样。它更像是前面的模型先做判断后面的模型重点去纠正前面分错的地方。所以它不是“大家平行判断”而更像“前后接力改错”。你可以把它理解成第一个模型先答题第二个模型重点看前面哪些题做错了第三个模型继续补前面没解决好的地方它强调的是不断修正错误逐步把整体结果做得更好。3随机森林很多棵树一起投票随机森林是组合方法里非常典型、也非常常见的一种。它的基本思路就是不是只用一棵决策树而是用很多棵决策树一起判断。你可以先这样理解一棵树可能会长偏那就不要只相信一棵树让很多棵树分别判断最后综合大家的结果所以随机森林本质上就是组合分类思想 决策树后面单独讲随机森林的时候再展开讲它为什么通常会比单棵树更稳。七、组合方法为什么能提高总体准确率组合方法的目标本来就是提高整体分类效果和总体准确率。但它能做到这一点并不是因为“模型数量变多了”而是因为两个更关键的原因。第一个体模型通常不是完全一样的如果所有模型都一模一样、训练方式也完全一样那组合意义其实不大。组合方法通常会设法让模型之间产生一定差异比如看到的训练数据不同关注的错误不同学出来的边界不同这样它们的判断就不会完全重合。第二综合判断可以起到互相补充的作用当多个模型各自有一点优点、也各自有一点偏差时组合起来常常会出现这样的效果某个模型的偏差被其他模型抵消掉某些错误不会被一直放大总体判断比单个模型更稳所以更准确地说组合方法的价值在于通过有策略地学习和组合多个个体分类器让模型之间形成互补。八、先建立一个框架单模型 vs 组合模型学到这里先把一个整体框架记住特别重要。单模型前面学过的这些大多都可以看作单模型K近邻决策树支持向量机朴素贝叶斯它们都是一个模型单独做判断。组合模型而组合分类的思路是不再只依赖一个模型而是让多个模型共同做判断。所以可以把这部分理解成分类学习中的一个“升级”前面一个模型做判断现在多个模型协同判断这个框架一旦建立起来后面学随机森林就会顺很多。九、Python 实操先用一个简单的投票分类器建立直觉这部分先不急着上复杂的集成算法。最适合入门的方式是先用一个“投票分类器”建立感觉。这里用的是sklearn自带的鸢尾花数据集Iris。这是一个非常经典的机器学习入门分类数据集一共包含150 条样本4 个数值特征3 个类别这 4 个特征分别是花萼长度花萼宽度花瓣长度花瓣宽度模型要做的事情就是根据这些特征判断当前样本属于哪一种鸢尾花。所以这本质上是一个三分类任务。下面这段代码做的事情很直观准备几个不同的分类器让它们分别学习再把它们的结果综合起来fromsklearn.ensembleimportVotingClassifierfromsklearn.treeimportDecisionTreeClassifierfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.svmimportSVCfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split# 1. 加载鸢尾花数据集irisload_iris()Xiris.data yiris.target# 2. 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 3. 定义三个基础分类器clf1DecisionTreeClassifier(random_state42)clf2KNeighborsClassifier(n_neighbors3)clf3SVC(probabilityTrue,random_state42)# 4. 构造投票分类器votingVotingClassifier(estimators[(dt,clf1),(knn,clf2),(svc,clf3)],votingsoft)# 5. 训练模型voting.fit(X_train,y_train)# 6. 输出准确率print(投票分类器准确率,voting.score(X_test,y_test))十、这段代码到底在做什么这段代码非常适合用来建立“组合分类”的第一直觉。第一步准备三个不同的分类器这里用了决策树K近邻支持向量机这三个模型本来都可以单独完成分类任务。第二步把它们放进一个投票分类器里VotingClassifier的作用就是把多个分类器组合起来最终通过投票的方式给出结果。也就是说它不再只听一个模型的而是综合多个模型的判断。第三步votingsoft是什么意思这里用的是软投票。软投票可以先简单理解成不仅看每个模型投给了哪一类还会参考它对各类别的概率判断。如果你是初学者这里不需要一下子深究软投票和硬投票的全部区别。先记住一点就够了这段代码展示的是“多个模型一起做判断”的基本思路。十一、这一篇最该记住什么学完这一篇最重要的是先建立组合分类的整体感觉。建议至少记住下面几件事。1什么是组合分类把多个分类器组合起来让它们共同完成分类任务。2为什么要组合因为单个模型可能会有偏差多个模型一起判断通常更稳。3组合分类一定会更好吗不一定。如果个体模型太差、彼此太相似或者组合方式不合理组合效果也可能变差。4组合方法真正的关键是什么不是模型数量多而是这些模型如何生成、如何组合以及最终按什么规则协同决策。5常见组合方法有哪些装袋提升随机森林十二、结尾总结这一篇文章主要回答的是一个很自然的问题如果一个模型判断得不够稳怎么办答案就是不要只依赖一个模型可以让多个模型一起判断。顺着这个问题我们也把组合分类最核心的思想捋清楚了组合分类不是简单堆模型它的目标是提高整体分类效果和总体准确率常见方法包括装袋、提升和随机森林多个模型一起判断之所以可能更稳是因为它们之间可能形成互补但组合并不等于一定更好关键还是看组合机制是否合理如果说前面学的是一个模型怎么做判断那么这一篇学的就是多个模型为什么一起判断往往会更稳。把这个组合思想建立起来后面再继续学随机森林就会自然很多。十三、课后思考可以试着回答下面几个问题为什么单个分类器的结果有时不够稳定为什么多个模型一起判断可能更可靠组合分类为什么不等于“简单堆模型”装袋、提升、随机森林分别是什么思路为什么说组合分类的关键在于组合规则而不只是模型数量如果这些问题都能比较顺畅地说清楚那这一篇的核心内容就已经真正理解了。写在最后组合分类这部分内容第一次学的时候最容易出现一个误区觉得它只是“把多个模型放在一起”。其实真正重要的不是模型数量变多了而是多个模型如何在一定规则下协同工作把结果做得更稳。所以这一篇先把“组合思想”建立起来后面再学随机森林、装袋、提升这些方法时就会顺很多。