有趣的機器學習:最簡明入門指南
在聽到人們談論機器學習的時候,你是不是對它的涵義只有幾個模糊的認識呢?你是不是已經厭倦了在和同事交談時只能一直點頭?讓我們改變一下吧!
本指南的讀者物件是所有對機器學習有求知慾但卻不知道如何開頭的朋友。我猜很多人已經讀過了“機器學習”的維基百科詞條,倍感挫折,以為沒人能給出一個高層次的解釋。本文就是你們想要的東西。
本文目標在於平易近人,這意味著文中有大量的概括。但是誰在乎這些呢?只要能讓讀者對於ML更感興趣,任務也就完成了。
何為機器學習?
機器學習這個概念認為,對於待解問題,你無需編寫任何專門的程式程式碼,泛型演算法(generic algorithms)能夠在資料集上為你得出有趣的答案。對於泛型演算法,不用編碼,而是將資料輸入,它將在資料之上建立起它自己的邏輯。
舉個例子,有一類演算法稱為分類演算法,它可以將資料劃分為不同的組別。一個用來識別手寫數字的分類演算法,不用修改一行程式碼,就可以用來將電子郵件分為垃圾郵件和普通郵件。演算法沒變,但是輸入的訓練資料變了,因此它得出了不同的分類邏輯。
機器學習演算法是個黑盒,可以重用來解決很多不同的分類問題。
“機器學習”是一個涵蓋性術語,覆蓋了大量類似的泛型演算法。
兩類機器學習演算法
你可以認為機器學習演算法分為兩大類:監督式學習(Supervised Learning)和非監督式學習(Unsupervised Learning)。兩者區別很簡單,但卻非常重要。
監督式學習
假設你是一名房產經紀,生意越做越大,因此你僱了一批實習生來幫你。但是問題來了——你可以看一眼房子就知道它到底值多少錢,實習生沒有經驗,不知道如何估價。
為了幫助你的實習生(也許是為了解放你自己去度個假),你決定寫個小軟體,可以根據房屋大小、地段以及類似房屋的成交價等因素來評估你所在地區房屋的價值。
你把3個月來城裡每筆房屋交易都寫了下來,每一單你都記錄了一長串的細節——臥室數量、房屋大小、地段等等。但最重要的是,你寫下了最終的成交價:
這是我們的“訓練資料”。
我們要利用這些訓練資料來編寫一個程式來估算該地區其他房屋的價值:
這就稱為監督式學習。你已經知道每一棟房屋的售價,換句話說,你知道問題的答案,並可以反向找出解題的邏輯。
為了編寫軟體,你將包含每一套房產的訓練資料輸入你的機器學習演算法。演算法嘗試找出應該使用何種運算來得出價格數字。
這就像是算術練習題,算式中的運算子號都被擦去了:
看了這些題,你能明白這些測驗裡面是什麼樣的數學問題嗎?你知道,你應該對算式左邊的數字“做些什麼”以得出算式右邊的答案。
在監督式學習中,你是讓計算機為你算出數字間的關係。而一旦你知道了解決這類特定問題所需要的數學方法後,你就可以解答同類的其它問題了。
非監督式學習
讓我們回到開頭那個房地產經紀的例子。要是你不知道每棟房子的售價怎麼辦?即使你所知道的只是房屋的大小、位置等資訊,你也可以搞出很酷的花樣。這就是所謂的非監督式學習。
這就有點像有人給你一張紙,上面列出了很多數字,然後對你說:“我不知道這些數字有什麼意義,也許你能從中找出規律或是能將它們分類,或是其它什麼-祝你好運!”
你該怎麼處理這些資料呢?首先,你可以用個演算法自動地從資料中劃分出不同的細分市場。也許你會發現大學附近的買房者喜歡戶型小但臥室多的房子,而郊區的買房者偏好三臥室的大戶型。這些資訊可以直接幫助你的營銷。
你還可以作件很酷的事,自動找出房價的離群資料,即與其它資料迥異的值。這些鶴立雞群的房產也許是高樓大廈,而你可以將最優秀的推銷員集中在這些地區,因為他們的佣金更高。
本文餘下部分我們主要討論監督式學習,但這並不是因為非監督式學習用處不大或是索然無味。實際上,隨著演算法改良,不用將資料和正確答案聯絡在一起,因此非監督式學習正變得越來越重要。
老學究請看:還有很多其它種類的機器學習演算法。但初學時這樣理解不錯了。
太酷了,但是評估房價真能被看作“學習”嗎?
作為人類的一員,你的大腦可以應付絕大多數情況,並且沒有任何明確指令也能夠學習如何處理這些情況。如果你做房產經紀時間很長,你對於房產的合適定價、它的最佳營銷方式以及哪些客戶會感興趣等等都會有一種本能般的“感覺”。強人工智慧(Strong AI)研究的目標就是要能夠用計算機複製這種能力。
但是目前的機器學習演算法還沒有那麼好——它們只能專注於非常特定的、有限的問題。也許在這種情況下,“學習”更貼切的定義是“在少量範例資料的基礎上找出一個等式來解決特定的問題”。
不幸的是,“機器在少量範例資料的基礎上找出一個等式來解決特定的問題”這個名字太爛了。所以最後我們用“機器學習”取而代之。
當然,要是你是在50年之後來讀這篇文章,那時我們已經得出了強人工智慧演算法,而本文看起來就像個老古董。未來的人類,你還是別讀了,叫你的機器僕人給你做份三明治吧。
讓我們寫程式碼吧!
前面例子中評估房價的程式,你打算怎麼寫呢?往下看之前,先思考一下吧。
如果你對機器學習一無所知,很有可能你會嘗試寫出一些基本規則來評估房價,如下:
Python123456789101112131415161718192021222324252627 | defestimate_house_sales_price(num_of_bedrooms,sqft,neighborhood):price=0# In my area, the average house costs $200 per sqftprice_per_sqft=200ifneighborhood=="hipsterton":# but some areas cost a bit moreprice_per_sqft=400elifneighborhood=="skid row":# and some areas cost lessprice_per_sqft=100# start with a base price estimate based on how big the place isprice=price_per_sqft*sqft# now adjust our estimate based on the number of bedroomsifnum_of_bedrooms==0:# Studio apartments are cheapprice=price — 20000else:# places with more bedrooms are usually# more valuableprice=price+(num_of_bedrooms*1000)returnprice |
假如你像這樣瞎忙幾個小時,也許會取得一點成效,但是你的程式永不會完美,而且當價格變化時很難維護。
如果能讓計算機找出實現上述函式功能的辦法,這樣豈不更好?只要返回的房價數字正確,誰會在乎函式具體幹了些什麼呢?
Python1234 | defestimate_house_sales_price(num_of_bedrooms,sqft,neighborhood):price=<computer,plz do some mathforme>returnprice |
考慮這個問題的一種角度是將房價看做一碗美味的湯,而湯中成分就是臥室數、面積和地段。如果你能算出每種成分對最終的價格有多大影響,也許就能得到各種成分混合起來形成最終價格的具體比例。
這樣可以將你最初的程式(全是瘋狂的if else語句)簡化成類似如下的樣子:
Python12345678910111213141516 | defestimate_house_sales_price(num_of_bedrooms,sqft,neighborhood):price=0# a little pinch of thisprice+=num_of_bedrooms*.841231951398213# and a big pinch of thatprice+=sqft*1231.1231231# maybe a handful of thisprice+=neighborhood*2.3242341421# and finally, just a little extra salt for good measureprice+=201.23432095returnprice |
請注意那些用粗體標註的神奇數字——.841231951398213, 1231.1231231,2.3242341421,和201.23432095。它們稱為權重。如果我們能找出對每棟房子都適用的完美權重,我們的函式就能預測所有的房價!
找出最佳權重的一種笨辦法如下所示:
步驟1:
首先,將每個權重都設為1.0:
Python12345678910111213141516 | defestimate_house_sales_price(num_of_bedrooms,sqft,neighborhood):price=0# a little pinch of thisprice+=num_of_bedrooms*1.0# and a big pinch of thatprice+=sqft*1.0# maybe a handful of thisprice+=neighborhood*1.0# and finally, just a little extra salt for good measureprice+=1.0returnprice |
步驟2:
將每棟房產帶入你的函式運算,檢驗估算值與正確價格的偏離程度:
例如:上表中第一套房產實際成交價為25萬美元,你的函式估價為17.8萬,這一套房產你就差了7.2萬。
再將你的資料集中的每套房產估價偏離值平方後求和。假設資料集中有500套房產交易,估價偏離值平方求和總計為86,123,373美元。這就反映了你的函式現在的“正確”程度。
現在,將總計值除以500,得到每套房產的估價偏離平均值。將這個平均誤差值稱為你函式的代價。
如果你能調整權重使得這個代價變為0,你的函式就完美了。它意味著,根據輸入的資料,你的程式對每一筆房產交易的估價都是分毫不差。而這就是我們的目標——嘗試不同的權重值以使代價儘可能的低。
步驟3:
不斷重複步驟2,嘗試所有可能的權重值組合。哪一個組合使得代價最接近於0,它就是你要使用的,你只要找到了這樣的組合,問題就得到了解決!
思想擾動時間
這太簡單了,對吧?想一想剛才你做了些什麼。你取得了一些資料,將它們輸入至三個通用的簡單步驟中,最後你得到了一個可以對你所在區域的房屋進行估價的函式。房價網,要當心咯!
但是下面的事實可能會擾亂你的思想:
1.過去40年來,很多領域(如語言學/翻譯學)的研究表明,這種通用的“攪動資料湯”(我編造的詞)式的學習演算法已經勝過了需要利用真人明確規則的方法。機器學習的“笨”辦法最終打敗了人類專家。
2.你最後寫出的函式真是笨,它甚至不知道什麼是“面積”和“臥室數”。它知道的只是攪動,改變數字來得到正確的答案。
3.很可能你都不知道為何一組特殊的權重值能起效。所以你只是寫出了一個你實際上並不理解卻能證明的函式。
4.試想一下,你的程式裡沒有類似“面積”和“臥室數”這樣的引數,而是接受了一組數字。假設每個數字代表了你車頂安裝的攝像頭捕捉的畫面中的一個畫素,再將預測的輸出不稱為“價格”而是叫做“方向盤轉動度數”,這樣你就得到了一個程式可以自動操縱你的汽車了!
太瘋狂了,對吧?
步驟3中的“嘗試每個數字”怎麼回事?
好吧,當然你不可能嘗試所有可能的權重值來找到效果最好的組合。那可真要花很長時間,因為要嘗試的數字可能無窮無盡。
為避免這種情況,數學家們找到了很多聰明的辦法來快速找到優秀的權重值,而不需要嘗試過多。下面是其中一種:
首先,寫出一個簡單的等式表示前述步驟2:
接著,讓我們將這同一個等式用機器學習的數學術語(現在你可以忽略它們)進行重寫:
這個等式表示我們的估價程式在當前權重值下偏離程度的大小。
如果將所有賦給臥室數和麵積的可能權重值以圖形形式顯示,我們會得到類似下圖的圖表:
代價函式的圖形像一支碗。縱軸表示代價。
圖中藍色的最低點就是代價最低的地方——即我們的程式偏離最小。最高點意味著偏離最大。所以,如果我們能找到一組權重值帶領我們到達圖中的最低點,我們就找到了答案!
因此,我們只需要調整權重值使我們在圖上能向著最低點“走下坡路”。如果對於權重的細小調節能一直使我們保持向最低點移動,那麼最終我們不用嘗試太多權重值就能到達那裡。
如果你還記得一點微積分的話,你也許記得如果你對一個函式求導,結果會告訴你函式在任一點的斜率。換句話說,對於圖上給定一點,它告訴我們那條路是下坡路。我們可以利用這一點朝底部進發。
所以,如果我們對代價函式關於每一個權重求偏導,那麼我們就可以從每一個權重中減去該值。這樣可以讓我們更加接近山底。一直這樣做,最終我們將到達底部,得到權重的最優值。(讀不懂?不用擔心,接著往下讀)。
這種找出最佳權重的辦法被稱為批量梯度下降,上面是對它的高度概括。如果想搞懂細節,不要害怕,繼續深入下去吧。
當你使用機器學習演算法庫來解決實際問題,所有這些都已經為你準備好了。但明白一些具體細節總是有用的。
還有什麼你隨便就略過了?
上面我描述的三步演算法被稱為多元線性迴歸。你估算等式是在求一條能夠擬合所有房價資料點的直線。然後,你再根據房價在你的直線上可能出現的位置用這個等式來估算從未見過的房屋的價格。這個想法威力強大,可以用它來解決“實際”問題。
但是,我為你展示的這種方法可能在簡單的情況下有效,它不會在所有情況下都有用。原因之一是因為房價不會一直那麼簡單地跟隨一條連續直線。
但是,幸運的是,有很多辦法來處理這種情況。對於非線性資料,很多其他型別的機器學習演算法可以處理(如神經網路或有核向量機)。還有很多方法運用線性迴歸更靈活,想到了用更復雜的線條來擬合。在所有的情況中,尋找最優權重值這一基本思路依然適用。
還有,我忽略了過擬合的概念。很容易碰上這樣一組權重值,它們對於你原始資料集中的房價都能完美預測,但對於原始資料集之外的任何新房屋都預測不準。這種情況的解決之道也有不少(如正則化以及使用交叉驗證資料集)。學會如何處理這一問題對於順利應用機器學習至關重要。
換言之,基本概念非常簡單,要想運用機器學習得到有用的結果還需要一些技巧和經驗。但是,這是每個開發者都能學會的技巧。
機器學習法力無邊嗎?
一旦你開始明白機器學習技術很容易應用於解決貌似很困難的問題(如手寫識別),你心中會有一種感覺,只要有足夠的資料,你就能夠用機器學習解決任何問題。只需要將資料輸入進去,就能看到計算機變戲法一樣找出擬合數據的等式。
但是很重要的一點你要記住,機器學習只能對用你佔有的資料實際可解的問題才適用。
例如,如果你建立了一個模型來根據每套房屋內盆栽數量來預測房價,它就永遠不會成功。房屋內盆栽數量和房價之間沒有任何的關係。所以,無論它怎麼去嘗試,計算機也推導不出兩者之間的關係。
你只能對實際存在的關係建模。
怎樣深入學習機器學習
我認為,當前機器學習的最大問題是它主要活躍於學術界和商業研究組織中。對於圈外想要有個大體瞭解而不是想成為專家的人們,簡單易懂的學習資料不多。但是這一情況每一天都在改善。
吳恩達教授(Andrew Ng)在Coursera上的機器學習免費課程非常不錯。我強烈建議由此入門。任何擁有電腦科學學位、還能記住一點點數學的人應該都能理解。
另外,你還可以下載安裝SciKit-Learn,用它來試驗成千上萬的機器學習演算法。它是一個python框架,對於所有的標準演算法都有“黑盒”版本。
相關推薦
有趣的機器學習:最簡明入門指南
在聽到人們談論機器學習的時候,你是不是對它的涵義只有幾個模糊的認識呢?你是不是已經厭倦了在和同事交談時只能一直點頭?讓我們改變一下吧! 本指南的讀者物件是所有對機器學習有求知慾但卻不知道如何開頭的朋友。我猜很多人已經讀過了“機器學習”的維基百科詞條,倍感挫折,以為沒
人工智能、機器學習和認知計算入門指南
不遠 要素 人工 算法 網絡拓撲 界面 分布 target 用戶 幾千年來,人們就已經有了思考如何構建智能機器的想法。從那時開始,人工智能 (AI) 經歷了起起落落,這證明了它的成功以及還未實現的潛能。如今,隨時都能聽到應用機器學習算法來解決新問題的新聞。從癌癥檢測和預測到
【Machine Learning】機器學習:簡明入門指南
在聽到人們談論機器學習的時候,你是不是對它的涵義只有幾個模糊的認識呢?你是不是已經厭倦了在和同事交談時只能一直點頭?讓我們改變一下吧! 本指南的讀者物件是所有對機器學習有求知慾但卻不知道如何開頭的朋友。我猜很多人已經讀過了“機器學習”的維基百科詞條,倍感挫
機器學習新手必看:Jupyter Notebook入門指南
翻譯 | 張建軍出品 | 人工智慧頭條(公眾號ID:AI_Thinker)【人工智慧頭條導讀】Jupyter
從零單排入門機器學習:線性回歸(linear regression)實踐篇
class rom enter instr function ont 線性 gin 向量 線性回歸(linear regression)實踐篇 之前一段時間在coursera看了Andrew ng的機器學習的課程,感覺還不錯,算是入門了。這次打算以該課程的作業
機器學習:從入門到晉級
應該 研發 做到 咨詢 完成後 激勵 並且 學習機 作業 目前,人工智能(AI)非常熱門,許多人都想一窺究竟。如果你對人工智能有所了解,但對機器學習(Machine Learning)的理解有很多的困惑,那麽看完本文後你將會對此有進一步深入理解。在這裏,不會詳細介紹機
機器學習:貝葉斯網路入門
貝葉斯理論是處理不確定性資訊的重要工具。作為一種基於概率的不確定性推理方法,貝葉斯網路在處理不確定資訊的智慧化系統中已得到了重要的應用,已成功地用於醫療診斷、統計決策、專家系統、學習預測等領域。它有幾個特性 1、貝葉斯網路本身是一種不定性因果關聯模型。貝葉斯網路與其他決
機器學習:線性迴歸和嶺迴歸入門程式碼
機器學習中運用python進行對房子價格的預測程式碼,資料庫直接使用sklearn自帶的boston,使用三種方法進行預測,分別是:線性迴歸直接預測、梯度下降預測、嶺迴歸預測 from sklearn.datasets import load_boston fr
機器學習之最小二乘法:背後的假設和原理
1 最小二乘法相關理論 我們先從最基本但很典型的線性迴歸演算法之最小二乘法說起吧,它背後的假設和原理您瞭解嗎?本系列帶來細細體會OLS這個演算法涉及的相關理論和演算法。 參考推送: 似然函式求權重引數 似然函式的確是求解類似問題的常用解決方法,包
機器學習期望最大演算法:例項解析
01 回顧 已經分析了樸素貝葉斯分類,拉普拉斯修正,半樸素貝葉斯分類器,在這些理論闡述中,都帶有詳細的例子解釋,通過例子理解相關的理論是一種快速消化公式和理論比較不錯的方法。 接下來,介紹一種非常經典的求解隱變數的演算法,這也是一種經典的演算法。讓我們先
概率統計與機器學習:獨立同分布,極大似然估計,線性最小二乘迴歸
獨立同分布 獨立性 概念:事件A,B發生互不影響 公式:P(XY)=P(X)P(Y) , 即事件的概率等於各自事件概率的乘積 舉例: 正例:兩個人同時向上拋硬幣,兩個硬幣均為正面的概率 反例:獅子在某地區出現的概率為X,老虎出現概率為Y,同時出現
鄒博機器學習演算法最新版( 吳恩達前輩、唐宇迪老師、張志華老師多家對比,入門最優 ) --- 獻給想要入門、或者想要進階的朋友
慌慌張張,匆匆忙忙,生活本來就是這樣 很喜歡郝雲的《活著》這首歌,很生動的描述了現代年輕上班族的生活。 時光飛逝,從開始接觸機器學習 已經一年多了,現已成功從安卓移動端轉戰機器學習 現在也如願從事機器學習的工作,雖初出茅廬,卻也拿到了比較滿意的25+ 想起當
機器學習的最小可用產品:人工智慧應用的敏捷開發
我們曾經在公眾號上發過一篇文章《年薪百萬的機器學習專家,為什麼不產生價值?》,文中的機器學習專家花了大量的時間搭建平臺,做資料的清洗、處理與機器學習建模,卻沒有帶來公司所期望的價值。問題出在哪裡了呢? 基於第四正規化在機器學習工業應用方面的大量成功案例和經驗,我們今天就來
機器學習:如何找到最優學習率
學習率的重要性 目前深度學習使用的都是非常簡單的一階收斂演算法,梯度下降法,不管有多少自適應的優化演算法,本質上都是對梯度下降法的各種變形,所以初始學習率對深層網路的收斂起著決定性的作用,下面就是梯度下降法的公式 [Math Processing Error]w:
機器學習:神經網絡之表達
聚類 推薦系統 處理 mar 添加 gist 課程筆記 像素 ... ************************************** 註:本系列博客是博主學習Stanford大學 Andrew Ng 教授的《機器學習》課程筆記。博主深感學過課程後,不進行總
機器學習:Python實現聚類算法(三)之總結
.fig ask class ted ssi 缺點 處理 blob ron 考慮到學習知識的順序及效率問題,所以後續的幾種聚類方法不再詳細講解原理,也不再寫python實現的源代碼,只介紹下算法的基本思路,使大家對每種算法有個直觀的印象,從而可以更好的理解函數中
機器學習:線性判別式分析(LDA)
get generated 分類 learn 參數 關註 ble 直線 圖片 1.概述 線性判別式分析(Linear Discriminant Analysis),簡稱為LDA。也稱為Fisher線性判別(Fisher Linear Disc
機器學習:緒論
訓練 ner special dict ttr 空間 attr cti 輸出 學習教材為周誌華教授的西瓜書《機器學習》 1.2 基本術語 維數 dimensionality 示例 instance 屬性或特征 attribute or feature 特征向量 featur
機器學習:模型評估和選擇
val 上一個 bootstrap 自助法 break all 誤差 rec 數據集 2.1 經驗誤差與擬合 精度(accuracy)和錯誤率(error rate):精度=1-錯誤率 訓練誤差(training error)或經驗誤差(empirical error) 泛
機器學習:樣本去中心化目的
idt rac 相同 orm ans 預處理 特征 original 需要 作者:Spark鏈接:https://www.zhihu.com/question/37069477/answer/132387124來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