草庐IT

【机器学习之模型融合】Voting投票法基础理论

拟 禾 2023-04-13 原文

 

目录

1、认识模型融合🌸

2、模型融合和集成算法的区别🌹

3、常见模型融合方式🍁

4、投票法Voting🌿

4.1、不同的投票方法🌴


1、认识模型融合🌸

  • 在机器学习竞赛界,流传着一句话:当一切都无效的时候,选择模型融合。这句话出自一位史上最年轻的Kaggle Master之口,无疑是彰显了模型融合这一技巧在整个机器学习世界的地位。如果说机器学习是人工智能技术中的王后,集成学习(ensemble Learning)就是王后的王冠,而坐落于集成学习三大研究领域之首的模型融合,则毫无疑问就是皇冠上的明珠,熠熠生辉,夺人眼球。
  • 为什么模型融合如此受学者们青睐呢?模型融合在最初的时候被称为“评估器结合”,与集成算法(狭义)一样,它也是训练多个评估器、并将多个评估器以某种方式结合起来解决问题的机器学习方法。我们都知道,集成算法(狭义)是竞赛高分榜统治者,但在高分榜上最顶尖的那部分战队一定都使用了相当丰富的模型融合技巧因为模型融合能够在经典集成模型的基础上进一步提升分数,使用模型融合技巧后、融合算法的效果常常可以胜过当前最先进的单一集成算法。正是这一有效的提分能力,让模型融合在竞赛界具有很高的地位。也因此,模型融合是提分的最终手段。

2、模型融合和集成算法的区别🌹

  • 直观印象:训练的基础不同

    集成算法(狭义):青铜算法+人海战术

    • 以Bagging和Boosting代表的集成算法(狭义)可以说是使用青铜算法+人海战术。在集成时,我们一般使用数百棵决策树、甚至树桩这样的弱评估器,构成强大的学习能力。
       
    • 在这个过程中,由于评估器数量很多,因此每个评估器贡献自己的一小步(Boosting)、或者一小点意见(Bagging),没有任何弱评估器可以在数据集上直接给出优秀的结果。因此从本质上来说,集成算法还是一个算法,弱评估器本身不具备有效预测能力。
       

    模型融合:王者算法+精英敢死队

    • 模型融合则使用王者算法+精英敢死队战术。在融合时,我们往往构建最多数十个Xgboost、神经网络这样的强评估器,再设计出强大的规则来融合强评估器的结果。或者,我们使用少数几个很强的学习器处理特征,再让将新特征输入相对较弱的学习器,以此来提升模型表现。
       
    • 在这个过程中,由于评估器很少,所以每个评估器的贡献都很大,即便不融合,单一评估器也可以直接在数据集上给出优秀的结果。因此从本质上来说,模型融合是囊括多个算法的技巧,而并非一个算法。

不难发现:通过集成,我们让算法从弱到强,但通过融合,我们让算法从强到更强面对同样的预测任务,集成算法会努力获得一个好结果,而模型融合则是将许多好结果融合在一起,得到更好的结果。


  • 统计方面:假设空间不同,泛化能力不同

    集成算法(狭义):一维假设空间

    • 每个算法都是一套独一无二的、从数据到结论的计算流程,这一流程在统计学上被称为是“对样本与标签关系的假设”。例如,KNN假设,相同类别的样本在特征上应该相似。Boosting算法假设令单一损失函数最小的树一定可以组成令整体损失最小的树林。
       
    • 我们可以有不同的假设,但在有限的训练数据集上,我们很难看出哪个假设才是对贴近于真实样本标签关系的假设。这就是说,我们无法保证现在表现好的算法在未知数据集上表现也一定会好因此使用单一假设/单一算法的缺点就很明显:虽然在当前数据集上当前假设表现最好,但如果其他假设才更贴近数据真实的情况,那当前选择出的模型的泛化能力在未来就无法得到保证了。
       

    模型融合:高维假设空间

    • 相对的,如果能够将不同的假设结合起来,就可以降低选错假设的风险。最贴近数据真实状况的假设,即便在当前数据集上表现并不是最好的,但在融合之后可以给与融合的结果更强大的泛化能力。
       
    • 同时,假设真正的数据规律并不能被现在的数据代表,那融合多个假设也能够拓展假设空间,不同假设最终能够更接近真实规律的可能性也越大。

因此,从统计学的角度来说,模型融合能够:(1) 降低选错假设导致的风险、(2)提升捕捉到真正数据规律的可能性、(3)提升具有更好泛化能力的可能性


  • 计算方面:起点数量不同,模型表现不同

    集成算法(狭义):只有一组起点,最终只能得到一个局部最小值

    • 许多算法在搜索时都会陷入局部最优解,即便有足够多的训练数据,我们也无法判断能否找到理论上真实的最小值。一般在算法训练时,我们把搜索出的局部最小值当作是真实最小值的近似值,但我们却无法估计真实最小值与局部最小值之间有大多的差异。但由于我们只有一个局部最小值,真实最小值在哪里完全没有头绪。
       

    模型融合:多组不同的起点,最终得到一个局部最小值的范围

    • 模型融合过程中,每个算法都会有自己的起点、并最终获得多个不同的局部最小值。虽然这些局部最小值当中,没有任意一个等于真正的最小值,但真正的最小值很大可能就在这些局部最小值构成的范围当中。通过结合局部最小值,可以获得更接近真实最小值的近似值,从而提升模型的精度。

