1. 程式人生 > >作為資料科學家,我都有哪些弱點?

作為資料科學家,我都有哪些弱點?


作者 | William Koehrsen
翻譯 | Mika
本文為 CDA 資料分析師原創作品,轉載需授權

如果現代工作面試教會了我們什麼,那就是關於“你最大的弱點是什麼?”這個問題,正確答案是“我工作太努力了。”顯然,說出自己的弱點是很可笑的。雖然在個人簡歷中列出弱點不太好,但是如果不承認自己的不足,我們就無法採取措施改善它們。

做出改進的方法很簡單:

明確現在的位置:找出弱點

想變成什麼樣:制定實現的計劃

執行計劃:一步步改進

我們很少能跨越第一步,特別是對於在技術領域工作的人群。我們埋頭苦幹,不斷工作,使用已掌握的技能,而不是獲得哪些能讓我們工作更輕鬆或能帶來新機會的新技能。自我反省,客觀地評估自己,這似乎是一個陌生的概念。但若能夠退後一步,弄清我們哪些方面能做得更好,從而在該領域取得進步,這是至關重要的。

考慮到這一點,我試著客觀地評價自己,並總結了目前自己的三個弱點,改善以下這幾點能讓我成為更好的資料科學家:

軟體工程

擴充套件資料科學

深度學習

本文中我列出這些弱點主要的目的在於:首先,我非常想提高自己的能力,通過列出自己的不足以及如何解決它們,希望能夠激勵自己繼續學習,完成目標。

其次,我希望鼓勵其他人思考自己有哪些沒掌握的技能,以及該如何獲取這些技能。

最後,我想告訴你,成為出色的資料科學並不需要做到無所不知。關於資料科學和機器學習的知識是無線的,你能夠掌握的是有限的。我常常聽到初學者抱怨,要掌握的知識太多了,我給出的建議就是:從基礎開始,你並不需要掌握所有內容。


只有極少的資料科學家能夠掌握全部知識

對於每個弱點,我都列出了具體的問題,以及我目前在做什麼進行改進。發現自己的不足很重要,但制定改進計劃也同樣重要。學習一項新技能需要時間,但計劃好一步步的具體步驟會大大增加你成功的機率。

1. 軟體工程

在大學時進行我的第一個資料科學專案後,我開始試著避免一些資料科學方法中的壞習慣。其中包括編寫僅執行一次的程式碼,缺少文件,沒有一致性且難閱讀的程式碼,硬編碼特定值等。這些都是寫論文所帶來的,為了寫一篇論文,開發針對特定資料集且只能執行一次的解決方案。

其中一個典型的例子是,我們有個專案使用建築能源資料,最初每隔15分鐘獲取一次資料。當我們把時間增加為20分鐘時,資料管道完全崩潰了,因為許多地方已明確將時間編為15分鐘。我們不能進行簡單的查詢和替換,因為該引數被設定為多個名稱,如electricity_interval

timeBetweenMeasurements還有dataFreq。我們當中沒有人想過讓程式碼更易閱讀或能夠靈活改變輸入。

相比之下,從軟體工程的角度來看,程式碼必須使用大量不同的輸入進行測試,在現有框架內工作,並遵守程式設計標準,以便其他開發人員能夠理解。儘管我的初衷是好的,但我偶爾會像資料科學家那樣寫程式碼,而不是像軟體工程師那樣。現在我正在訓練自己像電腦科學家一樣思考。

我在做什麼

學習技能沒有比練習更好的方法。幸運的是,在我目前的工作中,我能夠為內部工具和開源庫(Featuretools)做出貢獻。這迫使我學習了很多技能,包括:

編寫單元測試

遵循編碼風格

編寫接受更改引數的函式

徹底記錄程式碼

讓他人檢查程式碼

重構程式碼,使其更簡單、更易於閱讀

對於還未工作的資料科學家,你也可以通過參與開源專案獲得這些經驗。除此之外,你還可以通過檢視GitHub上流行庫的原始碼。

