天天看點

機器學習開發者的現代化路徑:不需要從統計學微積分開始

編者按:機器學習算法的傳統學習路徑,是從統計學、機率論、線性代數、微積分等多種數學知識開始,但專業程式員、機器學習愛好者、machinelearningmastery.com網站大拿jason brownlee博士認為這種自下而上的方法停留在算法層面,沒有考慮到軟體開發和傳遞,不适合專業程式員,他在一篇文章中面向程式員介紹了一種有别于傳統的機器學習入門攻略,讓您能夠簡單、高效地實作從開發者到機器學習踐行者的飛躍。csdn将其節選翻譯,包括傳統學習方法為什麼失靈,如何使用現代的方式和“單項最優”的工具與平台來處理實際的端到端的機器學習問題,以及如何規避常見的錯誤。原文标題為:面向程式員的機器學習:從開發者到機器學習踐行者的飛躍。

從統計學、機率論、線性代數、微積分等多種數學知識開始,這種自下而上的機器學習教學方法。從表面上看起來,它是缜密的、系統的、聽起來似乎是正确的觀點,又怎麼可能是錯誤的呢?

機器學習開發者的現代化路徑:不需要從統計學微積分開始

自下而上式程式設計模式(或者,如何殺死萌芽中的程式員)

想象一下,你是一個開發初學者。你已經學會了一些程式設計方法和語言,并且你正開始學習如何創造單機軟體。

你告訴你的朋友和家人,你想從事一個每天都在程式設計的事業。他們告訴你,在你得到一份程式員工作之前,你需要修得計算機科學學位。

然後,你注冊課程并開始修計算機科學學位。幾個學期後,你接觸到的是越來越多的深奧的代數,微積分和離散數學。你使用的是過時的程式設計語言。此時,你程式設計和創造軟體的激情也開始動搖。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

在實踐者道路中,開始進行機器學習的傳統方法存在着分歧

也許在某種程度上你不這麼認為。往回一看,你意識到沒有學到關于現代軟體開發實踐、語言、工具或者任何在你追求的軟體創造和傳遞中能夠使用的方法。

看到與機器學習類似的地方了麼?

值得慶幸的是,程式設計已經有長的曆史了,現在已經很流行并且對經濟也相當重要,我們已經找到了其它方式給嶄露頭角的年輕(或資深)程式員所需要的技能,去做他們想做的事情,例如:創造軟體。

這并不意味着要教新手程式員可計算性和計算複雜度的理論,或者是算法與資料結構的深層細節。一些有用的知識(後者提到的算法複雜性與資料結構)可以晚點教。也許有些集中的資料,必須在工程師已經掌握程式設計知識的前提下才能了解,它們不能單獨地拿出來教。

值得慶幸的是,我們已經把重點放在了軟體工程學位上。我們也有像codecademy這種給你學習編寫程式的資源了……沒錯,其實就是程式設計。

如果一個開發者想“做”機器學習,他真的必須花幾年時間和幾十甚至成百上千的美元,來擷取必要的數學知識和更高的學位麼?

答案當然是不!還有一個更好的方法。

正如計算機科學,你不能僅僅隻是将模式反轉為自上而下,并使用相同的教學材料。

原因是,計算機科學課程從來就沒有把開發和傳遞軟體的實際問題涵蓋到課程内容當中,而且機器學習的課程和書籍也遠遠不足。它們一般停在了算法方面。

你需要一個自上而下的方法來學習機器學習。一種你想要專注于實際結果的方法:使用現代的方式和“單項最優”的工具與平台來處理實際的端到端的機器學習問題。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

學習機器學習的一種更好方法,開始學習處理端到端的機器學習問題

上面是我認為的黃磚路。

1. 一個可重複的有系統流程的結果

一旦你知道一些工具,那麼用機器學習算法解決這個問題就顯得比較容易,然後你可能就認為這個問題“完成”了。

這是很危險的。

你怎麼知道你已經完成了?你怎麼知道結果就是好的?你又如何知道在資料集上的結果是可靠的呢?

