A Gentle Guide to Machine Learning

https://monkeylearn.com/blog/a-gentle-guide-to-machine-learning/

机器学习温和指南

http://www.csdn.net/article/2015-09-08/2825647

摘要:

机器学习与NLP专家、MonkeyLearn联合创始人&CEO Raúl Garreta面向初学者大体概括使用机器学习过程中的重要概念,应用程序和挑战,旨在让读者能够继续探寻机器学习知识。

【编者按】

机器学习是如今人工智能领域中进展最大的方面,更多的初学者开始进入了这个领域。在这篇文章中,机器学习与NLP专家、MonkeyLearn联合创始人&CEO Raúl Garreta面向初学者大体概括使用机器学习过程中的重要概念,应用程序和挑战,旨在让读者能够继续探寻机器学习知识。

机器学习是人工智能的一个分支,它通过构建算法让计算机学习,并且在数据集上使用这些算法来完成任务,而不需要进行明确编码。

明白了吗?我们可以让机器去学习如何做事情!当我第一次听到它的时候,让我非常兴奋。那意味着我们可以对计算机进行编码,让它们自己去学习东西!

学习的能力是智能最重要的一个方面。将这种能力运用到机器上,应该是向让计算机更智能迈出了一大步。事实上,机器学习是如今人工智能领域中进展最大的方面;现在它是个时髦的话题,并且使用机器学习也非常可能造就出更智能机器。

这篇文章将会向初学者简要介绍机器学习。我将大体概括使用机器学习过程中的重要概念,应用程序和挑战。给出机器学习正式的详尽的说明不是本文的宗旨,而是向读者介绍一些初步概念,让读者能够继续探寻机器学习知识。

机器学习真面目

好了,并不是所有事物都和听说的那样美好,机器学习也有它的局限之处。我们不能构建类似于《星际迷航》中的Data或者《2001太空漫游》中的Hal 9000这样的智能机器。但是,我们拥有足够的现实世界的应用程序,机器学习在此神奇般的起着作用。下面是一些实用机器学习应用中最常见的分类:

图像处理

图像处理的问题基本上都需要分析图像获取数据或是做一些转换。下面是一些例子:

  • 1.图像标记,比如在Facebook中,算法可以自动检测照片中出现的你的或者你朋友的脸。基本上是机器学习算法从你手动标记的照片中学习。
  • 2.光学字符识别(OCR),算法学会将手稿或者扫描文本转换成数字化版本。该算法需要学会将手写字符图像转换成相应的数字化字母。
  • 3.自动驾驶汽车,让汽车通过图像处理来自动驾驶的机制之一。机器学习算法通过摄像机拍摄的每一帧图像来学习哪里是道路的边缘,是否有停车标志或者是否有车靠近。

文本分析

文本分析是我们从文本文件,比如推特,邮件,聊天记录,文档等中提取或分类信息。下面是一些流行的例子:

  • 1.垃圾邮件过滤,是最为人知也是最常用的文本分类应用(给文本分类)之一。垃圾邮件过滤器学习如何基于内容和主题将邮件归类为垃圾邮件。
  • 2.情感分析,文本分类的另一个应用,该算法必须学会基于作者表达的情绪,来将一个观点分类成积极、中立或者消极。
  • 3.信息提取,从文本中,学会提取特定的信息或数据块,比如,提取地址,实体,关键词等。

数据挖掘

数据挖掘是用来从数据中发现某些模式或者做出预测。这个定义有点普通,不过你可以理解成从海量数据库表中挖掘有用的信息。每一行都可以是我们的训练实例,每一列都可以作为一个特征。我们可能会感兴趣用表中剩下的列来预测一条新的列,或者发现某种模式来对行进行分组。比如:

  • 异常检测:检测异常值,例如信用卡欺诈检测,你可以从一个用户平常的购物模式来检测哪些购物方式是异常行为。
  • 关联规则:比如,在超市或者电子商务网站,你可以通过观察哪些产品会一起被购买来发现客户的购买习惯。这些信息可以用于营销目的。
  • 分组:比如,在SaaS(Software-as-a-Service)平台,可以通过用户行为和资料来对用户进行分组。
  • 预测:从剩余变量中预测出另一个变量(数据库中的一列)。比如,你可以通过对现有客户资料和信用评分这些信息来学习并预测新客户的信用评分。

视频游戏与机器人

视频游戏和机器人是机器学习得到应用的一个巨大领域。一般来说我们有一个Agent(游戏角色或机器人),它必须根据环境(视频游戏中的虚拟环境或者对于机器人来说的真实环境)来行动。机器学习可以使这个Agent执行任务,比如移动到某个环境中而同时避开障碍或者敌人。在这些情形下一个最受欢迎的机器学习技术是强化学习,Agent通过学习环境的强化系数(如果Agent碰到了障碍物强化系数则为负,如果达到目标则为正)来执行任务。

