用python實現一些機器學習演算法時是否需要自己寫輪子?
因為我是數學和統計出身,python只是了解一些基本語法和常用庫,我看一些市面上的書比如機器學習實戰,基本上都是自己實現演算法而並不是用流行的python機器學習包比如sklearn,所以我的困惑是是否真的有必要自己寫出來並實現演算法,還是說僅僅可以直接調用包並用裡面的函數實現就可以????
包括Andrew NG的機器學習課程,都是自己用python或者matlab寫的演算法。所以對於像我這種編程基礎很一般(能看懂但可能寫不出來的)人,去每一個細扣演算法的實現是不是真的有必要並且高效???
自己實現演算法而不去調包,一般有兩種可能:
- 理解演算法的原理。
- 進行非常複雜的理論研究,沒有現成的包可以調。
在上課時,為理解演算法而造輪子是有價值的。我們都會用計算器,但這不代表我們就不必去背九九乘法表。而且,如果只會調包調參,那麼真正學過統計、數學的人相比「機器學習速成班」學員的優勢在哪裡呢?當然,我們不用關注特別瑣碎的細節,比如手寫numpy矩陣、矩陣乘法之類。有數學基礎的話,不妨利用好matlab和python的向量化,把代碼寫得更接近數學公式。畢竟,公司面試要求寫個偽代碼,自己實現過的話肯定更有保障。
在實現一個大演算法時,裡面可能會包括一些小演算法,例如尋找數值最優解。在理解大演算法時,沒必要為其中的小演算法分別重新造輪子。通常,我們的naive梯度下降肯定比不過現有的BFGS,我們的SGD也必然比不過別人的Adam。此時,可以採取封裝的思想:梯度下降、BFGS都求最優解,分別學習、理解原理即可;學習ridge和lasso的區別時,我們只需要區分目標函數,不用在意梯度下降的具體方法。
在實際工程中,必須記住:除非你是陳天奇這樣的大神,否則你實現的演算法一定比現有的輪子慢!
老老實實用sklearn,感興趣的時候自己去github看源代碼。單論決策樹,以前在純調包的時候,曾經因為xgboost和lightgbm的神速而看不起sklearn,結果自己實現的速度簡直慘不忍睹。後來認真學習了sklearn的思路,不得不說,相當優雅高效。
另一種情況是,自己研究的領域已經突破了現有庫的邊界。sklearn估計永遠不會實現概率圖模型,據說是為了避免不能簡單操作的模型。另一個例子是:keras在上層對tensorflow進行了封裝,代碼更簡潔一些,數據競賽里省心省力,方便選手集中精力分析數據,而不是重新造輪子;但是到真正的研究和開發中,我們還是得用tensorflow,因為表面的簡潔必然帶來功能的減少。
不需要,多看論文,復現結果,嘗試自己的idea,這個過程收穫會更大。
分場景而論
實際項目中,不需要自己重頭開始實現演算法,因為你寫的不一定比人家好。實際項目中,應用演算法實現一個模型的工作可能不是一個項目中時間佔比很大的工作。更多的在圍繞數據做各種工作。數據清洗和特徵工程占工作的很大部分。但是,一定要深度理解演算法的原理。
如果學習的話可以重頭寫幫助自己理解演算法,既鍛煉了自己的編程能力,又幫助自己深度理解演算法原理以及這個演算法的優缺點。說實話類似決策樹之類的輪子都不好造(這個我造過所以我知道非常痛苦)。ramdom forest,adaboost之類的就更恐怖了。你可以去他們的官網上查他們的源代碼。然後去修改就可以了。
看你目的是什麼,如果是想知道機器學習的原理,那麼最好實現下決策樹,logistic回歸,knn這些基礎的。matlab,python都有教程或者demo吧,這部分時間投入覺得是應該的,有些東西閱讀和代碼實現是相輔相成的,即使編程不很好,閱讀理解代碼也有收穫。想了解nn和dl的細節就看Andrew的deeplearning ai裡面的課。
但單純感興趣,只想先寫個成型的小程序,玩kaggle,那就用現有的ml或者dl的庫sklearn或者keras。。。先玩玩看,覺得有意思,再想想後面想學什麼。
謝邀~
看你的需求了,如果你是想將來搞研究,自己實現以下比如SVM,邏輯回歸這樣的演算法還是很有必要的,如果只是滿足日常的工作需求,sklearn, tensorflow, gensim這些包包都封裝的很好,根據具體業務能夠做到快速反應用什麼東西就足以了
用python自己寫輪子……python那loop效率……
問我有個Python用,我又不會.但是自己造輪子可以讓你更深入或者放棄.
打好基礎,寫寫挺有用的
如果只是把演算法當成工具,在工作中簡單用用,大可不必。
如果工作內容涉及到演算法的改進,創新等等,那熟悉各個演算法的原理是基本要求了,動手實現一遍對於掌握原理還是有很大幫助的。
另一方面,就看你自己對機器學習演算法的興趣有多濃厚了。額 那僅僅是教學,就像數學中的 證明或者 推導一樣。教學嘛當然是比較細緻的去教學,實際應用中 當然偏向與 快速開發。當然 如果你水平比較高,也可以自己寫一個演算法。
瀉藥。
手機打字比較零碎。先放觀點:一般情況下完全沒必要。為啥?就比如谷歌的來源的那個,cnn rnn的也有的是來源包,在這種情況下,自己寫一個可能遠遠不如現成的輪子。當然,另外一種情形請務必自己造輪子,那就是你自己創造除了顛覆性的演算法,可以在未來解決人工智慧離線化,這樣,必須自己造輪子。以上。沒必要,如果真的只是想煉丹的話,不用太在實現方式,知道配方才是王道。
一個是工程細節太多,二是kernel層不會用python.....
推薦閱讀:
※國內數據挖掘比賽有哪些?
※如何通俗地解釋貝葉斯線性回歸的基本原理?
※怎麼通俗易懂地解釋貝葉斯網路和它的應用?
※數據挖掘、機器學習、自然語言處理這三者是什麼關係?這幾個怎麼入門啊?
※參與大數據競賽應該看什麼書?