《机器学习有意思! 01》- 世界上最简单的机器学习入门

原文:Machine Learning is Fun! Part 1 —— The world’s easiest introduction to Machine Learningpython

做者:Adam Geitgey算法

翻译:Kaiser(微博:王司图)小程序


本文的多国语言版: 日本語, Português, Türkçe, Français, 한국어, العَرَبِيَّة‎‎, Español (México), Español (España)Polskibash

你是否也曾听人们谈起机器学习可是只有一个朦胧的概念?你是否厌倦了在同事的高谈阔论中颓然欲睡?此诚求变之机。网络


本教程适合全部对机器学习感到好奇,殊不知从何下手的读者。我想应该有不少人试着读了维基百科页面,而后愈发迷惘、沉沦,盼望着有人可以提供一个high-level的解释,那你找对地方了。框架

咱们的目标是让全部人都能读懂——这就不免有些泛泛而谈。可是无妨,但凡本文能让一我的真正对机器学习感兴趣,那么目的就算达到了。机器学习


什么是机器学习?

机器学习的核心思想是创造一种普适的算法,它能从数据中挖掘出有趣的东西,而不须要针对某个问题去写代码。你须要作的只是把数据“投喂”给普适算法,而后它会在数据上创建本身的逻辑。wordpress

好比说有一种算法,叫分类算法,它能够把数据分到不一样的组别当中。一个识别手写数字的分类算法,也能够用做判断垃圾邮件,而无需修改一行代码。算法是同一个算法,只是输入了不一样的训练数据,便有了不一样的分类逻辑。函数

机器学习算法是个黑盒,且能够在不一样分类问题中重复利用。

“机器学习”是个筐,什么普适算法都往里装。post


两种机器学习算法

机器学习主要分为两类——有监督学习无监督学习,区别很简单,却很关键。

有监督学习

想一想你是一家房产中介。你的业务正在增加,因此雇了一帮实习销售来助拳。那么问题来了——身经百战的你,一眼就看穿一栋房子价值几何,可是实习生可没有这样丰富的人生经验,因此摸不许行情。

为了辅助实习生(以便解放本身度个假),你决定作个小程序,基于面积、周边环境、类似房产成交价等等,来预估本地的房价。

因此你把3个月来本市的每一笔交易都拿小本本记了下来。对每处房产都整理了一大堆细节——房间数、面积、周边环境等等,固然最重要的是,最终成交价:

这就是咱们的“训练数据”

有了训练数据,咱们就想搞个程序去预估其余的房价:

用训练数据去预测别的房屋价格

这就是有监督学习。你是知道每处房产到底卖多少的,换言之,问题的答案是已知的,逻辑是能够反推的。

为了开发小程序,把每处房产的训练数据导进机器学习算法里,算法试图摸索出其中的数学规律。

这有点像是去掉了符号的算术题答案:

Oh no!一个熊孩子把参考答案里的运算符号给涂没了!

根据上图,你可否推算出这些题目的原貌呢?显然,咱们须要对这些数字“动点手脚”,以使等式成立。

有监督学习中,咱们作的实际上就是让电脑代替人来让等式成立。一旦你学会了解决某一类问题,那么这类问题里的任何子问题都就迎刃而解了!

无监督学习

回到最开始那个卖房地产的例子。若是咱们不知道具体每处房产的价格可咋整?即便仅知道面积、位置等信息,你也依然能够搞点动静出来,这就叫无监督学习

即便不预测未知数(好比房价),机器学习也能带来有趣的结论

这就比如有人给你一张纸,上面写着一串数字,而后说“我也不知道啥意思,你能够猜猜这是什么套路——好运!”

这些数据咱们能作什么呢?对于新手来说,能够获得一个算法,从数据中自动辨识出细分的市场定位。可能你会发现,当地大学附近的购房者偏好多卧室的小房子,而郊区的购房者则倾向于大套三。了解到不一样类型消费者的存在能够指导市场行为。

另外一个能够作的就是自动识别出那些少有类似点的特异房产。可能这些特异房产是豪华公馆,那么就能够调配最好的销售人员专门负责这些大买卖。

后文主要专一于有监督学习,但并不是由于无监督学习的做用小或者趣味少。实际上无监督学习的重要性与日俱增且发展迅速,由于不须要事先对正确答案对应的数据加标签。

注:还有不少其余种类的机器学习算法,不过建议从这些基础算法入手。


哎哟不错,可是真的有可能“学习”到真实的房价吗?

做为一我的类,你的大脑能够面对各类形势,而且在无明确指导的状况下自主学习如何应对。若是你卖了好久的房子,就会慢慢地对房价、对销售策略、对观察客户等问题产生一种“感受”。强人工智能研究的目的就在于让计算机掌握这种能力。