好了,我现在知道什么是机器学习了,但是它是如何工作的呢?

大约10年前我读过的第一批关于机器学习书籍中有一本是Tom Mitchell写的《机器学习》。这本书是1997年写的,但是书中的总体概念在今天仍然有用。

在那本书中,我喜欢书中对机器学习的正式定义,如下:

对于某类任务T和性能度量P,如果一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在从经验E学习。

比如,人工游戏玩家要学会下国际象棋(任务T),可以通过查看以前国际象棋比赛或与导师对弈(经验E)来学习。它的性能P可以用它与人类玩家对弈获胜的比例来度量。

让我们用更多例子来阐述:

  • 案例1:向系统中输入一张图片,系统需要判别图片中是否有巴拉克·奥巴马的脸(一般来说是类似于Facebook的图像自动标记)。

  • 案例2:向系统中输入一条推文,系统判别这条推文是否带有积极或消极情感。

  • 案例3:向系统中输入某人的一些信息,系统计算出此人偿还信用卡贷款的概率。

在案例1中,系统任务是检测巴拉克·奥巴马的脸何时在图像中出现。可以将他出现在哪些照片或不出现在哪些照片中的信息作为经验。系统的性能可以用系统正确识别出奥巴马脸的次数比例来度量。

在案例2中,系统任务是对一条推文进行情感分析。系统的经验可以是一组推文和与它们相对应的情绪。系统的性能可以由系统对新推文情感分析正确的比例来度量。

在案例3中,系统任务是进行信用评分。系统可以将一系列用户资料和相对应的信用评分作为经验。可以用平方误差(预测和预期得分之间的差异)作为性能度量。

为了让算法学习将输入转换成期望的输出,你必须提供训练实例或者训练样例,也就是Mitchell所定义的经验E。一组训练集是一系列实例的集合,它们将作为样例,机器学习算法从这些样例中学习并且完成预期任务。很好理解,不是吗?这就像你给小孩示范如何扔球一样,你扔几次球来教他如何做,然后通过观看那些样例,他开始学会自己扔球了。

每一个训练实例通常表示为一组固定的属性或特征。特征是用来表示每一个实例的方式。例如,在案例1中,一张图片可以由每个像素的灰度级别来表示。在案例2中,推文可以用推文中出现的字词来表示。在案例3中,信用记录可以用此人的年龄、薪水、职业等来表示。

计算和选择合理的特征来表示一个实例是使用机器学习的过程中最重要的任务之一,在本文稍后部分我们将讨论这点。

机器学习算法的种类

在本节中我们将讨论两大类机器学习算法:监督式学习和非监督式学习算法。这两类算法的主要区别在于我们提供给算法的训练样例,算法使用样例的方式以及它们解决问题的类别。

监督式学习

在监督式学习中,机器学习算法可以看作是将特定输入转换成期望输出的过程。

机器学习需要学会如何将所有可能输入转换成正确/期望输出,所以每个训练样例都有特定的输入和期望输出。

在人工国际象棋手的案例中,输入可以是特定的棋盘状态,输出则可能是在这一状态下最好的下棋方式。

根据输出的不同,我们又可以把监督式学习分为两小类:

分类

当输出值属于离散和有限集合,那么这就是一个分类问题。案例2可以看作是一个分类问题,输出是一个有限集合:积极,消极或者中立,我们的训练样例是这样的:

回归

当输出是连续的数值,比如,概率,那么这就是一个回归问题。案例3就是一个回归问题,因为结果是介于0到1的数字,它代表一个人偿还债务的概率。在这个案例下,我们的训练样例是这样的:

监督式学习是机器学习算法中最受欢迎的一类。使用这种方法的缺陷是,对于每一个训练样例,我们都需要提供与之对应的正确输出,在大多情况下,这会耗费大量人力物力财力。比如,在情感分析案例中,如果我们需要10000条训练案例(推文),我们需要对每一条推文都标记上正确的情感(积极,消极或者中立)。这将需要一组人来阅读并标记每一条推文(非常耗时又无聊的工作)。这通常是机器学习算法最常见的瓶颈:收集正确标记的训练数据。

非监督式学习

第二类机器学习算法叫做非监督式学习。在这种情况下,训练数据只需要输入到算法中即可,不需要有与之对应的期望输出。典型的用例就是发现训练样例之间隐藏的结构或者关系。典型的案例就是聚类算法,我们学习找到相似实例或者一组实例(集群)。比如我们有一条新闻,我们希望推荐一条相似的新闻。一些聚类算法比如K-means从输入数据中来学习。

机器学习算法

