我,一個數據科學家的三大弱點
大數據文摘出品
編譯:李雷、韋夢夙、胡笳
如果說現代工作面試教會了我們什么,那就是“你***的弱點是什么?”的正確回答是“我工作太努力了。”
顯然,真的要去談論我們的弱點是很荒唐可笑的,我們為什么要提我們做不到的事情?雖然工作申請和LinkedIn不鼓勵我們披露我們的弱點,但如果我們從不承認我們的缺點,那么我們就無法采取措施來解決它們。
要想在奮斗中變得更好其實很簡單:
- 確定你目前的問題:找出缺點
- 弄清楚你要的目標:制定實現的計劃
- 執行計劃:每次一小步
但我們很少執行***步:特別是在技術領域,我們總是用已知的技能埋頭苦干,而不是學習那些可以使工作更輕松或者獲得新機會的新技能。自我反思 - 客觀地評估自己 - 看起來好像是一個不相干的概念,但是如果能退一步,弄清楚我們怎樣能把事情做得更好或更有效,這對于在任何領域取得進步都至關重要。
考慮到這一點,我試圖客觀地審視自己,并確定3個努力方向以使我成為更好的數據科學家:
- 軟件工程
- 擴展數據科學
- 深度學習
我寫這篇文章的目的有三。
- 首先,我真的想變得更好,所以我需要承認我的弱點。我的目的是通過概括我的不足以及如何改正它們,讓自己有動力完成我的學習目標。
- 其次,我希望鼓勵其他人思考他們可能不了解的技能以及他們怎樣獲得這些技能。你不必像我這樣寫篇文章來公開哪些東西你不會,但是如果你可以找到一項新技能來學習,那么花點時間考慮這個問題是值得的。
- ***,我想告訴你,要成為一名成功的數據科學家并不需要什么都知道。數據科學/機器學習的課題幾乎是無窮無盡的,但實際上你能了解的有限。不管那些華而不實的求職簡歷是怎么寫的,你不需要完全了解每個算法(或有5到10年的工作經驗)才能成為一名職業數據科學家。我經常從初學者那里聽到他們被自己所認為必學的課題數量壓得不堪重負,而我的建議總是一樣的:從基礎開始,并且明白你不需要知道所有的一切!
對于每個弱點,我已經做了概述以及我目前正在做的改進。確定一個人的弱項很重要,但制定如改進的計劃也很重要。學習一項新技能需要時間,但計劃一系列小而具體的步驟會大大增加你成功的機會。
軟件工程
我最初的數據科學實踐經驗是在學術環境中獲得的,之后我一直試圖避免重拾某些以學術方式來研究數據科學的壞習慣。其中包括編寫僅運行一次的代碼,缺乏文檔,編寫沒有統一風格且難以閱讀的代碼以及硬編碼某些特定值。所有這些做法都反映了一個基本目標:開發一個數據科學解決方案,該解決方案只針對特定數據集做一次性工作,以便撰寫論文。
其中一個典型的例子是我們的一個項目使用建筑能源數據,最初每隔15分鐘采集一次,但當我們以5分鐘為增量開始采集數據時,發現程序完全崩潰了,因為有數百個地方把采集間隔寫死為15分鐘。我們不能簡單地查找和替換,因為這個間隔參數被寫成很多種名字,如electricity_interval,timeBetweenMeasurements或dataFreq。沒有一個研究人員考慮過代碼的可讀性或輸入變量的靈活性。
相比之下,從軟件工程的角度來看,代碼必須使用大量不同的輸入進行廣泛測試,有良好的文檔,在現有框架內工作,并遵守編碼標準,以便其他開發人員能夠理解。盡管我非常想這樣做,但我偶爾也會像數據科學家而不是像軟件工程師那樣編寫代碼。我開始思考偉大的與普通的數據科學家之間的區別是在于使用軟件工程***慣例編寫代碼 - 如果你的模型不夠健壯或不適合整個架構,則不會被部署 - 現在我正在嘗試培養自己像計算機科學家一樣思考。
通常,對于技術技能的學習來說沒有比實踐更好的方法。幸運的是,在我目前的工作中,我能夠同時為我們的內部工具和開源庫做出貢獻。這也迫使我獲得了許多實踐機會,包括:
- 編寫單元測試
- 遵循編碼風格指南
- 編寫可以更改參數的函數
- 完整的代碼文檔
- 讓其他人做代碼審查
- 重構代碼使其更簡潔,更易于閱讀
即使對于尚未有實際工作經驗的數據科學家,你也可以通過協作參與開源項目獲得這樣的經驗。另一個獲取可靠編碼實踐的好方法是在GitHub上閱讀流行庫的源代碼(Scikit-Learn是我的***之一)。獲得其他人的反饋也至關重要,因此你可以找一個社區并向那些比你更有經驗的人尋求建議。
像軟件工程師一樣思考需要改變你的思維模式,但如果你能夠慢下來并牢記這些做法,那么實踐他們并不困難。例如,每當我發現自己在Jupyter Notebook 中復制和粘貼代碼并更改一些值時,我會試著停下來并意識到我不如使用函數來代替拷貝粘貼的代碼,因為從長遠來看這會讓我更有效率。雖然我對這些慣例的實踐還不算***,但我發現它們不僅讓其他人更容易閱讀我的代碼,而且還更容易擴展我的工作。比起寫代碼,我們更多時候是在閱讀代碼,因此你未來會感激這些文檔和統一的編程風格。
除了編寫那些大型代碼庫的代碼中用到這些,我仍然會堅持遵循部分慣例。編寫數據分析的單元測試對于數據科學家來說可能看起來很奇怪,但是當您真正需要開發測試以確保代碼按預期工作時,這是很好的做法。此外,還有許多工具可以檢查您的代碼是否遵循編碼風格(我仍然在努力解決關鍵字參數周圍的無空格的問題)。
總有地方可以改進(在Sublime Text 3里使用pylint)
我還想研究計算機科學的許多其他方面,例如編寫有效的實現代碼而不是暴力法(例如使用矢量化而不是循環)。然而,同樣重要的是要明白你不能一次改變所有東西,這就是為什么我專注于其中一些慣例并將它們變成我工作流程中的習慣。
雖然數據科學自成一體,但從業者仍可以通過借鑒軟件工程等現有領域的***實踐慣例而受益。
擴展數據科學
雖然你可以自學數據科學中的所有內容,但付諸實踐部分有一些限制。其中一個是難以將分析或預測模型擴展到大型數據集。我們大多數人無法訪問計算集群,又不想存錢購買個人超級計算機。這意味著當我們學習新算法時,我們傾向于將它們應用于小型,表現良好的數據集。
不幸的是,現實世界里的數據集不會對數據量大小或者數據干凈程度有嚴格限制,所以,你必須使用不同的方法去解決數據量過大、臟數據等問題。首先,你或許需要突破個人電腦的安全限制,使用一個遠程的實例,例如亞馬遜的AWS EC2 甚至是多臺機器。這意味著,你必須學習怎樣遠程連接機器和敲寫命令行,因為你的EC2實例不能使用鼠標也沒有操作界面。
當學習數據科學相關課程的時候,我使用亞馬遜云的免費服務或者免費積分(如果你有多個郵箱可以注冊多個賬戶來獲得更多免費服務)在EC2機器做練習。這樣能幫助我熟悉敲寫命令行。然而,我還沒有解決第二個問題——數據集大小能夠超過機器的內存。我意識到這個限制讓我回到了原點,現在是學習處理更大的數據集的時候了。
你甚至不用在電腦資源上花費數以千計美金,就可以實踐這些超出內存限制的數據集的處理方法。這些方法包括每次遍歷一個大數據集的一部分、把一個大數據集拆分成許多小數據集或者使用像Dask這種能夠讓你掌握大數據集處理細節的工具
我目前的方法是,對于內部項目數據集和外部開源數據集,都把單個數據集拆分成多個子集,開發一個能夠處理子集數據的pipeline(程序、腳本等),然后用Dask 或者PSpark通過pipeline并行跑這些子集。這個方法不需要擁有超級電腦或者集群——你可以利用計算機的多核架構并行操作普通電腦。當你擁有更多資源的時候,你就可以自由的拓展程序規模。
幸虧有像Kaggle這樣的數據寶藏,我已經找到了一些相當大的數據集,并且學習其他數據科學家處理它們的方法。我從中找到了很多有用的建議,例如,把數據類型改成dataframe以減小內存消耗。這些方法能幫助我更高效地處理各種數量級的數據集。
美國國會圖書館“只有”3PB的材料
雖然還沒有處理過TB級的數據集,這些方法已經幫助我學到了處理大數據的基本策略。在最近的一些項目中,我已經能夠運用所學技能在AWS的集群上做分析。希望接下來的幾個月,我能逐步在更大的數據集上做分析??梢钥隙ǖ氖窃趯淼姆治鲋校瑪祿瘯絹碓酱?,我還需要繼續提高處理更大數據集的技能。
深度學習
雖然人工智能在繁榮和蕭條中更迭,但是它最近在計算機視覺、自然語言處理、深度強化學習等領域的成功應用讓我確信基于神經網絡的深度學習不是曇花一現。
與軟件工程和數據科學拓展領域不同,我現在的職位不需要任何深度學習知識:傳統機器技術更能有效解決我們客戶的問題。然而,我發現并不是每一個數據集都是行列結構化的,神經網絡是文本或圖像項目的***選擇(目前來看)。我會繼續利用已有技能解決當前的問題,但是,尤其在職業生涯早期,探索性課題同樣擁有巨大的潛在價值。
探索和利用的權衡在強化學習和你的生活中的應用
深度學習里有很多不同的分支領域,非常難分辨哪個方法和庫將***勝出。雖然如此,我認為熟悉深度學習某一個領域并能實現其中某些技術,會讓一個人能夠解決問題的范圍更廣。解決問題驅使我更深入學習數據科學,所以把深度學習加入我的技能庫是一項有價值的投資。
我對于深度學習的學習計劃和當初把自己變成數據科學家的方法一樣:
- 閱讀著重部署應用的書籍和教程
- 在真實項目中練習技術和方法
- 通過寫作分享和解釋我的項目
當我學習一個技術課題時,一個有效的方法是邊學邊做。這意味起步時不是通過基礎理論而是通過找到實際應用方法去解決問題。這個自上而下的方法意味著我要把許多精力放在著重于動手帶有許多代碼樣例的工具書上。在我明白技術的實際應用以后,我再回到基礎理論中,這樣,我能夠更高效的使用這些技術。
雖然沒有機會在工作中學習到其他人的神經網絡,要靠自己自學,但是在數據科學領域有著豐富的資源和廣闊的社區。對于深度學習,我最初依賴這三部書:
- 《Deep Learning Cookbook》,作者Douwe Osinga
- 《Deep Learning with Python》,作者Francois Chollet
- 《Deep Learning》,作者Ian Goodfellow, Yoshua Bengio, and Aaron Courville
前兩本書著重于通過神經網絡實現解決方案,而第三本更偏向深入理論。只要情況允許,可以邊讀邊在鍵盤上敲代碼,這會將讀技術文章變為有趣的體驗。前兩本書中的代碼示例非常棒:我通常是在Jupiter Notebook中逐行敲寫和運行,探究代碼如何工作,并記錄知識細節。
此外,我不僅僅是復制這些代碼,而是嘗試在自己的項目中實踐它們。我在近期工作的一個實踐項目是構建一個圖書推薦系統,該系統是根據《Deep Learning Cookbook》中的類似示例代碼改編的。從頭開始創建自己的項目可能令人生畏,如果你想提升自己,可以從別人的輪子上搭起。
***,學習某個主題的最有效方法之一是把這個知識教給別人。從經驗來看,如果我不能用簡單的語句解釋給別人,那么我就還沒有完全理解這個知識。隨著學習深度學習的每個主題,我將保持寫作,并分析技術實現細節和概念性解釋。
教學是***的學習方式之一,我計劃將其作為學習深度學習的一項重要組成部分。
學習金字塔。左側:平均掌握程度;右側:講義、閱讀、音視頻資料、示例、討論、實踐聯系、教導其他人
總結
公開自己的弱點可能會感覺有點奇怪。寫這篇文章的確會讓我感覺不舒服,但是我寫出來是因為它最終會幫助我成為一個更好的數據科學家。而且,我發現很多人,包括雇主們,會對你坦誠自己的弱點并探討如何解決它們留下深刻印象。
不了解某些技能并不是弱點——真正的弱點是假裝自己知道一切并停滯不前。
通過定位我在數據科學方面的弱點——軟件工程,擴展分析/模型,深度學習——我的目標是高自己,鼓勵他人思考自己的弱點,并向你展示想成為成功的數據科學家并不必要學習所有知識。雖然反思個人的弱點可能很痛苦,但是學習是快樂的:最有成就感的事情莫過于,經過一段時間的持續學習后回顧這個過程,你知道你已經比剛出發的時候懂得更多。
相關報道:
https://towardsdatascience.com/my-weaknesses-as-a-data-scientist-1310dab9f566
【本文是51CTO專欄機構大數據文摘的原創文章,微信公眾號“大數據文摘( id: BigDataDigest)”】