【译】如何给你的机器学习问题选择正确的算法

随着机器学习浪潮的高涨,越来越多的算法在许多任务中表现得很好。但是我们通常不可能在事先知道哪种算法会是最优的。如果你有无限的时间逐一去尝试每一个算法那就另当别论。接下来的文章我们将依赖从模型选择和超参数调节中得到的知识向你一步一步展示如何来选择最优的算法。

原文地址:http://www.askaswiss.com/2017/02/how-to-choose-right-algorithm-for-your-...

Step 1: 基本知识

在深入讨论之前,我们应当确保已经疏通了基本的知识点。首先,我们应该知道机器学习主要有三大分类:监督学习、无监督学习和强化学习。

  •  在监督学习中,每个数据点都有标签、类别或是数值。比如,给一幅图的标签分为猫或者狗;数值标签的例子是二手车的出售价格。监督学习的目的在于通过学习众多有标签的数据来对未来的数据做出预测——比如通过新照片识别动物(分类)、给二手车一个预测的价格。

如何给你的机器学习问题选择正确的算法

  •  在无监督学习中,数据点是没有标签的。另外,无监督学习算法的目标在于通过某种方式组织或描述其结构。也就是所谓的聚类,或者从不同的角度来观察复杂的数据并变使其变得简单。

  •  而强化学习算法的目标在于根据每个数据点的反应做出选择。通常在机器人行业应用普遍,机器人通过传感器读取数据集中的数据,然后强化学习算法必须决定机器人的下一个动作。同时,强化学习算法还应用在物联网行业,比如算法收到一个信号并判断决策是好是坏。基于以上考虑,强化学习算法为了得到更高的奖赏会修改其策略。

Step 2:将问题分类

接下来讨论分类问题,处理分类问题有两个步骤:

  ▲  由输入数据分类:当我们有标签数据,这属于有监督学习问题。如果我们手上只有无标签数据而且我们想要发现它的结构,这属于无监督学习问题。如果我们想要通过与环境交互来最优化目标函数,这属于强化学习问题。

  ▲  由输出数据分类:如果模型的输出是一个数值,这属于回归问题。如果模型的输出是一个类别,这属于分类问题。如果模型的输出是输入组的集合,那便属于聚类问题。
奏是这么简单!

更一般地来说,当我们纠结于选择何种算法,倒不如问问自己要用算法来干什么:

如何给你的机器学习问题选择正确的算法

-  分类:当数据被用来预测类别,有监督学习通常也叫做分类。比如判断一张图片中的动物是 “猫” 还是“狗”。当仅仅只有两种结果,属于二分类问题;当有超过两种结果时,比如预测下一届诺贝尔物理学奖的获得者,这就属于多分类问题了。

-  回归:当预测值是一个数值,比如股票价格,有监督学习也被称为回归

-  聚类:聚类分析或聚类通常是解决无监督学习问题最常用的手段。聚类是通过某种手段分组,然后将那些相似的个体聚集到一起的方法

-  异常值检测:有的时候算法的目的在于识别数据集中异常的点。在欺诈检测中,任何不寻常的高额信用卡消费都是值得怀疑的。正样本(欺诈手段)是如此之多,而训练样本又如此少,貌似通过算法学习出欺诈行为不可行。异常值检测的办法就是要学习出正常的消费行为是怎么样的(通过非欺诈交易的数据),并且能够识别出那种行为是明显不同的。

step3:找到合适的算法

上面我们已经将需要解决的问题归类完毕,我们可以使用掌握的工具来识别出适当且实用的算法。

