【翻译】机器学习规约 & 母算法

本文是对文章 《 Machine Learning Reductions & Mother Algorithms 》的翻译,参考了百度翻译和谷歌翻译以及结合自己的理解。有不清楚的地方请参看原文 ,也可以留言自己的见解。翻译这个文章的原因是最近突然想找多分类转换为二分类的策略,发现了这一篇,倒是说得很多,感觉发现了新大陆。

Part Ⅰ:介绍

在烹饪领域,有五种所谓的“母汁”:法式白酱(Sauce Béchamel),天鹅绒酱汁(Velouté),褐酱(Espangole),番茄酱(Tomato)和蛋黄酱(Hollandaise,荷兰汁)。根据这种分类,其他任何酱汁从根本上讲都是由一种或多种母汁衍生出来的。以班尼士汁(Béarnaise)为例:它是带有其他调味品(龙蒿和青葱)的蛋黄酱。

在烹饪教育中,学习制作母酱是成为调味大师的第一步。通过把问题拆分成子问题,解决子问题,以及结果汇总这样的框架,有助于降低制作新酱汁的复杂度。与之相同的分而治之的方法也经常被人们使用,很难想象有什么领域会用不到它。

在机器学习领域,我们没有酱汁,但我们有两种基本的学习算法,我称之为母算法:简单回归(simple regression,线性回归)和二元分类(binary classification,逻辑回归)。事实证明,许多复杂的机器学习问题可以使用这些母算法来解决,从而分解或减少复杂问题。在这个博客系列中,我将逐步介绍一些我认为从业者应该注意的规约。

为什么你想要使用机器学习规约?

机器学习的规约一直是我的兴趣所在,因为我相信他们体现出了我们解决问题的理想方式。当我们应对一个新的机器学习问题时,我们有两个选择:

  1. 设计一个新算法

  2. 弄清楚如何重用现有的算法

许多科学需要建立在过去的同行评议的研究基础之上,以回答日益棘手的问题。这使得我们可以以科学合理的方式快速提升我们的知识。如果能找到一种方法,通过重用现有算法来解决新的机器学习问题,那么我们不仅能节省时间和减少错误,并且秉承了良好的科学实践。规约也有助于我们理解不同技术之间的相互关系,从而为我们提供了更多应对新问题的选择。

机器学习规约是如何工作的?

使用规约解决机器学习问题的一般方法如下:

  1. 确定问题类型 L(通常是分类或者回归)

  2. 找出一个预设的规约(或规约集) R ,它将原始数据分布 D 缩减为可以由母算法 A 解决的诱导分布 Di

  3. 使用 A 和数据 Di 学习预测值 Fr

  4. 使用 Fr 汇总/组合出原问题的解

直观地说,我们想要做的就是转换原始问题,转换数据集或者同时转换两者,使之与现有母算法兼容,并将其作为解。如果框架看起来很直接简单,那是因为本身如此。这里没有特别复杂的事情。

哪种机器学习规约是可能的?

机器学习规约是一个活跃且相对较新的研究领域,并且定期发布新结果。这个领域最杰出的研究人员之一是 John Langford ,我强烈推荐他的出版物和网站