在解決機器學習問題上,你需要系統化學習。這是一個項目,就像一個軟體項目,良好的處理過程可以得到一個高品質的,能夠在項目之間複用的結果。

考慮這樣一個流程,你可以思考一些明确的需求,例如:

一個指導你從端到端,從問題規範到示範文稿的示範或到結果部署的流程。就像一個軟體項目,你認為你完成了,但事實上你可能沒有。要有一個最終傳遞的心,從一開始就設定一個明确的項目終止條件并集中精力去努力完成它。

一個循序漸進的流程,你總是知道下一步該做什麼。不知道下一步該做什麼是一個項目的殺手。

一個保證“好”結果的流程,比如說,優于平均水準或者是比項目要求的結果要好。在項目中,使用已知置信度來可靠地傳遞良好的結果,但不一定要求是最準确的結果,這是非常常見的。

一個不必根據特定工具、程式設計語言、算法潮流而改變的流程。工具可以不斷變化,但過程必須是自适應的。考慮到該領域對算法的癡迷,總會有新的、強大的算法從學術界産生。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

選擇一個系統的、可重複的過程,你可以始終如一地用它來提供結果

很多偉大的流程,包括一些舊的流程,能夠為你的需要提供幫助。

例如:

knowledge discovery in databases(kdd),我已經運用到了這裡。

crisp-dm

osemn

其他…

選擇或使用一個對你最好的流程,并且符合上面的要求。

2. 把“單項最優”工具應用到你的處理過程中

機器學習工具和庫在不斷變化,但在任何一個單一的時間點,你必須使用一些東西,讓它很好地應用到你提供的結果選擇過程中。

你不想評估和選擇任何一個過時的算法或者庫,你想要所謂的“單項最優”,能給你快速、可靠以及高品質結果的工具或庫,并能自動化處理那些和你提供的處理過程一樣多的流程。

同樣,你不得不自己做這些選擇。如果你問其他人,你會聽到他們的偏見,而他們通常使用的是最新工具。

我也有我自己的偏愛,我喜歡為不同類型的工作使用不同的工具和平台。

例如,在上面列出的情況下,我會建議使用以下最佳的訓練工具:

one-off預測模型:weka平台,因為我可以加載一個csv檔案,是以在任何時候我都可以不需要任何代碼(參見我的映射過程)來設計一個實驗并且得到最佳的模型。

embedded預測模型:python中的scikit-learn庫,因為我可以在開發模型和部署時使用相同的語言。 ipython以一種很好的方式展示你的管道,并受到廣大開發團隊的喜愛。mlaas也是面向更大資料的一個選擇。

deep-dive模型:r平台擴充包,因為我可以使用整個r平台快速地、自動地嘗試很多先進的模型,并設計出更精準的特征選擇,特征工程和算法優化實驗。

在實際當中,這三個工具在三個場景中的使用取決于具體的實際情況。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

把你首選的機器學習工具映射到你的系統流程中使之能夠解決實際問題

和開發一樣,你需要學習你的工具以充分利用它們。你還需要靜觀其變,如果那些新的更好的工具可以使用,你應該轉到這些工具上,讓它們永遠的适應到你的重複過程中。

3. 使用半正式化工作産品進行有針對性的實踐

你可以通過實踐取得好的發展——通過開發大量的軟體。使用這種熟悉的方法來獲得良好的機器學習。你在每個項目中練習的越多,對機器學習(理想的端到端工作問題)的掌握就越好。

謹慎選擇你的實踐資料集

你想挑選的資料集應該是真實的而不是人為的。現在有數以百計的免費資料可以擷取,并且它們正在不斷地增加複雜性。

我建議從uci機器學習庫的小記憶體資料集開始。它們是衆所周知的、比較幹淨的,并且可以作為你新的流程和工具的一個良好開端。

在此基礎上,我會推薦大記憶體資料集,比如那些來自kaggle和kdd杯比賽的資料集。它們本身有些噪聲資料,需要你更多靈活的處理和不同的技巧。