好了,现在来讲讲数学和逻辑知识了。为了将输入转换成期望输出,我们可以使用不同的模型。机器学习并不是唯一的算法,你可能听说过支持向量机,朴素贝叶斯,决策树或者深度学习。那些是不同的机器学习算法,它们都可以解决同样的问题:学习将输入转换成正确的输出。

那些不同的机器学习算法使用不同的范式或技术来执行学习过程,并将它们所学知识表示出来。

在我们讲解每一个算法之前,我们要了解,最常见的原则是,机器学习算法试图达到一般化。也就是说,它们试图用最简单的理论来解释事物,这被称为奥卡姆剃刀原则。所有机器学习算法,不管它所使用的范式如何,都将尝试创建最简单的假设(做出最少假设的那个)来说明大部分的训练实例。

有很多机器学习算法,不过我们来简要介绍下三种流行的算法:

  • 支持向量机:该模型试图构建一个超平面高维空间集,它试图通过计算与最近实例最大距离来区分不同类的实例。这个概念直观简单,但是该模型有时候也会非常复杂和强大。事实上,对于某些领域支持向量机是你目前可以使用的最好的机器算法之一。

  • 概率模型:这类模型通常通过对问题进行概率分布建模来预测正确的响应。这类算法中最流行的可能要属朴素贝叶斯分类器了,它使用贝叶斯定理和特征之间独立性假设来构建分类器。这个模型的优势之一是即简单又强大,而且不仅会返回预测值还会返回预测值的确定度,这是非常有用的。

  • 深度学习:是基于大名鼎鼎的人工神经网络模型的机器学习的新领域。神经网络有着联结的操作方式,它们试图模仿(以非常简单的方式)大脑的工作方式。基本上,它们由一组相互关联的神经元(处理的基本单位)组成,这些神经元被组织成许多层。简单来说,深度学习使用更深的层构建了新的结构,通过高层次抽象改进了算法,不仅改进了学习方式,而且构建了自动表示最重要特征的结构。

机器学习中的重要方面

机器学习听起来是个美妙的概念,它确实如此,但是机器学习中有一些过程并不是那么自动完成的。事实上,在设计解决方案时,很多时候需要人工操作。然而,这是得到优良结果至关重要的一环。其中一些方面有:

我该使用哪类机器学习算法?

监督式还是非监督式?

你有标记的数据吗?也就是输入和对应的输出。如果有,那么你可以使用监督式学习算法。如果没有,那么使用非监督式算法可以解决问题。

分类,回归还是聚类?

这主要取决于你想要解决什么样的问题。如果你想标记数据(用离散的选项来标记),分类可能是正确的选择。相反,如果你想选择一个数字,比如说分数,回归则是你最佳的选择。或者你想在电子商务网站上针对用户目前浏览信息来推荐相似产品,那么聚类则是你最好的选择。

深度学习,SVM,朴素贝叶斯,决策树···哪个最好?

我的答案是:没有最好的。显然,深度学习和支持向量机已经证明,在不同应用中它们是最强大和最灵活的算法。但考虑到根据不同特定应用,一些机器学习算法可能比其他算法更好。分析它们各自的优势并且使用它们!

特征工程

特征工程是我们提取、选择用来表示训练样例和实例的最重要的特征供机器学习算法处理的过程。这个过程是机器学习(有时没有给予足够的赞誉和重视)中最重要的方面。

请注意:如果你不向算法提供有质量保证的特征,结果会是糟糕的,即使你使用了此情形下最好的机器学习算法。这就像是你在黑暗中努力学习如何用肉眼阅读,不管你有多聪明你都不能做到。

特征提取

为了向机器学习算法输入数据,你通常需要将原始数据转换成算法能够“理解”的东西。这个过程被称作特征提取。通常我们将原始数据转换成特征向量。

在案例1中,我们如何向机器学习算法输入一张图像呢?

一个直接的方式就是将图像转换成向量,每一个成分是图像中每一个像素的灰度值。所以每一个成分或者特征,都可以用0到255的值表示,0表示黑色,255表示白色,1到254是不同程度的灰色。

这种方式可能可行,但是如果我们提供更高层次的特征可能会工作得更好:

  • 图像包含人脸吗?
  • 肤色是什么?
  • 眼睛是什么颜色的?
  • 脸上有毛发吗?
  • … 这些是更高层次特征,它们向算法提供了更多的知识而不只是每个像素的灰度值(它们的计算可以用其他机器学习算法来完成)。通过提供更高层次特征我们就在“帮”机器学习算法得到更好的学习信息来判断我的或者其他某个人的脸是否出现在一张图像中。

如果我们实施更好的特征提取:

  • 我们算法能够学习并得到预期结果的可能性会更高。
  • 我们可能不需要那么多训练样例。
  • 这样一来,我们可以显著减少训练模型所需的时间。