可是当前的机器学习算法还没那么厉害——它们只能对很具体、有限的问题生效。或许这里的“学习”更应该定义为“基于样本数据得出解决具体问题的等式”。

不幸的是,“让机器基于样本数据得出解决具体问题的等式”不是个好名字,因此咱们仍是回到了“机器学习”。

固然若是你在50年后,强人工智能都普及了时候看到本文,会以为全文都很“古典”。别看了,让你的机器人给你拿个包子吃,将来人类。


放码过来!

然,上面例子里的预测房价程序应该怎么写呢?思考一秒,而后接着看。

若是你对机器学习一无所知,可能会尝试依照预测房价的基本规律,写出以下代码:

[amalthea_exercise lang="python" executable="false" writable="false"]
[amalthea_sample_code]
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[/amalthea_sample_code]
[/amalthea_exercise]
复制代码

若是顺着写上几个小时,或许也能获得一个能跑的程序。但势必存在隐患,并且没法应对价格变化。

若是计算机能本身发现如何应用这些方程,那岂不是好得多?只要能获得正确的数字,谁管具体方程是什么呢?

[amalthea_exercise lang="python" executable="false" writable="false"]
[amalthea_sample_code]
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 贾维斯,帮我算一下

    return price
[/amalthea_sample_code]
[/amalthea_exercise]
复制代码

这个问题能够想象成:价格是道炖菜,配方是卧室数量面积周边环境。若是你能算出每种成分对最终价格的影响是多少,或许那就是配方“搅合”最终价格的确切权重。

这可使原程序(尽是if/else)变得简单以下:

[amalthea_exercise lang="python" executable="false" writable="false"]
[amalthea_sample_code]
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 0

    # 加少量配方1
    price += num_of_bedrooms * .841231951398213

    # 加大把配方2
    price += sqft * 1231.1231231

    # 适量的配方3
    price += neighborhood * 2.3242341421

    # 最后来点盐
    price += 201.23432095

    return price
[/amalthea_sample_code]
[/amalthea_exercise]
复制代码

注意这些奇妙深入的加粗数字——.8412319513982131231.12312312.3242341421201.23432095,这就是咱们的权重。只要咱们能找到准确的权重,那就能够预测房价了。

一个比较粗暴的权重计算方法大体以下:

第一步:

把全部权重都设为1.0:

[amalthea_exercise lang="python" executable="false" writable="false"]
[amalthea_sample_code]
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 0

    # 加少量配方1
    price += num_of_bedrooms * 1.0

    # 加大把配方2
    price += sqft * 1.0

    # 适量的配方3
    price += neighborhood * 1.0

    # 最后来点盐
    price += 1.0

    return price
[/amalthea_sample_code]
[/amalthea_exercise]
复制代码

第2步:

把每一个房产的参数代入公式,计算预测结果和实际价格的偏差:

用你的方程来猜房价

好比第一个房子实际卖了$250,000,可是你的方程却预测的是$178,000,但这一个房子就少了$72,000。

如今把每一个房子对应偏差的平方加起来,比方你有500单交易,那么偏差的平方和就有$86,123,373,可谓谬以千里。再把平方和除以500获得平均每一个房子的偏差,这一平均偏差值就是方程的代价(即最小二乘法,平方是为了防止偏差正负相抵)。

若是咱们能经过调整权重将代价降为零,那方程就完美了。这表示在全部例子中,方程都准确无误地基于输入数据猜中了房价。这就是咱们的目标——尝试不一样的权重,让代价尽可能低。

第3步:

不断地重复第2步,尝试每一种可能的权重值组合。哪一个组合能让代价最接近于0就选哪一组。找到那一组权重,就解决了问题!


脑洞时间

挺简单的对吧?回想一下刚才的所作,拿到一些数据,填进三个普适的、简单的步骤里,而后获得一个能猜房价的方程。Zillow(美国房价预测网站)面临着严重的威胁!

可是有这么几个激动人心的事实:

  1. 过去40年里,不少领域(如语言学/翻译学)的研究已经代表,“搅合数字炖菜”(做者本身打的比方)的普适性学习算法已经超越了那些,由真人尝试本身发现显式规律的人方法。机器学习的“暴力”方法最终击败了人类专家。

  2. 刚才得出的方程实际上是很笨的。它并不知道“平方米”和“卧室”究竟是什么,它只知道“搅拌”多少数字能够获得正确答案。

  3. 你大概并不知道为何某一组权重就是好的,而只是写了一个本身都不明白的方程,但却证实是好用的。

  4. 假设咱们不用“平方米”和”卧室数“这些参数,而是读入一个数列。比方说每一个数字表明的是”从车顶上拍的照片的某一像素的亮度”,而后咱们预测的结果也不是“房价”了,而是“方向盘转过的角度”。这就是一我的自动驾驶的风方程了?