堅持使用表格資料,這是給我所有學生的建議。

圖像和文本資料的處理是新而不同的領域,就它們本身(計算機視覺和自然語言處理)而言,需要你去學習這些領域專業的方法和工具。如果它們是你想要的或是想解決的問題類型,那麼最好是從這裡開始,而且這裡有很多的資源可以獲得。

寫出你的結果并建立一個公共的工作包

建立并保留每個項目的半正式工作産品。我的意思是詳細寫出你所做的和你所學的一些單獨的檔案,這樣你可以在未來和接下來的項目中再次使用。

這類似于為每個程式設計項目保留一個目錄,并從先前的項目中複用代碼和思想。它會大大縮短程式設計時間,是以我強烈地推薦這個。

保留所有的腳本、代碼以及生成的圖像,但重要的是要寫下你的發現。把它想象成類似代碼中的注釋。一個單獨記錄的檔案可以是一個簡單的ppt或是文本檔案,或是與一個會議的演講或youtube視訊一樣詳盡地闡述。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

工作思路和完整的分離項目,撰寫結果并建立項目組合

在一個公共的版本控制庫(如github)儲存每個項目,這樣其他的初學者就可以借鑒你的項目并擴充你的工作。同時把項目連結到你的部落格上,如linkedin或其它任何地方來證明你增升的技術和能力。

關于這一思想的更多文章,請檢視我的相關博文“build a machine learning portfolio: complete small focused projects and demonstrate your skills”。

公共的github庫檔案很快成為公司招聘過程中,在履歷上真正關心技能和成果的方面。

我們上面制定的方法,是作為開發人員的你可以開始學習機器學習并取得進展而使用的方法。

當然,你可能會對這個方法是否真的适合你而存有一些疑惑。下面,讓我來解決你的這些疑慮。

你不需要去寫代碼

編寫代碼可以讓你掌握更多不同的工具和技能,但是這并不是必須的,并且也不是首要的

你不需要精通數學

跟開發一樣,你不需要懂得關于計算性或大o符号再去編寫代碼,并上線有用而且可靠的軟體,你可以在沒有統計學,機率論和線性代數的背景下解決端到端的機器學習問題。

值得注意的是,我們沒有從理論開始,但我們不忽略它。在你需要它的時候,再将方法和算法從中分離出來。事實上,你會忍受不住的。原因是,解決機器學習問題是讓人上瘾的。在追求更好的結果和更準确的預測上,你會使用你能夠找到的任何資源。學習對你而言,隻是提取智慧中的結晶再将其運用到你的問題上而已。

如果你的目的是掌握理論知識,那麼這個方法是慢而低效率的。這就是為什麼當通過鏡片看世界時會感覺如此不舒服。從機器學習開發者的目标來看,它的意義頗多。

你不需要一個高文憑

沒有一個門衛會有這方面的知識。這些所有的知識都是可以獲得的,并且在現在你完全可以自學。在你開始處理機器學習問題之前,你不需要花掉大量的時間和金錢去拿一個學位。

如果你志在獲得更高的學位,為什麼不先開始解決機器學習問題,并在幾周或幾個月後,等你建立了一個完整的小型項目,再回頭考慮獲得學位的事情。到那時,你不僅會在這個領域的廣度上有一個清晰的想法,還會有你非常感興趣的那部分。

我後來的确回去了,并且拿到了更高的學位。我喜歡做研究,但我更喜歡處理實際問題并傳遞客戶真正關心的更多的結果。我也是在修學位之前就開始處理機器學習問題的,我沒有意識到的是,在我面前已經有了這些資源和這條路。

這也是我為何如此激情地說服像你這樣的開發者的一個原因,你現在有你所需要的資源了,那麼開始行動吧。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

這是在機器學習中很容易出現的不行動的借口

你不需要大資料

機器學習算法開發在小資料集上了解最佳。資料足夠小,你就可以在微軟的excel中檢視,可以加載到記憶體中并且在桌面的工作空間中處理。

