做者 | William Koehrsen
翻譯 | Mika
本文爲 CDA 數據分析師原創做品,轉載需受權面試
若是現代工做面試教會了咱們什麼,那就是關於「你最大的弱點是什麼?」這個問題,正確答案是「我工做太努力了。」顯然,說出本身的弱點是很好笑的。雖然在我的簡歷中列出弱點不太好,可是若是不認可本身的不足,咱們就沒法採起措施改善它們。編程
作出改進的方法很簡單:安全
明確如今的位置:找出弱點網絡
想變成什麼樣:制定實現的計劃框架
執行計劃:一步步改進機器學習
咱們不多能跨越第一步,特別是對於在技術領域工做的人羣。咱們埋頭苦幹,不斷工做,使用已掌握的技能,而不是得到哪些能讓咱們工做更輕鬆或能帶來新機會的新技能。自我檢討,客觀地評估本身,這彷佛是一個陌生的概念。但若可以退後一步,弄清咱們哪些方面能作得更好,從而在該領域取得進步,這是相當重要的。函數
考慮到這一點,我試着客觀地評價本身,並總結了目前本身的三個弱點,改善如下這幾點能讓我成爲更好的數據科學家:工具
軟件工程單元測試
擴展數據科學學習
深度學習
本文中我列出這些弱點主要的目的在於:首先,我很是想提升本身的能力,經過列出本身的不足以及如何解決它們,但願可以激勵本身繼續學習,完成目標。
其次,我但願鼓勵其餘人思考本身有哪些沒掌握的技能,以及該如何獲取這些技能。
最後,我想告訴你,成爲出色的數據科學並不須要作到無所不知。關於數據科學和機器學習的知識是無線的,你可以掌握的是有限的。我經常聽到初學者抱怨,要掌握的知識太多了,我給出的建議就是:從基礎開始,你並不須要掌握全部內容。
對於每一個弱點,我都列出了具體的問題,以及我目前在作什麼進行改進。發現本身的不足很重要,但制定改進計劃也一樣重要。學習一項新技能須要時間,但計劃好一步步的具體步驟會大大增長你成功的概率。
1. 軟件工程
在大學時進行個人第一個數據科學項目後,我開始試着避免一些數據科學方法中的壞習慣。其中包括編寫僅運行一次的代碼,缺乏文檔,沒有一致性且難閱讀的代碼,硬編碼特定值等。這些都是寫論文所帶來的,爲了寫一篇論文,開發針對特定數據集且只能運行一次的解決方案。
其中一個典型的例子是,咱們有個項目使用建築能源數據,最初每隔15分鐘獲取一次數據。當咱們把時間增長爲20分鐘時,數據管道徹底崩潰了,由於許多地方已明確將時間編爲15分鐘。咱們不能進行簡單的查找和替換,由於該參數被設定爲多個名稱,如electricity_interval
timeBetweenMeasurements
還有dataFreq
。咱們當中沒有人想過讓代碼更易閱讀或可以靈活改變輸入。
相比之下,從軟件工程的角度來看,代碼必須使用大量不一樣的輸入進行測試,在現有框架內工做,並遵照編程標準,以便其餘開發人員可以理解。儘管個人初衷是好的,但我偶爾會像數據科學家那樣寫代碼,而不是像軟件工程師那樣。如今我正在訓練本身像計算機科學家同樣思考。
我在作什麼
學習技能沒有比練習更好的方法。幸運的是,在我目前的工做中,我可以爲內部工具和開源庫(Featuretools)作出貢獻。這迫使我學習了不少技能,包括:
編寫單元測試
遵循編碼風格
編寫接受更改參數的函數
完全記錄代碼
讓他人檢查代碼
重構代碼,使其更簡單、更易於閱讀
對於還未工做的數據科學家,你也能夠經過參與開源項目得到這些經驗。除此以外,你還能夠經過查看GitHub上流行庫的源代碼。
像軟件工程師同樣思考須要改變思惟模式,但作到這一點並不難。例如,每當我發現本身在Jupyter Notebook中複製和粘貼代碼並更改一些值時,我就會停下來,並意識到從長遠的角度看用函數會更高效。
我還想研究計算機科學的許多其餘方面,例如編寫有效的實現,而不是用蠻力方法(例如使用矢量化而不是循環)。同時要注意想一會兒所有改變是不顯示的,這也是我爲何專一於一些實踐,並將其融入到個人工做流程中。
雖然數據科學自成一體,但從業者仍能夠經過借鑑軟件工程等領域的最佳實踐從中受益。
2. 擴展數據科學
雖然你能夠自學數據科學中的全部內容,但要將其應用到實踐中仍是存在一些限制。一個是難以將分析或預測模型擴展到大型數據集。咱們中大多數人沒法訪問計算集羣,也不想爲一臺我的超級計算機掏錢。這意味着當咱們學習新方法時,咱們傾向於將它們應用於小型且表現良好的數據集。
然而在現實狀況中,數據集並不符合必定的大小或乾淨程度,你須要用不一樣的方法來解決問題。首先,你可能須要打破我的計算機的安全限制,使用遠程實例(例如經過AWS EC2)甚至多臺計算機。
在學習數據科學時,我嘗試在EC2機器上練習,這有助於讓我熟悉命令行,可是,我仍然沒有解決當數據集大於機器的內存狀況。最近,我意識到這一點限制了個人前進,是時候學習如何處理更大數據集的了。
我在作什麼
即便不在計算資源上花費大量金錢,就能夠實踐超出內存限制的數據集的處理方法。其中包括每次迭代數據集的一部分,將大型數據集分紅較小的數據集,或者使用Dask這樣的工具來處理大數據。
我目前採用的方法是將數據集分爲多個子集,開發可以處理每一個部分的管道,而後使用Dask或Spark,與PySpark並行地運行管道中的子集。這種方法不須要用到超級計算機或集羣,你能夠在我的計算機上並行操做。
此外,因爲像Kaggle等數據存儲庫,我可以找到一些大型的數據集,並查看其餘數據科學家的處理它們的方法。我已經學到了不少有用的技巧,例如經過更改數據框中的數據類型來減小內存消耗。這些方法有助於更有效地處理任何大小的數據集。
雖然我還沒處理過TB級的數據集,但這些方法幫助我學習了處理大數據的基本方法。對於最近的一些項目,我可以運用目前學到的技能對在AWS上運行的集羣進行分析。但願在以後的幾個月,我能逐步提升處理數據集的大小。
3. 深度學習
雖然人工智能在繁榮和蕭條中更迭,可是它最近在計算機視覺、天然語言處理、深度強化學習等領域的成功應用讓我確信基於神經網絡的深度學習不是曇花一現。
與軟件工程或擴展數據科學不一樣,我目前的職位不須要用到深度學習,例如隨機森林等傳統的機器學習技術已經可以解決全部問題。可是,我認識到並不是每一個數據集都是結構整齊的,而神經網絡是目前處理文本或圖像項目的最佳選擇。
在深度學習中有許多不一樣的子領域,很難弄清楚哪些方法最終會勝出。儘管如此,我認爲熟悉該領域可以讓人們可以處理更普遍的問題。
我在作什麼
我學習深度學習的方法與成爲數據科學家的方法相同:
閱讀着重部署應用的書籍和教程
在實際項目中練習技術和方法
經過寫做分享和解釋個人項目
在學習一項技術時,最有效的方法是邊作邊學。對我來講,這意味着不是從基礎的基礎理論開始,而是經過找出如何實現解決問題的方法。這種自上而下的方法意味着我更重視關於動手的書籍,即當中包括許多代碼例子。
對於深度學習,我主要看了如下三本書:
Deep Learning Cookbook,做者:Douwe Osinga
Deep Learning with Python,做者: Francois Chollet
Deep Learning,做者:Ian Goodfellow、Yoshua Bengio、Aaron Courville
前兩本重點是用神經網絡構建實際解決方案,而第三本重點是深刻理論。當閱讀有關技術主題的書籍時,你須要更主動參與其中,儘量試着書中的代碼。像前兩本提供代碼例子的書籍很棒,我常常會在Jupyter Notebook中逐行輸入代碼,弄清當中的原理。
此外,我不只試着複製這些代碼,還會將它們用於本身的項目。這方面的一個應用是我最近構建的圖書推薦系統,該系統是根據Deep Learning Cookbook的相似代碼改編的。從頭開始建立本身的項目可能會使人生畏,但這也是提高本身最好的方法。
最後,學習技術最有效方法之一是教別人。只有當我試着用簡單的術語向其餘人解釋時,我才能我徹底理解這個概念。隨着學習深度學習的每一個知識,我將寫下了,分享當中的技術實現細節和概念性解釋。
教學是最好的學習方式之一,我打算將其做爲學習深度學習的一個重要組成部分。
結語
羅列本身的弱點可能會有點奇怪,但這能讓我成爲更好的數據科學家。並且,我發現不少人,包括僱主們,會對你坦誠本身的弱點並探討如何解決它們留下深入印象。
缺少某些技能並非缺點——真正的缺點是僞裝你什麼都懂,並且沒有想改進的意思。
經過發現我在數據科學方面的弱點:軟件工程,擴展分析/建模,深度學習,個人目標是提升本身,鼓勵其餘人思考本身的弱點。要成爲成功的數據科學家,你並不須要什麼都懂。雖然反思本身的弱點多是痛苦的,但學習是愉快的:最有成就感的事情莫過於,通過一段時間的持續學習後,你會發現本身比剛開始時已經懂了不少。