就目前,对于机器学习从业者而言,很高兴知道至少有以下几个方向:

  • 加权二元分类到二元分类(Importance-weighted binary classification to binary classification
  • 回归到二元分类(Regression to binary classification
  • 分位数回归到二元分类(Quantile regression to binary classification
  • 多类别分类到二元分类(Multiclass classification to binary classification
  • 代价敏感的多类别分类到加权二元分类(Cost-sensitive multiclass classification to importance-weighted binary classification
  • 代价敏感的多类别分类到回归(Cost-sensitive multiclass classification to regression
  • 排序到二元分类(Ranking to binary classification
  • 上下文赌博机(立即奖励强化学习)到回归(Contextual bandits (immediate reward reinforcement learning) to regression
  • 上下文赌博机到二元分类(Contextual bandits to binary classification
  • 强化学习到二元分类(Reinforcement learning to binary classification

一些机器学习规约是众所周知的,其他的并没有立刻显现。规约的可组合性正是它强大的原因:许多问题可以通过规约解决,我们甚至可以逐个堆叠规约来解决更复杂的问题。在这个系列,我们将介绍一些最有用的规约方法,并涉及其他的漂亮技巧除了(哈希技巧 和 单分类/回归器方法)

特别感谢 John Langford 和他2006年在赫尔辛基大学教授的“机器学习规约方法”课程,这激发了我对机器学习领域的兴趣。

Part Ⅱ:多类别分类到二分类

紧接着第一部分,我们来说说经典的规约:一对多 one-against-all (OAA) ——也被称之为 *one-vs-all(OVA)*和 one-vs-rest(OVR)。这是最简单的也是最强大的规约方法之一,它具有多种理想的特性。不幸的是,在一些圈子里认为它太过简单,不同观点的人提出了类别不平衡的问题。实际上,可以通过一些巧妙的技巧来缓解此问题(稍后会详细介绍),这为我们提供了通用的解决方案来解决可能想到的几乎所有的多类别问题。

OAA是如何工作的?

分类算法的目标是学习一个最优的决策边界,以便将不同的输入分离开来。在预测的时候,输入就依据这个决策边界分为不同的类。 在二元分类设定只有两个可能的类别(“此信用卡交易是欺诈行为还是合法行为”);在多类别设定可能更多。

针对多类别分类的OAA方法能够将任何多类别学习问题减少为可以由二元分类解决的问题。其工作方式如下:

  1. 对训练集中的每一个类别 i = {1 … n} ,创建n个新的数据集 D1 … Dn (每个类别一个)
  2. 对于每个新数据集 Di ,将对应类别的样本标记为正样本,将其他所有样本标记为负样本
  3. 根据每一个数据集 D,训练 N 个二元分类器
  4. 在测试时,使用所有的二元分类器进行预测。选择输出正值的分类器相应的类别,随机断开联系

此后我们将其称为 vanilla OAA 或简称为 OAA ,有一个甚至更基础的版本——联系被任意断开,而不是随机的——被称为“稻草人一对多(SOAA)”[1]。然而在实践中它的效果更差,所以我们将跳过文中的细节。

在严格的OAA方案中,我们想要使用二元分类器做预测(oracles)。预测(oracle)一词经常在与规约有关的文献中出现,它是一个有力的概念:理想情况下,我们希望设计规约使得原始问题是可以由内部运作方式未知的学习器解决的。这正是OAA所做的:我们可以使用任何我们喜欢的二元分类方法。我们不需要知道使用了什么损失函数,也不需要预测来输出类别的概率/置信度分数。如果愿意,我们甚至可以要求其他人提供基本分类器。

绕行:“单分类/回归器”技巧(注意:本节介绍的技巧并不是OAA特有的;不用担心,可以直接跳到下一节&

我声称在使用OAA时需要训练几个二元分类器,但这并非完全正确。实际上,可以使用某种特征索引操作将多个不同的二元分类器压缩到一个二元分类器,这一技巧被称为“单分类器”技巧。这是激发我对机器学习好奇心之一。

它的工作原理如下:首先,假设我们有一个3分类的问题,训练集的每个样例有4个特征 {a, b, c, d} 。我们可以创建12-维(稀疏)的训练样本来代替训练3个4特征的二元分类器,并根据所涉及的类别为列添加前缀。然后将除相关成员之外的所有成员归零。因此,对于最初看起来像这样的训练集(6个示例):

label a b c d
1 0.2 0.5 0.3 0.1
2 0.3 0.8 0.9 0.2
2 0.3 0.9 0.9 0.2
3 0.9 0.1 0.1 0.1
3 0.9 0.1 0.1 0.2
1 0.2 0.5 0.2 0.2

我们将他变换成如下形式(6x3=18示例):

label 1_a 1_b 1_c 1_d 2_a 2_b 2_c 2_d 3_a 3_b 3_c 3_d
1 0.2 0.5 0.3 0.1 0 0 0 0 0 0 0 0
1 0.2 0.5 0.2 0.2 0 0 0 0 0 0 0 0
0 0.3 0.8 0.9 0.2 0 0 0 0 0 0 0 0
0 0.3 0.9 0.9 0.2 0 0 0 0 0 0 0 0
0 0.9 0.1 0.1 0.1 0 0 0 0 0 0 0 0
0 0.9 0.1 0.1 0.2 0 0 0 0 0 0 0 0
1 0 0 0 0 0.3 0.8 0.9 0.2 0 0 0 0
1 0 0 0 0 0.3 0.9 0.9 0.2 0 0 0 0
0 0 0 0 0 0.2 0.5 0.2 0.2 0 0 0 0
0 0 0 0 0 0.2 0.5 0.3 0.1 0 0 0 0
0 0 0 0 0 0.9 0.1 0.1 0.1 0 0 0 0
0 0 0 0 0 0.9 0.1 0.1 0.2 0 0 0 0
1 0 0 0 0 0 0 0 0 0.9 0.1 0.1 0.1
1 0 0 0 0 0 0 0 0 0.9 0.1 0.1 0.2
0 0 0 0 0 0 0 0 0 0.2 0.5 0.3 0.1
0 0 0 0 0 0 0 0 0 0.2 0.5 0.2 0.2
0 0 0 0 0 0 0 0 0 0.3 0.8 0.9 0.2
0 0 0 0 0 0 0 0 0 0.3 0.9 0.9 0.2

然后我们使用单个二元分类器训练这个数据集。训练期间使用优化器(如:SGD),特征值为0的部分将不会更新权重;只有相关的特征权重才会更新。最后的结果与训练3个单独的二元分类器相同,这非常好!为了进行预测,我们遵循类似的过程:将一个具有4维特征的样本分解为3个,并将不相关的索引设为0。然后我们选择预测为正的类别,向前面一样打破约束。

注意,单分类器技巧也适用于回归问题,在这种情况下,被称为单回归技巧。如果不想自己进行特征索引操作,则可以将此技巧与另一种称为哈希技巧的技术结合使用。

(旁注的旁注:使用单分类器技巧时,必须注意正则化术语,以便只更新相关权重。标准过程是为每个类中的特征添加单独的术语)

(回到主题OAA)

OAA的好处

OAA学习类标签是独立的而不是联合的,因此它具有几个不错的属性,可能会喜欢的一些功能包括:

  • 并行。OAA解决方案几乎可以轻松扩展:如果有10个类,可以在单独的线程/进程训练10个预测类别,而无需进行同步。对于大型数据集和复杂问题,这不仅有好处,而且是必要的:我们需要复制原始数据集,因此可以抵消大部分计算开销是一件好事。
  • 模型可解释性。由于单个二元分类代表一个(并且只有一个)类别,因此可以通过查看其对应的分类器来更多地了解与分类相关的因素。随着机器学习的可解释性变得越来越重要,这一点值得注意。
  • 简单。一般而言,这与OAA的规约有关,但学习过程并不比系统中基本学习器使用的过程复杂。

如果你熟悉Python,scikit-learnOneVsRestClassifier 类,该类通过 n_jobs参数内置了对并行化的支持。

类别不平衡问题

在文章介绍中,我暗示了vanilla OAA的缺点,即类别不平衡的问题。假设我们有一个10-类的多分类问题,训练集有100,000样本,各个类标签均匀地分布在其中。换句话说,每个类在训练集中有10,000个正样本。

考虑一下使用OAA规约分解原始问题时会发生什么:

  1. 10个类别,我们对每个类别创建一个新的数据集,并标记相应的类别为正样本(10,000),负样本(90,000)
  2. 我们在1:9比例的数据集上单独训练二元分类器
  3. 预测时,我们选择输出为正的类别,并随机断开联系

使用OAA时,每个二元分类器都会受到类别不平衡的影响:由于负样本的数量远大于正样本的数量,因此训练通常会偏向负样本类别。在这种情况下,我们可能会遇到所有分类器输出均为负的情况,并且由于联系是随机断开的,因此我们的多类预测也基本上是随机的。相反的情况也可能会发生:几个基础学习器可能会输出正值,再次迫使随机关系断开。幸运的是,有几种解决此问题的策略,其中包括我们将在本文中介绍的策略:WOAA规约。

解决类别不平衡问题:WOAA规约

让我们再考虑一种情况,我们使用OAA通过二元分类器来解决一个10-类(n=10)问题。如果进一步考虑该问题,可以提出一些看法:

  • 对于给定的二元分类器,假负例(FN)在最初的多类问题上,在同一时间有(n-1)/ 9 = 9/10 = 90% 的概率产生一个错误,假设其他学习器都正确地输出了一个负标签,并且我们随机断开联系

  • 假设没有其他错误,如果n个基础学习器产生假正例(FP),则原始问题中错误的概率为 n/(n+1),因为只有一个正例是真正例(TP)。

  • 如果n个基础 学习器产生假正例(FP),而1个基础学习器产生假负例(FN),则原问题出错的概率是100%

从原始问题来考虑这一问题,如果基础学习器中只有一个假负例(FN),选中正确类别的概率是1/n,或者在我们的示例场景中为10%。如果这里只有一个假正例(FP),正确预测的概率为1/2 = 50%。实际上,可以证明,基础学习器中 ϵ \epsilon ϵ 的错误率可以导致多类解决方案中最坏情况的错误率 ( n − 1 ) ϵ (n-1)\epsilon (n1)ϵ ——远远达不到理想情况。

如果我们可以使基础学习器更倾向于输出正例而不是负例,那么我们有望提高原始问题的准确性。我们可以通过引入一个加权框架来实现这一目标,一些示例比其他示例拥有更大的权重:在此框架中,权重为2的示例错误分类的惩罚是权重为1的示例的2倍。更一般而言,对于OAA问题,我们像之前一样将原始n-类数据集转换为n个基础学习器特定的加权数据集 Di ,此外,我们将每一个数据集转换成一个加权数据集。每个样例(label,features)在每个数据集转换成了一个带权的样例(label,features,weight),如下所示:

  • 如果 x 是负样例(标签0),赋予权重为 n/2:(label=0,features=x,weight=n/2)
  • 如果 x 是正样例(标签1),赋予权重为 n-1:(label=1,features=x,weight=n-1)

以上的转换适用于类别大于2的分类问题。

将我们的工作示例应用在一个10-类问题上,原始数据集包含100,000个均匀分布的样例,基础学习器数据集中的样例(10,000正样例和90,000负样例)都被转换成了带权样例:

  • 如果 x 是负样例(标签0),转换为:(label=0,features=x,weight=5)

  • 如果 x 是正样例(标签1),转换为:(label=1,features=x,weight=9)

这种加权策略被称为加权一对多 One-Against-All ,或简称为 WOAA 。这种方法是由 Alina BeygelzimerJohn LangfordBianca Zadrozny 设计的,并于2005年发表[2]。如果基础学习器的平均错误率是 ϵ \epsilon ϵ ,那么对于普通OAA的这种扭曲会达到大约 ( n / 2 ) ϵ (n/2)\epsilon (n/2)ϵ 的多类错误率,这使得加权策略在OAA分类中成为一个有吸引力的选项。

如果我们手头有一个重要性加权的二元分类算法,可以在这里停止,仅使用它就可以将WOAA方法应用于多元分类。但是以真正的规约主义者的方式,我们应该自省以下问题:我们可以进一步将重要性加权的二元分类简化为二元分类吗?我们可以不摆弄损失函数或者内容学习过程这样做吗?

正如你所想,是可以的。有几种策略可以做到这一点,但是更原则性的解决方案之一的是本文引入的第三种规约:代价计算规约(the Costing reduction)。

通过采样解决样本不平衡问题:代价计算法

重要性加权分类是一种代价敏感的分类方法:某些错误分类比其他错误分类花费更多,为了解决这一问题,相比于其他错误,我们对这一部分赋予权重。我们将在本系列的后面部分更详细的讨论代价敏感的分类,但是这里值得一提,因为这是代价计算规约名字的由来。

代价计算,是由 Bianca ZadroznyJohn LangfordNaoki Abe [3]开发的一种规约方法,适用于将任何重要性加权分类问题转换为标准的分类问题。对于重要性加权二元分类,这意味着简化为标准的二元分类。这种规约方法可以通过几种方式实现,但是如果我们想要将基础学习器当做黑盒预测,则该实现还包括对原始数据集多次拒绝采样,以创建一个适用于二元预测的训练集。代价计算还加入了组合的集成度,以校正单个样本集之间的差异。

让我们从拒绝采样部分开始。拒绝采样(Rejection Sampling)是一种流行技术,用于多个领域,根据从不同分布(通常称为建议分布)中提取的数据,从所需的目标数据分布生成观测值。在机器学习的背景下,它的工作方式如下:

对于一个给定的数据集 D

  1. D 中随机采样出一个 x
  2. 如果 x 满足某些接受标准 C ,则返回 x
  3. 不满足,则拒绝 x 并重复步骤1

接受标准 C 取决于解决问题的类型。如果我们希望使用采样来实施重要性加权分类,则我们希望以这样一种方式设计标准,即采样过程生成的示例比代价低的样例花费更多。通过修正不同类型的训练样本在基础学习器中所占的比例,我们可以补偿代价高的错误并获得重要性加权的结果。

具体来说,为了使拒绝抽样符合我们的需求,我们使 C 依赖于重要性权重(这里是代价)来修改基本过程。这种变体称为代价成比例的拒绝采样(cost-proportionate rejection sampling)

对于一个给定的数据集 D

  1. D 中随机采样出一个 x
  2. 以概率 c/Z 接受 x ,其中 c 是与 x 相关的代价,Z 是预设的常数
  3. 如果 x 没有接受,则返回步骤1

Z 是一个超参数,通常设置为数据集 D 中所有示例的最大代价。从直觉上讲,在采样过程中,花费多的样本相比于花费少的样本更可能被接受。如果我们使用这个方式来为我们的基础学习器生成新的数据集,则它本质上会更加“平衡”,并且不太容易出现类别不平衡的问题。

遵循WOAA中提出的理论,以及我们10-类分类问题的运行示例,对于每个基础学习器的数据集 Di ,我们可以使用最佳重要性权重(负样例 n/2 = 5 ,正样例 n-1 = 9)作为代价,将所有偏斜的预测数据集转换成平衡数据集,使用我们的基础学习器进行训练,然后汇总来解决原始问题。整洁!

这里还有一个小细节有待解决。由于代价成比例的拒绝采样会浪费掉我们原始基础学习器的数据集的相当一部分(因为正样本很少),因此训练过程通常比使用具有重要性感知分类算法的普通OAA或WOAA快很多。这固然很好,但是为了使过程更加鲁棒,我们可以使用这一新留出的计算时间为每个类创建几个数据集,为每个数据集训练一个二元分类器,然后在预测时对结果取平均。这是完整的代价计算规约(带有代价汇总的代价成比例的拒绝采样 Cost-proportionate rejection sampling with aggregation)。例如,我们可以选择在一个10-类问题中为每个类创建10个基础学习器,从而实际上有了100个基础学习器(和相同数量的数据集)。这样的组合看起来似乎有些过激,但从经验上讲,这种方法效果很好。在分类性能方面也有良好的理论保证。

旁注:如果你喜欢冒险,可以使用单分类器技巧,尝试将100个分类器塞入一个分类器中!

小结

在这一部分,我们探索了经典的一对多规约法来解决多类问题。与大多数其他分类方法相比,它具有可并行性,易于理解和可解释性。我们可以使用更复杂的WOAA来减轻类别不平衡的问题,而WOAA可以通过代价计算转换为二元分类。放在一起,我们有一个 多类 -> WOAA -> Costing -> 二元分类的规约堆叠。概况地说,使用规约法,我们可以使用二元学习算法来解决重要性加权的多类别分类问题。不止是任何二元学习算法——所有的二元学习算法,与输出(类或类的概率)或其他内部工作方式无关的。

...
第三部分将详细介绍代价敏感分类。
...

[1] Learning Reductions that Really Work, Alina Beygelzimer, Hal Daumé III, John Langford, Paul Mineiro. 2015. URI:https://arxiv.org/pdf/1502.02704.pdf

[2] Weighted One-Against-All, Alina Beygelzimer, John Langford, & Bianca Zadrozny. 2015. URI: https://hunch.net/~beygel/woa.pdf

[3] Cost-Sensitive Learning by Cost-Proportionate Example Weighting, Bianca Zadrozny, John Langford, & Naoki Abe. 2013. URI: http://hunch.net/~jl/projects/reductions/costing/finalICDM2003.ps

以上是对原博客的翻译,第三部分原博客还没有出,出了也不一定会翻译了(笑)。

猜你喜欢

转载自blog.csdn.net/u013347145/article/details/104135225
今日推荐