FROM:
在听到人们谈论机器学习的时候,你是不是对它的涵义只有几个模糊的认识呢?你是不是已经厌倦了在和同事交谈时只能一直点头?让我们改变一下吧!
本指南的读者对象是所有对机器学习有求知欲但却不知道如何开头的朋友。我猜很多人已经读过了“机器学习”的维基百科词条,倍感挫折,以为没人能给出一个高层次的解释。本文就是你们想要的东西。
本文目标在于平易近人,这意味着文中有大量的概括。但是谁在乎这些呢?只要能让读者对于ML更感兴趣,任务也就完成了。
何为机器学习?
机器学习这个概念认为,对于待解问题,你无需编写任何专门的程序代码,遗传算法(generic algorithms)能够在数据集上为你得出有趣的答案。对于遗传算法,不用编码,而是将数据输入,它将在数据之上建立起它自己的逻辑。
举个例子,有一类算法称为分类算法,它可以将数据划分为不同的组别。一个用来识别手写数字的分类算法,不用修改一行代码,就可以用来将电子邮件分为垃圾邮件和普通邮件。算法没变,但是输入的训练数据变了,因此它得出了不同的分类逻辑。
机器学习算法是个黑盒,可以重用来解决很多不同的分类问题。
“机器学习”是一个涵盖性术语,覆盖了大量类似的遗传算法。
两类机器学习算法
你可以认为机器学习算法分为两大类:监督式学习(Supervised Learning)和非监督式学习(Unsupervised Learning)。两者区别很简单,但却非常重要。
监督式学习
假设你是一名房产经纪,生意越做越大,因此你雇了一批实习生来帮你。但是问题来了——你可以看一眼房子就知道它到底值多少钱,实习生没有经验,不知道如何估价。
为了帮助你的实习生(也许是为了解放你自己去度个假),你决定写个小软件,可以根据房屋大小、地段以及类似房屋的成交价等因素来评估你所在地区房屋的价值。
你把3个月来城里每笔房屋交易都写了下来,每一单你都记录了一长串的细节——卧室数量、房屋大小、地段等等。但最重要的是,你写下了最终的成交价:
这是我们的“训练数据”。
我们要利用这些训练数据来编写一个程序来估算该地区其他房屋的价值:
这就称为监督式学习。你已经知道每一栋房屋的售价,换句话说,你知道问题的答案,并可以反向找出解题的逻辑。
为了编写软件,你将包含每一套房产的训练数据输入你的机器学习算法。算法尝试找出应该使用何种运算来得出价格数字。
这就像是算术练习题,算式中的运算符号都被擦去了:
天哪!一个阴险的学生将老师答案上的算术符号全擦去了。
看了这些题,你能明白这些测验里面是什么样的数学问题吗?你知道,你应该对算式左边的数字“做些什么”以得出算式右边的答案。
在监督式学习中,你是让计算机为你算出数字间的关系。而一旦你知道了解决这类特定问题所需要的数学方法后,你就可以解答同类的其它问题了。
非监督式学习
让我们回到开头那个房地产经纪的例子。要是你不知道每栋房子的售价怎么办?即使你所知道的只是房屋的大小、位置等信息,你也可以搞出很酷的花样。这就是所谓的非监督式学习。
即使你不是想去预测未知的数据(如价格),你也可以运用机器学习完成一些有意思的事。
这就有点像有人给你一张纸,上面列出了很多数字,然后对你说:“我不知道这些数字有什么意义,也许你能从中找出规律或是能将它们分类,或是其它什么-祝你好运!”
你该怎么处理这些数据呢?首先,你可以用个算法自动地从数据中划分出不同的细分市场。也许你会发现大学附近的买房者喜欢户型小但卧室多的房子,而郊区的买房者偏好三卧室的大户型。这些信息可以直接帮助你的营销。
你还可以作件很酷的事,自动找出房价的离群数据,即与其它数据迥异的值。这些鹤立鸡群的房产也许是高楼大厦,而你可以将最优秀的推销员集中在这些地区,因为他们的佣金更高。
本文余下部分我们主要讨论监督式学习,但这并不是因为非监督式学习用处不大或是索然无味。实际上,随着算法改良,不用将数据和正确答案联系在一起,因此非监督式学习正变得越来越重要。
老学究请看:还有很多其它种类的机器学习算法。但初学时这样理解不错了。
太酷了,但是评估房价真能被看作“学习”吗?
作为人类的一员,你的大脑可以应付绝大多数情况,并且没有任何明确指令也能够学习如何处理这些情况。如果你做房产经纪时间很长,你对于房产的合适定价、它的最佳营销方式以及哪些客户会感兴趣等等都会有一种本能般的“感觉”。强人工智能(Strong AI)研究的目标就是要能够用计算机复制这种能力。
但是目前的机器学习算法还没有那么好——它们只能专注于非常特定的、有限的问题。也许在这种情况下,“学习”更贴切的定义是“在少量范例数据的基础上找出一个等式来解决特定的问题”。
不幸的是,“机器在少量范例数据的基础上找出一个等式来解决特定的问题”这个名字太烂了。所以最后我们用“机器学习”取而代之。
当然,要是你是在50年之后来读这篇文章,那时我们已经得出了强人工智能算法,而本文看起来就像个老古董。未来的人类,你还是别读了,叫你的机器仆人给你做份三明治吧。
让我们写代码吧!
前面例子中评估房价的程序,你打算怎么写呢?往下看之前,先思考一下吧。
如果你对机器学习一无所知,很有可能你会尝试写出一些基本规则来评估房价,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price= 0
# In my area, the average house costs $200 per sqft
price_per_sqft= 200
ifneighborhood =="hipsterton":
# but some areas cost a bit more
price_per_sqft= 400
elifneighborhood =="skid row":
# and some areas cost less
price_per_sqft= 100
# start with a base price estimate based on how big the place is
price= price_per_sqft* sqft
# now adjust our estimate based on the number of bedrooms
ifnum_of_bedrooms ==0:
# Studio apartments are cheap
price= price—20000
else:
# places with more bedrooms are usually
# more valuable
price= price + (num_of_bedrooms* 1000)
returnprice
假如你像这样瞎忙几个小时,也许会取得一点成效,但是你的程序永不会完美,而且当价格变化时很难维护。
如果能让计算机找出实现上述函数功能的办法,这样岂不更好?只要返回的房价数字正确,谁会在乎函数具体干了些什么呢?
1
2
3
4
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price= <computer, plz do some mathfor me>
returnprice
考虑这个问题的一种角度是将房价看做一碗美味的汤,而汤中成分就是卧室数、面积和地段。如果你能算出每种成分对最终的价格有多大影响,也许就能得到各种成分混合起来形成最终价格的具体比例。
这样可以将你最初的程序(全是疯狂的if else语句)简化成类似如下的样子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price= 0
# a little pinch of this
price+=num_of_bedrooms *.841231951398213
# and a big pinch of that
price+=sqft * 1231.1231231
# maybe a handful of this
price+=neighborhood *2.3242341421
# and finally, just a little extra salt for good measure
price+=201.23432095
returnprice
请注意那些用粗体标注的神奇数字——.841231951398213,1231.1231231,2.3242341421,和201.23432095。它们称为权重。如果我们能找出对每栋房子都适用的完美权重,我们的函数就能预测所有的房价!
找出最佳权重的一种笨办法如下所示:
步骤1:
首先,将每个权重都设为1.0:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price= 0
# a little pinch of this
price+=num_of_bedrooms *1.0
# and a big pinch of that
price+=sqft * 1.0
# maybe a handful of this
price+=neighborhood *1.0
# and finally, just a little extra salt for good measure
price+=1.0
returnprice
步骤2:
将每栋房产带入你的函数运算,检验估算值与正确价格的偏离程度:
运用你的程序预测房屋价格。
例如:上表中第一套房产实际成交价为25万美元,你的函数估价为17.8万,这一套房产你就差了7.2万。
再将你的数据集中的每套房产估价偏离值平方后求和。假设数据集中有500套房产交易,估价偏离值平方求和总计为86,123,373美元。这就反映了你的函数现在的“正确”程度。
现在,将总计值除以500,得到每套房产的估价偏离平均值。将这个平均误差值称为你函数的代价。
涉水而过的声音此次想起,