作者:Adam Geitgey
原文:https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.ak1of1xbg
翻译:拼命先生
转载请联系译者!
您是否听说过人们谈论机器学习但只是对这意味着什么有一个模糊的想法?您是否已经厌倦了通过与同事交谈的方式点头?让我们改变它!
本指南适用于对机器学习感到好奇但不知道从哪里开始的人。我想有很多人试图阅读维基百科文章,感到沮丧并放弃,希望有人能给处一个更加清晰的解释,这篇文章就是你们要找的。
为了让任何人都可以达到这个目标,意味着有文章中很多概括的描述,但是谁在乎呢?如果这让人们对ML更感兴趣,那么任务就完成了。
什么是机器学习?
机器学习的理念是,有一些通用算法可以告诉你有关一组数据的有趣信息,而无需编写任何特定于问题的自定义代码。您可以将数据提供给通用算法,而不是编写代码,并根据数据构建自己的逻辑。
例如,一种算法是分类算法。它可以将数据放入不同的组中。用于识别手写数字的分类算法也可以在不改变代码行的情况下用于将电子邮件分类为垃圾邮件而非垃圾邮件。这是相同的算法,但它提供了不同的训练数据,因此它提出了不同的分类逻辑。
这种机器学习算法是一个黑盒子,可以重复用于许多不同的分类问题。
“机器学习”是一个涵盖大量这些通用算法的总称。
两种机器学习算法
您可以将机器学习算法视为两个主要类别之一 - 监督学习和非监督学习。差异很简单,但非常重要。
监督学习
假设您是房地产经纪人。您的业务正在增长,因此您聘请了一批新的实习代理来帮助您。但是有一个问题 - 你可以看一眼房子就能非常了解房子的价值,但是你的新学员却没有你的经验,所以他们不知道如何定价他们的房子。
为了帮助你的学员(也许可以让你自己去度假),你决定写一个小应用程序,根据它的大小,社区等,以及类似房屋的售价来估算你所在地区房屋的价值。
因此,持续三个月,每当有人在您所在城市出售房屋时,您就会做些记录。对于每个房子,你写下许多细节,包括卧室的数量,面积,地段等。但最重要的是,你写下最终的销售价格:
这是我们的“培训数据”。
使用该培训数据,我们希望创建一个程序,可以估算您所在地区其他房屋的价值:
我们希望使用培训数据来预测其他房屋的价格。
这称为监督学习。你知道每个房子的售价是多少,换句话说,你知道问题的答案,并可以从那里反向找出解决问题的逻辑。
为了编写您的应用程序,您需要将有关每个房屋的培训数据提供给您的机器学习算法。该算法试图找出需要做什么样的数学计算才能得出价格。
这类似于已经有了数学测试的答案,只是所有算术运算符号都被擦除了
不好了!一个狡猾的学生从教师的答案中删除了算术符号!
从中可以看出测试中出现了什么样的数学问题?你知道你应该用左边的数字“做点什么”来得到右边的每个答案。
在监督学习中,你让计算机为你解决这种关系。一旦你知道解决这一系列问题需要的数学方法,你就可以解答同一类型的其他问题了!
无监督学习
让我们回到我们与房地产经纪人的原始例子。如果你不知道每个房子的售价怎么办?即使你所知道的只是每个房子的大小,位置等,事实证明你仍然可以做一些非常酷的东西。这称为非监督学习。
即使您不去尝试预测未知数字(如价格),您仍然可以通过机器学习做一些有趣的事情。
这有点像某人在一张纸上给你一个数字列表并说“我真的不知道这些数字是什么意思,但也许你可以弄清楚这里是否有什么规律或分组什么的 - 祝你好运!”
那么这些数据怎么办?对于初学者,您可以使用一种算法自动识别数据中的不同细分市场。也许你会发现当地学院附近的购房者真的很喜欢有很多卧室的小房子,但郊区的购房者更喜欢有三居室大户型。了解这些不同类型的客户可以帮助指导您的营销工作。
你可以做的另一个很酷的事情就是自动识别出一些与众不同的房屋。也许那些房屋是奢华豪宅,你可以把最好的销售人员集中在这些区域,因为它们的佣金更高。
监督学习是我们在本文其余部分重点讨论的内容,但这并不是因为非监督学习没那么有用或有趣。实际上,随着算法变得更好,非监督学习变得越来越重要,因为它可以在不必用正确答案标记数据的情况下使用。
旁注:还有很多其他类型的机器学习算法。但这是一个非常好的起点。
太酷了,但是估算房价真的算是“学习”吗?
作为一个人,你的大脑可以应付绝大多数情况,并学习如何在没有任何明确指示的情况下处理这些情况。如果你卖房子很长一段时间,你会对房子的合适价格,推销房子的最佳方式,感兴趣的客户类型等有一种本能地“感觉”。强人工智能研究的目标是能够用计算机复制这种能力。
但是目前的机器学习算法并不是那么强大 - 它们只在非常具体,有限的问题时才能奏效。在这种情况下,对“学习”的更好定义可能是“根据一些示例数据,找出解决特定问题的公式”。
不幸的是,“机器根据一些示例数据找出解决特定问题的公式”并不是一个好名字。所以我们最终选择了“机器学习”。
当然,如果您是在50年后的未来读这篇文章,而我们人类已经研究出了强人工智能算法的话,那么整篇文章看起来就很古怪。也许你应该停止阅读,告诉你的机器人仆人去做一个三明治吧,未来的人类。
我们来写那个程序吧!
那么,你如何编写程序来估算房子的价值,就像上面的例子一样?在进一步阅读之前,请考虑一下。
如果您对机器学习一无所知,您可能会尝试写出一些基本规则来估算房屋价格,如下所示:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# 在我这地方,每平方英尺房屋均价是 200 美元
price_per_sqft = 200
if neighborhood == "hipsterton":
#但是有些地段房价会贵一点
price_per_sqft = 400
elif neighborhood == "skid row":
# 有些地段房价便宜点
price_per_sqft = 100
# 我们先按面积大小估计房屋价格基准
price = price_per_sqft * sqft
# 现在根据卧室数量微调价格
if num_of_bedrooms == 0:
# 工作室类型的公寓比较便宜
price = price — 20000
else:
# 卧室数量越多,通常房价越贵
price = price + (num_of_bedrooms * 1000)
return price
如果你这样瞎忙几个小时,你可能会得到一些有用的东西,但是你的程序永远不会是完美的,而且随着价格的变化很难维护。
如果计算机能够找到如何为您实现此功能,那不是更好吗?只要它返回正确的数字,谁关心函数具体干了什么:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = <计算机,请帮我算点数学题>
return price
考虑这个问题的一种方法是把价格看作是一碗美味的炖菜,其原材料就是是卧室数量,面积和低端。如果你能弄清楚每种原材料对最终价格的影响程度,那么可能会有一个确切的原材料比例来混合成最终价格。
这样可以将你原来的程序(如果全是令人抓狂的 if else的话)简化成类似下面这样的东西:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# 一小撮这个
price += num_of_bedrooms * .841231951398213
# 一大撮那个
price += sqft * 1231.1231231
# 或许再加一把这个
price += neighborhood * 2.3242341421
# 最后,再多加一点点盐
price += 201.23432095
return price
注意那些以粗体标注的神奇数字:0.841231951398213,1231.1231231,2.3242341421, 和201.23432095。我们称它们为权重(weight)。如果我们能够找出一组完美的权重对每套房子都适用,那么我们的函数就可以预测所有房价!
找出最佳权重的笨方法是这样的:
步骤1:
首先,把每个权重都设置为1.0:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# 一小撮这个
price += num_of_bedrooms * 1.0
# 一大撮那个
price += sqft * 1.0
# 或许再加一把这个
price += neighborhood * 1.0
# 最后,再多加一点点盐
price += 1.0
return price
第2步:
将您知道的每个房子的数据带入函数进行计算,看看函数估算的房子价格与正确价格的偏离程度:
使用您的函数预测的每个房屋的价格。
例如,如果第一套房子的实际成交价格为250,000美元,但是你的函数估价为178,000美元,那么这套房子的偏差为72,000美元。
现在将您在数据集中的每个房屋价格偏差平方后求和。假设您的数据集中有500套房屋销售,并且每个房屋估价偏差平方求和总计为86,123,373美元。这就是你的函数目前的“错误”程度。
现在,用总和除以500,得到每个房子估价偏差的平均值。将此平均误差量称为函数的代价(cost)。
如果你可以通过调整权重来使这个代价为零,那么你的函数将是完美的。这意味着在每种情况下,您的函数都会根据输入数据完全猜出房子的价格。这就是我们的目标 - 通过尝试不同的权重,使这个成本尽可能低。
第3步:
一遍又一遍地重复步骤2,尝试权重的每一个可能的组合。无论哪种权重组合使得成本最接近于零,那就是您需要使用的。当你找到有效的权重时,你就解决了这个问题!
心灵爆破时间
这很简单,对吧?好好想想你刚刚做了什么。您获取了一些数据,通过三个通用的,非常简单的步骤,最后您得到的函数可以估算您所在地区任何房屋的价格。房价网站,你们要小心喽!
但是这里还有一些会让你大吃一惊的事实:
- 在过去的40年中,许多领域(如语言学/翻译)的研究表明,这种“搅拌数字炖菜”(我刚刚编的短语)的通用学习算法已经超过了真人试图明确规则的方法。机器学习的“哑”方法最终击败了人类专家。
- 你最终得到的函数是很傻的。它甚至不知道“面积”或“卧室”是什么。它所知道的就是搅拌一些数字才能得到正确的答案。
- 你很可能不知道为什么一组特定的权重会起作用。所以你刚刚编写了一个你并不真正理解的函数,但你可以证明它是有效的。
- 想象一下,您的预测函数输入的参数不再是“面积”和“卧室数量”等,而是一系列数字,每个数字代表安装在汽车顶部的摄像头拍摄的图像中一个像素。现在假设不是输出称为“价格”的预测,而是输出“方向盘转动角度”。那么你刚刚就制作了一个可以自己驾驶汽车的函数!
太疯狂吧??
在第3步里“尝试每个数字”是怎么回事儿?
好吧,当然你不可能试遍所有的权重组合来找到最有效的组合。这真的永远也无法完成,因为这种组合无穷无尽。
为了避免这种情况,数学家已经找到了许多聪明的方法来快速找到这些优秀的权重值,而不必尝试很多。这是一种方式:
首先,写一个代表上面第2步的简单方程:
这是您的代价函数。
现在让我们重新编写完全相同的等式,但是使用一堆机器学习数学术语(你现在可以忽略):
θ代表您当前的权重值。J(θ)表示“当前权重的代价”。
这个等式表示,在当前设定的权重下,我们的价格估算函数的偏离程度。
如果我们为这个代价等式中卧室数量和面积的所有可能的权重值绘制成图,我们会得到一个可能如下所示的图形:
我们的代价函数图看起来像一个碗。纵轴表示代价。
在此图中,蓝色的最低点是代价最低的地方 - 因此在这里我们的程序偏离最小。最高点偏离最大。因此,如果我们能够找到使我们达到此图表最低点的权重,我们将得到答案!
所以我们只需要调整我们的权重,这样我们就可以在这张图上朝着最低点 “走下山”。如果我们不断对权重进行小幅调整,而这些权重总是朝着最低点移动,那么我们最终不用尝试太多不同的权重,就可以到达那里。
如果你还记得微积分的话,你可能还记得,如果你取一个函数的导数,它会告诉你函数在任意一点上的切线的斜率。换句话说,它能告诉我们图表中任意一点的下坡路径。我们可以利用这些知识走到最低点。
因此,如果我们根据每个权重计算代价函数的偏导数,那么我们可以从每个权重中减去该值。这将使我们离山底更近一步。继续这样做,最终我们将到达山底,并得到最优的权重值。(如果这没有意义,不要担心,继续往下读)。
这种为函数找出最佳权重的方法叫做批量梯度下降(Batch Gradient Descent)。如果您对细节感兴趣,请别怕深入挖掘一下。
当您使用机器学习库来解决实际问题时,所有这些都将为您完成。但是,了解正在发生的事情仍然很有用。
还有什么是你略过的内容?
我描述的三步算法称为多元线性回归。您在估算一个可以拟合所有房屋数据点的直线方程式。然后,您再根据一个房屋可能出现在这条线上的位置,使用该等式来测算您之前从未见过的房屋的销售价格。这是一个非常牛逼的想法,你可以用它解决“实际的”问题。
但是,虽然我向您展示的方法可能在简单的情况下有效,但它并不适用于所有情况。一个原因是因为房价并不总是简简单单的遵循一条连续的直线。
但幸运的是,有很多方法可以解决这个问题。还有许多其他机器学习算法可以处理非线性数据(如神经网络或带内核的支持向量机SVM)。还有一些方法可以更巧妙地使用线性回归,从而可以拟合更复杂的线条。在所有情况下,寻找最佳权重这一基本思路仍然适用。
另外,我忽略了过拟合(overfitting)的概念。得到一组权重,总是能够很好地预测原始数据集中房屋的价格,这很简单,但这组权重并不适用于原始数据集中没有的任何新房,这就是过拟合现象。这也是有一些解决办法的(比如正规化和使用交叉验证的数据集)。学习如何处理这个问题是学习如何成功应用机器学习的关键部分。
换句话说,虽然基本概念非常简单,但是应用机器学习并获得有用的结果需要一些技巧和经验。但这是任何开发人员都可以学习的技能!
机器学习是魔法吗?
一旦你开始看到机器学习技术如何轻松应用于看似非常困难的问题(如手写识别),你就会开始觉得你可以使用机器学习来解决任何问题,只要你有足够的答案就可以得到答案数据。只需输入数据并观察,计算机就会神奇地找出拟合数据的等式!
但有一点很重要,要记住,只有在您拥有的数据对于解决实际问题有效的时候,机器学习才能适用。
例如,如果您建立一个模型,根据每个房子中盆栽植物的类型预测房价,那么它永远不会起作用。每个房子里的盆栽植物和房屋的销售价格之间没有任何关系。因此,无论尝试多么努力,计算机都无法推断出两者之间的关系。
您只能对实际存在的关系进行建模
所以请记住,如果人类专家无法使用数据手动解决问题,计算机可能也无法做到。相反,对于哪些人类可以解决的问题,如果计算机可以更快地解决,那岂不是很棒?
如何了解有关机器学习的更多信息
在我看来,现在机器学习的最大问题是它主要生活在学术界和商业研究团体的世界里。对于那些希望在没有成为专家的情况下获得广泛理解的人来说,没有很多易于理解的材料。但它每天都在改善。
如果你想深入一点,Andrew Ng 在Coursera上的免费机器学习课程非常不错。我强烈推荐它。任何拥有计算机或科学学位的人,或是还能记住一些数学的人都应该可以访问它。
此外,您可以通过下载和安装SciKit-Learn来使用大量的机器学习算法。它是一个python框架,具有所有常见机器学习算法的“黑盒子”版本。
现在就继续进行:机器学习很有趣!第二章