因此,从计算方面来看,模型融合能够:(1)降低选错起点假设的风险、(2)降低局部最小值远远偏离真实值的风险、(3)提升算法结果更接近真实最小值的可能性


3、常见模型融合方式🍁

当算法出现统计学方面的问题时,模型一般表示为高方差、低偏差(更换数据之后模型表现非常动荡)。当算法出现计算方面的问题时,模型一般表示为高偏差、低方差(无论换什么数据,局部最小值都远离真正的最小值)。因此,理论上来说,模型融合这一技巧的上限非常高:我们可以同时降低方差和偏差、找到方差-偏差均衡的最优点。

现在,使用比较广泛的融合方式有如下4种:

  • 均值法Averaging:适用于回归类算法,将每个评估器的输出做平均,类似于Bagging中回归的做法。

  • 投票法Voting:适用于分类算法,按每个评估器的输出进行投票,类似于Bagging中分类的做法。

  • 堆叠法Stacking:使用一个或多个算法在训练集上输出的某种结果作为下一个算法的训练数据。其中比较著名的是gbdt+lr,其中逻辑回归lr使用gbdt输出的树结构数据作为训练数据。

  • 改进堆叠法Blending:一种特殊的stacking,使用一个或多个算法在验证集上输出的某种结果作为下一个算法的训练数据。


4、投票法Voting🌿

投票法是适用于分类任务的模型融合方法,也是在直觉上来说最容易理解的方法。简单来说,投票法对所有评估器输出的结果按类别进行计数,出现次数最多的类别就是融合模型输出的类别


4.1、不同的投票方法🌴

  • 相对多数投票 vs 绝对多数投票

    相对多数投票就是上面所提到的少数服从多数,即只要有一个备选类别占比较多即可。与之相对的是绝对多数投票:

    绝对多数投票要求至少有50%或以上的分类器都输出了同一类别,否则就拒绝预测。例如在5个分类器中,至少要有2.5个分类器都输出同一类别,样本才能够进行输出具体类别,否则则输出“不确定”,相当于增加一类输出类别。在机器学习当中,绝对多数投票可以帮助我们衡量当前投票的置信程度。票数最多的类别占比越高,说明融合模型对当前样本的预测越有信心。当票数最多的类别占比不足50%时,重新投票对于机器学习来说效率太低,因此我们往往会选择另一种方案:我们可以使用相对较弱的学习器进行绝对多数投票融合、并将绝对多数投票中被输出为“不确定”的样本交由学习能力更强的模型进行预测,相当于将“困难样本”交由复杂度更高的算法进行预测,这也是一种融合方式。

  • 硬投票 vs 软投票

    大多数分类模型的模型输出结果可以有两种表示方式:

    • 表示为二值或多值标记,即算法输出值为[0,1]或[1,2,3]这样的具体类别。
       
    • 表示为类别概率,即算法输出值为(0,1)之间的任意浮点数,越靠近1则说明算法对当前类别预测的置信度越高。我们需要规定阈值、或使用softmax函数的规则来将浮点数转换为具体的类别。
       

    基于此,我们可以将投票分成两种类型:

    硬投票:将不同类别的出现次数进行计数,出现次数最多的类别就是投票结果

    软投票将不同类别下的概率进行加和,概率最高的类别就是投票结果。基于概率的软投票可以衡量投票的置信程度,某一类别下的概率越高,说明模型对该类别的预测结果越有信心。


  • 软投票和硬投票得出的结果可能不同,这是因为软投票有一种“窥探心灵”的能力(也就是衡量置信度的能力)。
  • 在实际进行投票法融合时,我们往往优先考虑软投票 + 相对多数投票方案,因为软投票方案更容易在当前数据集上获得好的分数。然而,如果我们融合的算法都是精心调参过的算法,那软投票方案可能导致过拟合。因此具体在使用时,需要依情况而定。

  • 加权投票

    除了基于概率、基于类别进行投票、以及使用绝对多数、相对多数进行投票之外,还有一种可以与上述方式结合的投票方法,即加权投票。加权投票是在投票过程中赋予不同分类器权重的投票,具体表现在:

    • 对于硬投票,加权投票可以改变每一个分类器所拥有的票数。
    • 对于软投票,加权投票可以改变每一个分类器所占的权重,令概率的普通加和变成加权求和。

具体来看,硬投票情况下,现在,我们再按照类别进行计数,类别3的票数为(0.3 + 0.8 + 0.6 = 1.7票),而类别2的票数为(0.5 + 0.2 = 0.7)票,因此票数占比更多的是类别3,融合模型输出类别3。

不难发现,当调整权重之后,最终输出的结果依然是类别2,但是加权之后整体算法对于类别2的置信度是降低的、对于类别3的置信度是提升的。因此,修改权重很可能会影响融合模型最终的输出。通常来说,我们会给与表现更好的分类器更多的权重,但并不会给与它过多的权重,否则会过拟合。
大多数时候,我们可能会主观地认为,加权后的模型比未加权的模型更强大,因为加权求和比普通求和更复杂、加权平均也比普通平均更复杂。但事实上,无论是从实验还是理论角度,加权方法并没有表现出比一般普通方法更强的泛化能力。在某些数据上,加权会更有效,但如果强评估器之间的结果差异本来就不大,那加权一般不会使模型结果得到质的提升。


今天好冷。小年快乐。

有关【机器学习之模型融合】Voting投票法基础理论的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  10. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

随机推荐