像軟體工程師一樣思考需要改變思維模式,但做到這一點並不難。例如,每當我發現自己在Jupyter Notebook中複製和貼上程式碼並更改一些值時,我就會停下來,並意識到從長遠的角度看用函式會更高效。

總有需要改進的地方(在Sublime Text 3中使用pylint)

我還想研究電腦科學的許多其他方面,例如編寫有效的實現,而不是用蠻力方法(例如使用向量化而不是迴圈)。同時要注意想一下子全部改變是不顯示的,這也是我為什麼專注於一些實踐,並將其融入到我的工作流程中。

雖然資料科學自成一體,但從業者仍可以通過借鑑軟體工程等領域的最佳實踐從中受益。

  1. 擴充套件資料科學

雖然你可以自學資料科學中的所有內容,但要將其應用到實踐中還是存在一些限制。一個是難以將分析或預測模型擴充套件到大型資料集。我們中大多數人無法訪問計算叢集,也不想為一臺個人超級計算機掏錢。這意味著當我們學習新方法時,我們傾向於將它們應用於小型且表現良好的資料集。

然而在現實情況中,資料集並不符合一定的大小或乾淨程度,你需要用不同的方法來解決問題。首先,你可能需要打破個人計算機的安全限制,使用遠端例項(例如通過AWS EC2)甚至多臺計算機。

在學習資料科學時,我嘗試在EC2機器上練習,這有助於讓我熟悉命令列,但是,我仍然沒有解決當資料集大於機器的記憶體情況。最近,我意識到這一點限制了我的前進,是時候學習如何處理更大資料集的了。

我在做什麼

即使不在計算資源上花費大量金錢,就可以實踐超出記憶體限制的資料集的處理方法。其中包括每次迭代資料集的一部分,將大型資料集分成較小的資料集,或者使用Dask這樣的工具來處理大資料。

我目前採用的方法是將資料集分為多個子集,開發能夠處理每個部分的管道,然後使用Dask或Spark,與PySpark並行地執行管道中的子集。這種方法不需要用到超級計算機或叢集,你可以在個人計算機上並行操作。

此外,由於像Kaggle等資料儲存庫,我能夠找到一些大型的資料集,並檢視其他資料科學家的處理它們的方法。我已經學到了很多有用的技巧,例如通過更改資料框中的資料型別來減少記憶體消耗。這些方法有助於更有效地處理任何大小的資料集。

雖然我還沒處理過TB級的資料集,但這些方法幫助我學習了處理大資料的基本方法。對於最近的一些專案,我能夠運用目前學到的技能對在AWS上執行的叢集進行分析。希望在之後的幾個月,我能逐步提高處理資料集的大小。

美國國會圖書館“只有”3PB的材料

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的類似程式碼改編的。從頭開始建立自己的專案可能會令人生畏,但這也是提升自己最好的方法。

最後,學習技術最有效方法之一是教別人。只有當我試著用簡單的術語向其他人解釋時,我才能我完全理解這個概念。隨著學習深度學習的每個知識,我將寫下了,分享當中的技術實現細節和概念性解釋。

教學是最好的學習方式之一,我打算將其作為學習深度學習的一個重要組成部分。
在這裡插入圖片描述
結語

羅列自己的弱點可能會有點奇怪,但這能讓我成為更好的資料科學家。而且,我發現很多人,包括僱主們,會對你坦誠自己的弱點並探討如何解決它們留下深刻印象。

缺乏某些技能並不是缺點——真正的缺點是假裝你什麼都懂,而且沒有想改進的意思。

通過發現我在資料科學方面的弱點:軟體工程,擴充套件分析/建模,深度學習,我的目標是提高自己,鼓勵其他人思考自己的弱點。要成為成功的資料科學家,你並不需要什麼都懂。雖然反思自己的弱點可能是痛苦的,但學習是愉快的:最有成就感的事情莫過於,經過一段時間的持續學習後,你會發現自己比剛開始時已經懂了很多。