機器學習原來如此有趣!全世界最簡單的機器學習入門指南更多關於機器學習的實戰案例
算法
你是否曾經聽到過人們談論機器學習,而你卻對其含義只有一個模糊的概念呢?你是否已經厭倦了在和同事對話時只能點頭呢?如今,讓咱們一塊兒來改變這個現狀吧!網絡
這篇文章是爲那些對機器學習感興趣殊不知道如何開始的人而寫的。我估計有不少人嘗試過閱讀維基百科上面關於機器學習的文章,結果越讀越受挫,後面乾脆直接放棄,同時但願有人可以給出一個高質量的解釋,那太棒了,這篇文章就是在幹這件事。機器學習競賽優勝解決方案架構
這篇文章的目標是讓全部人都能看懂,因此文章中將會有不少的歸納,可是誰在乎呢?若是這篇文章能引發一部分人對機器學習的興趣,那個人使命就達成了。運維
機器學習是一種概念:不須要寫任何與問題有關的特定代碼,泛型算法(Generic Algorithms)就能告訴你一些關於你數據的有趣結論。不用編碼,你將數據輸入泛型算法當中,它就會在數據的基礎上創建出它本身的邏輯。機器學習
例如,有一種算法叫作分類算法。它能夠將數據放進不一樣的分組。用於識別手寫數字的分類算法也能夠用於區分垃圾郵件和非垃圾郵件,且不須要改變任何代碼。算法是同一個,可是輸入了不一樣的訓練數據,因此得出不一樣的分類邏輯。分佈式
機器學習算法是個黑盒,它能夠重複使用於不少不一樣的分類問題。函數
機器學習是覆蓋許多種泛型算法的涵蓋性術語。oop
你能夠將機器學習算法分紅兩大類別:監督式學習(supervised Learning)和非監督式學習(unsupervised Learning)。要區分二者很簡單,但也很是重要。學習
監督式學習測試
假設你是一名房地產經紀人,你的生意蒸蒸日上,所以你僱了一批新員工來幫忙。可是問題來了——雖然你能夠一眼估算出房子的價格,但新員工卻不像你這樣經驗豐富,他們不知道如何給房子估價。
爲了幫助你的新員工(也許就是爲了給本身放個假嘻嘻),你決定寫一個能夠根據房屋大小、地段以及同類房屋成交價等因素來評估一間房屋的價格的小軟件。
近三個月來,每當你的城市裏有人賣了房子,你都記錄了下面的細節——臥室數量、房屋大小、地段等等。但最重要的是,你寫下了最終的成交價:
使用這些訓練數據,咱們要來編寫一個可以估算該地區其餘房屋價值的程序:
咱們但願使用這些訓練數據來預測其餘房屋的價格。
這就是監督式學習。你已經知道了每一棟房屋的售價,換句話說,你已經知道了問題的答案,而且能夠反向找出解題的邏輯。
爲了編寫你的軟件,你將包含每一套房產的訓練數據輸入到你的機器學習算法當中去。算法會嘗試找出須要作哪些數學運算來得出價格。
這就好像是你已經知道了數學測試題的答案,可是算式中的運算符號都被擦去了:
天啊!一個陰險的學生擦去了參考答案上的算術符號!
你能從這張圖裏看出來測驗中的數學題是怎樣的嗎?你知道本身應該對左邊的數字「作些什麼」,才能獲得右邊的答案。
在監督式學習中,你讓計算機爲你算出這種關係。而一旦你知道了解決這類特定問題所須要的數學方法後,你就能夠解答其它同類問題了!
非監督式學習
讓咱們回到房地產經紀人的例子。若是你不知道每棟房子的售價怎麼辦?即便你所知道的僅僅是每棟房屋的大小、位置等信息,你也能夠搞出一些很酷炫的花樣來。這就是咱們所說的非監督式學習。
即便你並非在嘗試預測未知的數據(如價格),你也能夠運用機器學習作一些有意思的事。
這就有點像有人給你一張紙,上面寫了一列數字,而後說:「我不太清楚這些數字有什麼意義,但也許你能找出些規律或是把它們分類什麼的——祝你好運!」
因此該怎麼處理這些數據呢?首先,你能夠用個算法自動從數據中劃分出不一樣的細分市場。也許你會發現,當地大學附近的購房者特喜歡戶型小、臥室多的房子,而郊區的購房者偏好三臥室的大戶型。瞭解這些不一樣消費者的喜愛能夠直接幫助你的營銷。
你還能夠作件很酷炫的事,就是自動找出非同尋常的房屋。這些不同凡響的房產也許是奢華的豪宅,而你能夠將最優秀的銷售人員集中在這些地區,由於他們的佣金更高。
在接下來的內容中咱們主要討論監督式學習,但這並非由於非監督式學習比較沒用或是無趣。實際上,隨着算法的改良,非監督式學習正變得愈來愈重要,由於即便不將數據和正確答案聯繫在一塊兒,它也能夠被使用。
太酷炫了,可是估算房價真能被看做「學習」嗎?
做爲人類的一員,你的大腦能夠應付絕大多數狀況,而且在沒有任何明確指令時也可以學習如何處理這些狀況。若是你作房地產經紀人時間足夠長,你對於房產的合適訂價、房屋的最佳營銷方式以及客戶會感興趣類型等等都會有一種本能般的「感受」。強人工智能研究的目標就是要計算機複製這種能力。
可是目前的機器學習算法尚未那麼強大——它們只能在很是特定的、有限的問題上有效。也許在這種狀況下,「學習」更貼切的定義是「在少許樣本數據的基礎上找出一個公式來解決特定的問題」。
可是「機器在少許樣本數據的基礎上找出一個公式來解決特定的問題」不是個好名字。因此最後咱們用「機器學習」取而代之。
固然了,若是你是在 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
注意那些用粗體標註的神奇數字——.841231951398213, 1231.1231231, 2.3242341421, 和201.23432095。它們稱爲權重(weight)。若是咱們能找出對每棟房子都適用的完美權重,咱們的函數就能預測全部的房價!
一種找出最佳權重的笨辦法以下所示:更多關於機器學習的實戰案例
第一步:
首先,將每一個權重都設爲 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
第二步:
將你知道的每棟房產的數據代入函數進行運算,檢驗估算值與正確價格的偏離程度:
用你的程序來預測每棟房屋的價格。
好比說,若是第一套房產實際成交價爲 25 萬美圓,你的函數估價爲 17.8 萬美圓,這一套房產你就差了 7.2 萬。
如今,將你的數據集中的每套房產估價偏離值平方後求和。假設你的數據集中交易了 500 套房產,估價偏離值平方求和總計爲 86,123,373 美圓。這個數字就是你的函數如今的「錯誤」程度。更多關於機器學習的實戰案例
如今,將總和除以 500,獲得每套房產的估價誤差的平均值。將這個平均偏差值稱爲你函數的代價(cost)。
若是你能經過調整權重,使得這個代價變爲 0,你的函數就完美了。它意味着,根據輸入的數據,你的程序對每一筆房產交易的估價都是分絕不差。因此這就是咱們的目標——經過嘗試不一樣的權重值,使代價儘量的低。
第三步:
經過嘗試全部可能的權重值組合,不斷重複第二步。哪個權重組合的代價最接近於 0,你就使用哪一個。當你找到了合適的權重值,你就解決了問題!
興奮的時刻到了!
挺簡單的,對吧?想想剛纔你作了些什麼。你拿到了一些數據,將它們輸入至三個泛型的、簡單的步驟中,最後你獲得了一個能夠對你所在區域任何房屋進行估價的函數。房價網站們,大家要當心了!更多關於機器學習的實戰案例
可是下面的一些事實可能會讓你更興奮:
過去 40 年來,不少領域(如語言學、翻譯學)的研究代表,這種「攪拌數字湯」(我編的詞)的泛型學習算法已經超過了那些真人嘗試明確規則的方法。機器學習的「笨」辦法終於戰勝了人類專家。
你最後寫出的程序是很笨的,它甚至不知道什麼是「面積」和「臥室數量」。它知道的只是攪拌,改變數字來獲得正確的答案。
你可能會對「爲什麼一組特殊的權重值會有效」一無所知。你只是寫出了一個你實際上並不理解卻能證實有效的函數。
試想,若是你的預測函數輸入的參數不是「面積」和「臥室數量」,而是一列數字,每一個數字表明瞭你車頂安裝的攝像頭捕捉的畫面中的一個像素。而後,假設預測的輸出不是「價格」而是「方向盤轉動角度」,這樣你就獲得了一個程序能夠自動操縱你的汽車了!
太瘋狂了,對吧?更多關於機器學習的實戰案例
第三步裏「嘗試每一個數字」是怎麼一回事?
好吧,固然你不可能試遍全部權重組合來找到效果最好的組合。直到世界毀滅你也算不完,由於這數字和組合無窮無盡。
爲了不這種狀況,數學家們找到了不少種聰明的辦法來快速找到優秀的權重值。下面是一種:
首先,寫出一個簡單的等式表示上面的第二步:
這就是你的代價函數(Cost Function)。
如今讓咱們,使用機器學習數學術語(如今暫時你能夠忽略它們),從新改寫一樣的這一等式:
θ 表示當前的權重值。 J(θ) 表示「當前權重的代價」。
這個等式表示,在當前權重值下,咱們估價程序的偏離程度。更多關於機器學習的實戰案例
若是咱們爲這個等式中全部臥室數和麪積的可能權重值做圖的話,咱們會獲得相似下圖的圖表:
咱們代價函數的圖形就像一個碗。縱軸表示代價。
圖中,藍色的最低點就是代價最低的地方——在這裏咱們的程序偏離最小。最高點們意味着偏離最大。因此,若是咱們能找到一組權重值讓咱們到達圖中的最低點,咱們就獲得了答案!
所以,咱們須要作的只是調整咱們的權重,使得咱們在圖上朝着最低點「走下坡路」。若是咱們不斷微調權重,一直向最低點移動,那麼咱們最終不用嘗試太多權重就能夠到達那裏。
若是你還記得一點微積分的話,你也許記得若是你對一個函數求導,它會告訴你函數任意一點切線的斜率。換句話說,對於圖上任意給定的一點,求導能告訴咱們哪條是下坡路。咱們能夠利用這個知識不斷走向最低點。
因此,若是咱們對代價函數關於每個權重求偏導,那麼咱們就能夠從每個權重中減去該值。這樣可讓咱們更加接近山底。一直這樣作,最終咱們將到達底部,獲得權重的最優值。(讀不懂?不用擔憂,繼續往下讀)。
這種爲函數找出最佳權重的方法叫作批量梯度降低(Batch Gradient Descent)。若是你對細節感興趣,不要懼怕,能夠看看這個詳細說明。
當你使用一個機器學習算法庫來解決實際問題時,這些都已經爲你準備好了。但清楚背後的原理依然是有用的。
還有什麼是本篇文章略過的內容?更多關於機器學習的實戰案例
上面我描述的三步算法被稱爲多元線性迴歸(multivariate linear regression)。你在估算一個可以擬合全部房價數據點的直線表達式。而後,你再根據房子可能在你的直線上出現的位置,利用這個等式來估算你從未見過的房屋的價格。這是一個十分強大的想法,你能夠用它來解決「實際」問題。
可是,儘管我展現給你的這種方法可能在簡單的狀況下有效,它卻不能應用於全部狀況。緣由之一,就是由於房價不會是簡簡單單一條連續的直線。
不過幸運的是,有不少辦法來處理這種狀況。有許多機器學習算法能夠處理非線性數據(如神經網絡或帶核函數的支持向量機)。除此以外,靈活使用線性迴歸也能擬合更復雜的線條。在全部的狀況下,尋找最優權重這一基本思路依然適用。
另外,我忽略了過擬合(overfitting)的概念。獲得一組能完美預測原始數據集中房價的權重組很簡單,但用這組權重組來預測原始數據集以外的任何新房屋其實都不怎麼準確。這也是有許多解決辦法的(如正則化以及使用交叉驗證的數據集)。學習如何應對這一問題,是學習如何成功應用機器學習技術的重點之一。
換言之,儘管基本概念很是簡單,要經過機器學習獲得有用的結果仍是須要一些技巧和經驗的。可是,這是每一個開發者都能學會的技巧。
一旦你開始明白,用機器學習技術解決那些看似困難問題(如字跡識別)有多便利時,你就會有一種,只要有足夠的數據,你就可以用機器學習解決任何問題的感受。只須要輸入數據,計算機就能神奇地找出擬合數據的等式!
可是有一點很重要,你要記住,只有在你擁有的數據對於解決實際問題有效的時候,機器學習才能適用。
例如,若是你創建了一個根據每套房屋內盆栽種類的數量來預測房價的模型,那它永遠都不會有效果。由於盆栽種類的數量和房價之間沒有任何的關係。因此,不管你多賣力地嘗試,計算機永遠也推導不出二者之間的關係。
你只能模擬實際存在的關係。
因此請記住,若是一個問題人類專家不能手動用數據解決,計算機可能也不能解決。然而,對於那些人類可以解決的問題,若是計算機可以更快地解決,那豈不美哉?
我認爲,目前機器學習的最大問題是它主要活躍於學術界和商業研究組織中。對於只想大致瞭解一下,而不打算成爲專家的人們來講,簡單易懂的資料很少。可是這種狀況天天正在改善。
更多關於機器學習的實戰案例
※更多文章和資料|點擊後方文字直達 ↓↓↓
100GPython自學資料包
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南]CDN
ECS運維指南
DevOps實踐手冊
Hadoop大數據實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊
雲原生架構白皮書
Zabbix企業級分佈式監控系統源碼文檔