大資料!=機器學習。你可以使用大資料建立預測模型,但把它當做是你技能領域的一個專長。在機器學習中,我通常建議我的學生使用小記憶體資料集進行學習。

如果大資料機器學習是你想要工作的領域,那麼從這裡開始吧!

你不需要一台超級計算機

的确,一些最先進的算法,如深度學習确實需要非常強大的多核gpu。他們是強大的、令人興奮的算法。但它們也可以在小問題上工作,并且你同樣可以用你的台式cpu來計算。

你沒有必要在擁有一台大的快速的計算機之前,不開始機器學習。

在你去買一個桌面超級計算機或租金非常貴的ec2實體之前,你最好把這些時間花在如何将這些算法用在更小更容易了解的資料集上,并從中擷取最大利益。

你不需要大量的時間

我們都有忙碌的生活,但如果你真的想要學到點什麼,你需要花點時間。

我之前說過,處理機器學習的問題是會讓人上瘾的。如果你在機器學習競賽中被超越了,你會很樂意擠出一個月晚上看電視的時間來将你的算法提高幾個百分點。

其實,如果從一開始你就有一個清晰的過程和一個好的工具,那麼你可以在一兩個小時内處理一個資料集上的端到端問題,也許是花掉一個或兩個晚上。事實上,隻要其中的幾個工具,還有一個完整機器學習項目的檔案夾工作空間,你就可以開始解決更大的更有趣的問題了。

接着在你的看闆中把它分解成多個小任務,然後指定時間開始。

自從我發起machine learning mastery以來,我一直在給人以不同的忠告将近兩年了。在這段時間裡,我看到了五個常見的陷阱,希望你可以避免。

不采取行動:一切都安排好了,然而我卻看到很多開發者都沒有采取行動。看電視或閱讀新聞比在一個迷人的領域裡獲得一個新而有價值的技能更容易。真是“牽馬到河易,強馬飲水難”啊。

挑選的問題太大:通常,我發現開發者挑選的第一個或第二個資料集太難工作了。問題太大、太複雜或太嘈雜,他們沒有準備好去挑戰。可怕的是“失敗”抹殺了開發者的動機并且放棄這個過程。是以,要挑選那些你能在1小時内就解決的小問題。在你做更大的事情之前,先去做一下這個吧。

從零開始實作算法:我們有算法實作。它們已經封裝好了。至少能滿足你在未來幾年裡想要做的有趣的事情。如果你的目标是學習如何開發和提供可靠的、準确的預測模型,不要花時間去從零開始實作算法,使用庫就行。另一方面,如果你想把重點放在實作算法上,那麼就要很清楚地把你的目标和重點放在它上面。

沒有堅持一個過程:與靈活軟體開發一樣,如果你偏離了這個過程,車輪可以很快地關閉你的項目,結果往往會造成大的混亂。堅持一個過程,從開始到終止,系統地通過并完成端到端問題才是關鍵。你可以重新審視“你發現的有趣的事情……”作為一個後續的小項目(在你寫下的一個“後續工作想法”部分),但也要完成這個過程并且傳遞它。

不使用資源:在機器學習領域有很多傑出的論文,書籍和部落格文章。你可以利用這些資源來改進你處理的過程,使用的工具和結果的精度。可以使用第三方資源從你的算法和資料集上擷取更多的資訊。得出算法和問題架構的一個思路。一個智慧的結晶可以改變你項目的流程。記住,如果你采用了自上而下的流程,理論就必須出現在後面。最後再花時間去了解你的終極模型。

溫馨提示,不要讓任何一個錯誤發生在你的身上。

我們已經涵蓋了很多方法,我希望可以開始讓你相信,你可以開始機器學習并且會有所成就。未來,你成為機器學習開發者的夢想會成為現實,并且也很容易實作。

更新:

看看下面這個思維導圖,你會對文中的重要概念有一個清晰的脈絡(感謝simeon提的建議)。

機器學習開發者的現代化路徑:不需要從統計學微積分開始

原文釋出時間為:2015-09-02

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