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