特征选择

有些时候(并不是大多情况下),我们选择向算法输入的特征可能并没多大用处。比如,当对一条推文进行情感标记的时候,我们可能将推文的长度,推文发表的时间等作为特征,这些特征可能有用也可能没有用,而且有自动的方法来识别它们是否有用。直观地,特征选择算法通过技术手段对每条特征打分,然后根据它们的分值返回最重要的那些特征。

另一个需要记住的要点是:避免使用海量特征集。有些人可能尝试添加所有可能的特征到模型中让算法来学习。但这不是个好主意,当我们添加更多的特征来代表实例时,空间的维度就增加了,使得矩阵更加稀疏。直观地,因为我们得到更多的特征,我们必须有非常多的实例在表示每个特征的组合。这就是所谓的维度灾难,随着模型复杂度的增长,训练样例的数目需要以指数形式随着增长,相信我,这将是棘手的问题。

训练样例

你必须向机器学习算法输入训练样例。取决于你想要解决的问题,我们将会使用到几百,几千,几百万甚至上亿的训练样例。而且,保持样例的质量也至关重要,如果你向算法中输入了错误的样例,得到良好结果的可能性会降低。

收集大量的优质数据来训练机器学习算法通常是一项耗费人力物力的工作。除非你已经有标记好的数据,否则你需要自己手动或者雇佣他人来标记数据。一些众包平台的工具尝试解决这样的问题,你可以在这里找到一些工具来完成任务。或者通过使用自己的机器学习模型生成的辅助程序也可以将标记操作变得更高效。

训练样本的一般规则是:你收集了越是优质的训练数据,你可能就可能得到更好的训练结果。

测试样本和性能指标

在我们训练完一个机器学习模型之后,我们需要测试它的性能。这是非常重要的,否则你不知道你的模型是否学会了东西!

这个概念非常简单,我们使用一个测试集,一个不包含在训练集中的实例集合。基本上,我们将输入每个测试样本到模型中,然后观察它是否会得出预期结果。在监督式学习分类的情形中,我们只需要输入每条测试数据,然后检查模型输出是否与预期一样。如果我们的模型正确得出了95%的测试样本的结果,我们说这个模型的准确率是95%。

需要牢记的是,训练和测试数据集不能重合,这是测试模型泛化能力和预测能力的唯一途径。你可能在你的训练数据上能够得到较高的准确率,但如果在单独的测试集上则得到较差的准确率。这就是过拟合,也就是算法对训练样本过度拟合导致糟糕的预测能力。通常避免过拟合的方法是使用较少特征的,更简单的模型,简化模型,并使用更大更具代表性的训练集。

准确率是最基本的指标,同时你也应该关注其他的指标,比如精准度和召回率,这将会告诉你算法的在每一个分类上(当使用监督式学习分类时)的性能如何。混淆矩阵是观察分类算法在哪里出现混淆预测的好工具。

对于回归和聚类问题,有其他的指标来度量算法的性能。

性能

在实际应用中,如果你要实施解决方案,你必须建立一个强大和高性能的解决方案。在机器学习应用中,这会是一个复杂的任务。首先,你需要选择机器学习框架,这不是项容易的工作,因为并不是所有的编程语言都有相关的强大工具。Python和Scikit-learn是构建强大机器学习框架可以使用的编程语言的良好例子。

选择好框架之后,就要考虑性能问题了。取决于数据量,复杂度和设计的算法,运行训练算法可能会耗费大量的计算时间和内存。你可能需要运行多个训练算法直到得到优良的结果。而且,通常你可能会用新实例来重新训练模型来提高准确率。

为了在使用时训练大量模型并快速的到结果,我们通常使用较大内存和多核处理器的机器来并行训练模型。

这些大多是实际问题,如果你想部署机器学习解决方案到实际应用中,考虑这些问题是非常重要的。

结束语

就是这样,我简要概述了什么是机器学习。还有许多实际应用以及机器学习算法和概念本文没有涉及,我们将这留给读者自行研究。

机器学习是很强大的,但训练它也是艰难的,这篇文章中所说的训练模型时可能出现的困难只是冰山一角。

通常具有计算机科学特别是机器学习的背景是取得优良结果所必须的。一个人可能会在步入正轨前因为诸多困难而失望。

这就是我们创建MonkeyLearn的原因,使用于文本分析的机器学习技术大众化。避免重新发明轮子,让每一个软件开发人员或企业家迅速获得实用的结果。以下是我们主要的工作方面,抽象所有这些问题的最终用户,从机器学习复杂度到实际扩展性来排序,得到即插即用的机器学习。

原文链接:A Gentle Guide to Machine Learning(译者/刘翔宇 审核/赵屹华、朱正贵、李子健 责编/仲浩)