你是否曾经听到过人们谈论机器学习,而你却对其含义只有一个模糊的概念呢?你是否已经厌倦了在和同事对话时只能点头呢?现在,让我们一起来改变这个现状吧!
这篇指南是为那些对机器学习感兴趣,但又不知从哪里开始的人而写的。我猜有很多人曾经尝试着阅读机器学习的维基百科词条,但是读着读着倍感挫折,然后直接放弃,希望能有人给出一个更直观的解释。本文就是你们想要的东西。
本文的写作目标是让任何人都能看懂,这意味着文中有大量的概括。但是那又如何呢?只要能让读者对机器学习更感兴趣,这篇文章的任务也就完成了。
什么是机器学习?
机器学习是一种概念:不需要写任何与问题有关的特定代码,泛型算法(GenericAlgorithms)[1]就能告诉你一些关于你数据的有趣结论。不用编码,你将数据输入泛型算法当中,它就会在数据的基础上建立出它自己的逻辑。
比如说,有一种算法被称为分类算法,它可以将数据分为不同的组。分类算法可以用来识别手写数字;不用修改一行代码,它也可以用来区分垃圾邮件和非垃圾邮件。如果给同样的算法输入不同的训练数据,它就能得出不同的分类逻辑。
机器学习算法是个黑盒,它可以重复使用于很多不同的分类问题。
「机器学习」是一个涵盖性术语,它覆盖了大量类似的泛型算法。
两类机器学习算法
你可以把机器学习算法分为两大类:监督式学习(supervisedLearning)和非监督式学习(unsupervisedLearning)。要区分两者很简单,但也非常重要。
监督式学习
假设你是一名房地产经纪人,你的生意蒸蒸日上,因此你雇了一批新员工来帮忙。但是问题来了——虽然你可以一眼估算出房子的价格,但新员工却不像你这样经验丰富,他们不知道如何给房子估价。
为了帮助你的新员工(也许就是为了给自己放个假嘻嘻),你决定写一个可以根据房屋大小、地段以及同类房屋成交价等因素来评估一间房屋的价格的小软件。
近三个月来,每当你的城市里有人卖了房子,你都记录了下面的细节——卧室数量、房屋大小、地段等等。但最重要的是,你写下了最终的成交价:
这就是我们的「训练数据」
使用这些训练数据,我们要来编写一个能够估算该地区其他房屋价值的程序:
我们希望使用这些训练数据来预测其他房屋的价格。
这就是监督式学习。你已经知道了每一栋房屋的售价,换句话说,你已经知道了问题的答案,并且可以反向找出解题的逻辑。为了编写你的软件,你将包含每一套房产的训练数据输入到你的机器学习算法当中去。算法会尝试找出需要做哪些数学运算来得出价格。这就好像是你已经知道了数学测试题的答案,但是算式中的运算符号都被擦去了:
天啊!一个阴险的学生擦去了参考答案上的算术符号!
你能从这张图里看出来测验中的数学题是怎样的吗?你知道自己应该对左边的数字「做些什么」,才能得到右边的答案。
在监督式学习中,你让计算机为你算出这种关系。而一旦你知道了解决这类特定问题所需要的数学方法后,你就可以解答其它同类问题了!
非监督式学习
让我们回到房地产经纪人的例子。如果你不知道每栋房子的售价怎么办?即使你所知道的仅仅是每栋房屋的大小、位置等信息,你也可以搞出一些很酷炫的花样来。这就是我们所说的非监督式学习。
即使你并不是在尝试预测未知的数据(如价格),你也可以运用机器学习做一些有意思的事。
这就有点像有人给你一张纸,上面写了一列数字,然后说:「我不太清楚这些数字有什么意义,但也许你能找出些规律或是把它们分类什么的——祝你好运!」
所以该怎么处理这些数据呢?首先,你可以用个算法自动从数据中划分出不同的细分市场。也许你会发现,当地大学附近的购房者特喜欢户型小、卧室多的房子,而郊区的购房者偏好三卧室的大户型。了解这些不同消费者的喜好可以直接帮助你的营销。
你还可以做件很酷炫的事,就是自动找出非同寻常的房屋。这些与众不同的房产也许是奢华的豪宅,而你可以将最优秀的销售人员集中在这些地区,因为他们的佣金更高。
在接下来的内容中我们主要讨论监督式学习,但这并不是因为非监督式学习比较没用或是无趣。实际上,随着算法的改良,非监督式学习正变得越来越重要,因为即使不将数据和正确答案联系在一起,它也可以被使用。
太酷炫了,但是估算房价真能被看作「学习」吗?
作为人类的一员,你的大脑可以应付绝大多数情况,并且在没有任何明确指令时也能够学习如何处理这些情况。如果你做房地产经纪人时间足够长,你对于房产的合适定价、房屋的最佳营销方式以及客户会感兴趣类型等等都会有一种本能般的「感觉」。强人工智能研究的目标就是要计算机复制这种能力。
但是目前的机器学习算法还没有那么强大——它们只能在非常特定的、有限的问题上有效。也许在这种情况下,「学习」更贴切的定义是「在少量样本数据的基础上找出一个公式来解决特定的问题」。
但是「机器在少量样本数据的基础上找出一个公式来解决特定的问题」不是个好名字。所以最后我们用「机器学习」取而代之。
当然了,如果你是在50年后的未来读的这篇文章,而我们人类也已经得出了强人工智能的算法的话,那这篇文章看起来就像个老古董了。那样的话,就别读了,去让你的机器佣人给你做份三明治吧,未来的人类。
让我们愉快地写代码吧!
所以,你打算怎么写上面例子中评估房价的程序呢?在往下看之前先思考一下吧。
如果对机器学习一无所知,你很有可能会尝试写出一些基本规则来评估房价,如下:
defestimate_house_sales_price(num_of_bedrooms,sqft,neighborhood):price=0#在我这地方,每平方英尺房屋均价是美元price_per_sqft=ifneighborhood=="hipsterton":#但是有些地段房价会贵一点=elifneighborhood=="skidrow":#有些地段房价便宜点=#们先按面积大小估计房屋价格基准price=*sqft#现在根据卧室数量微调价格if==0:#工作室类型的公寓比较便宜price=price—00else:#卧室数量越多,通常房价越贵price=price+(*0)returnprice
假如你像这样瞎忙几个小时,最后也许会得到一些像模像样的东西。但是你的程序永不会完美,而且当价格变化时很难维护。
如果能让计算机找出实现上述函数功能的办法,岂不更好?只要返回的房价数字正确,谁会在乎函数具体干了些什么呢?
def(,sqft,neighborhood):price=