《機器學習有意思! 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

相關文章
相關標籤/搜索