疯了,对吧?


第3步的“尝试每一个数字”

固然你不可能真的尝试每一种可能权重组合来寻找最优解,实际状况是永远尝试不完。

为了不这一状况,数学家们发现了不少机智办法来尽快找到一个不错的结果。如下就是其中一种:

第一,写一个可以表明上面“第2步”的方程:

这就是代价函数

而后用机器学习界的黑话(暂时能够忽略)从新写一遍:

$\theta$表明当前权重。$J(\theta)$是当前权重的代价值。

这个等式表明了在当前的权重组合下,咱们的价格预测有多么离谱。

若是把房间数平方米全部可能权重值可视化,能够获得相似下图的图像:

代价函数的图像像个碗。竖直轴表示代价。

这个图里的蓝色最低点就是代价的最低点——方程偏差最小处,最高点便是最离谱的状况。因此若是咱们找到一组权重值,使得方程对应最低点,那就是答案!

因此咱们只须要以“下山”的方式来调整权重,逼近最低点。若是每一次微小的调整都向着最低点进发,那早晚可以到达。

函数的导数就是切线的斜率,换句话说,这告诉咱们哪条路能够“下山”。

所以若是计算代价函数对每一个权重的偏微分,而后再从权重里减去这个值,这可让咱们离谷底更近。重复执行,最终咱们会到达谷底并得到权重的最优解(若是没看懂,不要担忧,继续看)。

这是一种寻找方程最佳权重方式的高度归纳,叫做批梯度降低(batch gradient descent)。若是你对此感兴趣,不要惧怕,了解更多细节

当你使用机器学习库来解决实际问题的时候,这些都会自动完成,可是了解究竟发生了什么仍是颇有用的。


还略过了什么?

上述的三步算法便是多变量线性回归,针对一条穿过房产数据的直线来进行预测目标等式,并用这一等式去猜想此前不曾见过的房屋价格,解决实际问题的时候这很是行之有效。

可是以上方法或许只对特别简单的例子好使,并不是万金油。其中一个缘由就是房价不老是简单到能用一条连续直线来表明。

好在另有不少方法解决,不少机器学习算法能够处理非线性数据(如神经网络有核支持向量机)。一样也有算法是以更加聪明的方式使用线性回归以拟合更复杂的直线。但不论哪一方法,最根本的思想都是找到最佳的权重。

而且我忽略了过拟合问题。对于已有的原始数据,找到一组很棒的权重值不难,可是却有可能对训练集之外新的房子不适用。有不少方法能够避免这一现象(如正则化和使用交叉验证数据集),这是成功应用机器学习算法的关键命题。

尽管基本概念很简单,可是要用机器学习取得有用的结果,仍是须要技巧和经验的。不过这些技巧是每个开发者,都可以学会的!


机器学习是魔法吗?

看到机器学习技术如此轻易就解决了看起来很是困难的问题(如手写识别),你可能会感受只要有足够多的数据,什么问题都不是问题了。导入数据,而后等着计算机变出一个适合数据的式子!

但须要记住的事,机器学习要想生效,必须知足一个条件,就是目标问题对已有数据确实是可解的。

好比创建一个模型,根据房子里种的植物种类预测房价,这确定无论用。由于房里的植物和售价原本就没有关系,无论再怎么试,计算机仍是没法找出这种关系。

只有实际存在的关系才能建模

因此若是一位人类专家不能用数据解决某个问题,计算机也不行。相反,计算机的优点在于,对于人类能解决的问题,计算机能够更快地完成。


如何学习更多机器学习

在我看来,机器学习目前最大的问题在于其主要仍是存在于学术界,对于广大只是想稍微了解、而并不是想成为专家的人们,通俗易懂的材料仍是不够丰富,固然这一状况已经在好转。

吴恩达的Machine Learning class on Coursera至关惊艳,我强烈推荐从这里开始。对于CS专业的人,只要还记得一丁点数学,就能够学。

你也能够经过下载安装Scikit-learn,来本身尝试海量的机器学习算法,这是一个提供“黑盒”版标准算法的Python框架。



推荐阅读

用PaddlePaddle调戏邮件诈骗犯(完结篇)

这评论有毒!——文本分类的通常套路

用Python和Keras搭建你本身的AlphaZero

相关文章
相关标签/搜索