机器学习是现在人工智能领域中进展最大的方面,更多的初学者开始进入了这个领域。在这篇文章中,机器学习与NLP专家、MonkeyLearn联合创始人&CEO Raúl Garreta面向初学者大致归纳使用机器学习过程当中的重要概念,应用程序和挑战,旨在让读者可以继续探寻机器学习知识。算法
机器学习是人工智能的一个分支,它经过构建算法让计算机学习,而且在数据集上使用这些算法来完成任务,而不须要进行明确编码。数据库
明白了吗?咱们可让机器去学习如何作事情!当我第一次听到它的时候,让我很是兴奋。那意味着咱们能够对计算机进行编码,让它们本身去学习东西!编程
学习的能力是智能最重要的一个方面。将这种能力运用到机器上,应该是向让计算机更智能迈出了一大步。事实上,机器学习是现在人工智能领域中进展最大的方面;如今它是个时髦的话题,而且使用机器学习也很是可能造就出更智能机器。网络
这篇文章将会向初学者简要介绍机器学习。我将大致归纳使用机器学习过程当中的重要概念,应用程序和挑战。给出机器学习正式的详尽的说明不是本文的宗旨,而是向读者介绍一些初步概念,让读者可以继续探寻机器学习知识。框架
好了,并非全部事物都和据说的那样美好,机器学习也有它的局限之处。咱们不能构建相似于《星际迷航》中的Data或者《2001太空漫游》中的Hal 9000这样的智能机器。可是,咱们拥有足够的现实世界的应用程序,机器学习在此神奇般的起着做用。下面是一些实用机器学习应用中最多见的分类:机器学习
图像处理的问题基本上都须要分析图像获取数据或是作一些转换。下面是一些例子:编程语言
文本分析是咱们从文本文件,好比推特,邮件,聊天记录,文档等中提取或分类信息。下面是一些流行的例子:ide
数据挖掘是用来从数据中发现某些模式或者作出预测。这个定义有点普通,不过你能够理解成从海量数据库表中挖掘有用的信息。每一行均可以是咱们的训练实例,每一列均可以做为一个特征。咱们可能会感兴趣用表中剩下的列来预测一条新的列,或者发现某种模式来对行进行分组。好比:工具
视频游戏和机器人是机器学习获得应用的一个巨大领域。通常来讲咱们有一个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(译者/刘翔宇 审核/赵屹华、朱正贵、李子健 责编/仲浩)