微软的 Azure 做了一个可以快速确定算法的列表,哪种算法可以应用于哪种问题上一目了然。虽然是针对 Azure 定制的,但是也具备普遍适用性。(PDF 地址 : https://docs.microsoft.com/en-us/azure/machine-learning/machine-learning...

如何给你的机器学习问题选择正确的算法

几个比较值得注意的算法是:

分类:

  ○  支持向量机(SVM):支持向量机发现最大可能的划分边界。当两个类别不能清楚地得到划分时,支持向量能够帮助找到最大的可能边界。然而真正厉害之处在于,当遇到特征密集型的数据,如文本或染色体时,比起其他算法,支持向量机能够快速而且以较少过拟合的代价划分数据,另外它只会用到少量的内存。

  ○  人工神经网络(ANN):人工神经网络是一种受到大脑启发的解决多分类、二分类和回归问题的学习型算法。它们有很多种类,包括感知机和深度学习(They come in an infinite variety, including perceptrons and deep learning)。这些算法通常要花费大量的时间进行训练,但是在实际应用领域中可以取得比较理想的效果。

  ○  逻辑斯蒂回归(Logistic regression):尽管在名字中的 “回归” 二字令人费解,逻辑斯蒂回归通常却在二分类或多分类问题上是一个强有力的工具。它通过 S 型而非直线达到自然划分数据的效果。逻辑斯蒂回归给予了线性分类边界,所以当我们使用这个算法的时候,确保线性估计在可以承受的范围之内

  ○  决策树和随机森林:决策树(回归、二分类和、多分类、决策丛林(二分类、多分类)和提升决策树(回归和二分类)都是基于决策树这个基本的机器学习概念。决策树拥有很多类别,但无一例外地只干一件事——将特征子空间划分为标签大致相同的区域。这些区域可能是连续值也可能是类别,具体如何取决于你是做分类任务还是回归任务。

回归:

  ○  线性回归:通过一条直线(平面或超平面)拟合数据。它应用广泛、简单并且迅速,但是在一些问题上处理能力有限。

  ○  贝叶斯线性回归:拥有非常期望得到的效果:避免过拟合。贝叶斯方法通过对有可能的答案做出先验假设。另外一个优点就是,贝叶斯方法的参数很少。

  ○  提升决策树回归:正如前面提到,这个算法是基于决策树的,并通过将特征空间细分为具有大致相同标签的区域发挥效用。提升决策树通过限制其可以细分的次数以及每个区域中所允许的最少数据点来避免过拟合。该算法会构造一个树的序列,其中每棵树都会学习弥补之前的树留下来的误差。这能得到一个会使用大量的内存的非常精确的学习器。

聚类:

  ○  K 均值(k-means clustering)聚类的目标是将 n 组观测值分为 k 个聚类,其中每个观测值都属于其接近的那个均值的聚类,这些均值被用作这些聚类的原型。这会将数据空间分割成 Voronoi 单元。

  ○  层次聚类寻求建立一个聚类层次结果,通常有两种方法。聚类聚集(Agglomerative clustering)是一种自下而上的方法,每个观测值从自己的聚类开始,随着层次的上升成对的聚类会逐渐融合。分裂聚类(Divisive clustering)是一种自上而下的方法,所有的观测值从同一个聚类开始,随着层次下降而逐渐分隔。通常,融合和分隔都是根据贪心法则的。层次聚类的结果通常以树状图的形式表现。

异常值检测

  ○  K 最近邻(kNN)是用于分类和回归的非参数方法。在这两种情况下,输入都是由特征空间中与 k 最接近的训练样本组成的。在 kNN 分类中,输出是一个类成员。对象通过其 k 最近邻的多数投票来分类,其中对象被分配给 k 最近邻中最常见的类(k 为正整数,通常较小)。kNN 回归中的输出为对象的属性值,这个值为其 k 最近邻值的平均值。

  ○  单类支持向量机(One-class SVM)使用了非线性支持向量机的一个巧妙的扩展,单类支持向量机可以描绘一个严格概述整个数据集的边界。远在边界之外的任何新数据点都是非正常的,值得注意。

step4:实现所有的算法

对于任意给定的问题,我们通常有很多可以解决该问题的候选算法。那么,我们如何知道该选哪一个呢?通常是不能直接得到问题的答案的,一般的办法是不断尝试。

原型开发最好分两步完成。在第一步中,我们希望通过小量的特征工程快速且粗糙地实现一些算法。在这个阶段,我们主要的目标是大概了解哪个算法表现得更好。这有点像是在招聘:得要列出一些职位的门槛来缩短列表。

一旦,候选算法列表缩短之后,真正的原型开发才刚刚开始。理想情况是,我们会建立一个机器学习的流程,使用一组经过仔细选择的评估标准来比较每个算法在数据集上的表现。在这个阶段,我们仅仅只需要处理少量的算法,所以我们可以将注意力转移到真正神奇的地方:特征工程。

step5:特征工程

也许比挑选算法更重要的事情是选择正确的特征来代表数据。选择一个算法相对来说简单直接,而特征工程更像是一门艺术。

主要的问题是我们需要进行分类的数据在特征空间通常描述极少:比如,灰度和像素用来预测图片不是一个好的选择。所以,我们需要发现能提高信噪比和降低噪声的数据变换。没有这些数据变换,我们手头的工作几乎是无法完成的。比如,在方向梯度直方图(HOG)出现之前,复杂视觉任务(行人检测和面部检测)通常是很难做到的。

尽管多数特征的效果要通过实验来评估,但是了解一些选取数据特征的方法是比较好的。

比较好的技术有:
1. 主成分分析法(PCA):是一种线性降维方法,可以找出包含信息量较高的特征主成分,可以解释数据中的大多数方差。
2. 尺度不变特征变换(SIFT):计算机视觉领域中的一种有专利的算法,用以检测和描述图片的局部特征。它有一个开源的替代方法 ORB(Oriented FAST and rotated BRIEF)。
3. 加速稳健特征 (SURFSIFT ):SIFT 的更稳健版本,有专利。
4. 方向梯度直方图(HOG):一种特征描述方法,在计算机视觉中用于计数一张图像中局部部分的梯度方向的频率。
5. 更多参考

当然,你也可以用你自己的特征描述。如果你有一对候选,你可以使用封装好的手段来进行智能特征选择:

  • 前向搜索:
    • 开始不选择任何特征
    • 然后选择最相关的特征:给现有的特征集添加候选特征,然后计算模型的交叉验证误差;然后对剩余特征重复执行以上步骤;最后添加服从最小误差的候选特征
    • 一直重复直到特征选择数目达到期望水平
  • 后向搜索:
    • 从所有特征开始
    • 移除最不相关的特征:从现有特征集移除掉一个候选特征,然后计算模型的交叉验证误差;然后对所有其他候选特征重复执行以上步骤;最后,去掉服从最大误差的候选特征
    • 一直重复直到特征选择数目达到期望水平

永远使用交叉验证来增减特征!

step6:优化高维参数(选择性)

最后,你还需要优化算法的高维参数。比如,主成分分析中主成分的个数,k 近邻算法的参数 k,或者是神经网络中的层数和学习速率。最好的方法是使用交叉验证来选择。

一旦你做完以上所有的步骤,便有可能创造一个强力的机器学习系统。但是,正如你可能早就猜到了:细节是魔鬼,你必须不断试验(trial-and-error)。(完)

本文作者:李彬
原文链接:https://www.libinx.com/2017/2017-03-07-how-to-choose-right-algorithm-for...
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

最新文章