Categories
程式開發

我在數據科學前線工作這一年


過去一年以來,我的工作內容從簡單編寫Jupyter Notebook,轉向為機器學習開發流水線,用於全天候向建築工程師提供實時建議。雖然工作成果仍有改進的餘地(我承認,我在編碼和數據科學方面犯了不少錯誤),但在過程中我還是學到了不少關於數據科學的知識。在本文中,我將結合自己的實踐經驗,與各位分享心得,希望幫助大家避免我曾在日常數據科學前沿工作中遇到過的錯誤。

生產層面的數據科學,總體屬於計算機科學範疇

在被問及工作當中最困難的部分時,我總會首先強調一點——生產層面的數據科學,不屬於機器學習。畢竟我們平時接觸的“機器學習”基本都是這個樣子:

我在數據科學前線工作這一年 1

相反,數據科學當中最困難的部分,在於建模之前與之後的開發工作。建模之前,我們需要解決的問題有:從數據庫加載數據、特徵工程、數據驗證以及數據處理流水線(假設我們的荼在數據攝取之後才正式開始)。在結果驗證之後,任務即可按計劃自動運行,將結果寫入回我們的數據庫內,並發送webhooks以觸發其他服務。

這些具體操作構成了機器學習中的大部分內容,同時也對工作人員的計算機科學知識提出嚴格要求。與代碼開發相關的實踐方面,則包括編寫負責實現單一功能的短函數、開發類以實現多個相關函數、合理的命名約定、以代碼與數據為基礎編寫單元測試、編寫讀取代碼,同時確保不存在重複代碼。此外,我們還需要將其他計算機科學實踐應用於代碼之內,例如版本控制、代碼審查、持續集成、代碼覆蓋與部署等等。這些實踐方法,共同構建起一個完全獨立的新領域——機器學習運營(MLOps)。

儘管我努力完成了從機械工程到數據科學的過渡,但現在回想起來,如果當初能夠選擇從工程到計算機科學、再到數據科學的成長道路,也許效果會更好一些。後一種方法意味著,我用不著在數據科學實踐當中積累編碼知識。換句話說,雖然先學數據科學、再學計算機科學也不是不可行,但最好的方法應該是把二者的順序顛倒過來。

計算機科學涉及一種完全不同的系統性思維方式,即在編碼之前進行合理規劃、逐步編寫代碼,並在編寫完成之後進行代碼測試。清晰明確的代碼,與我之前隨意寫下的各種notebook(我們都會編寫名為Untitled12.ipynb的notebook)形成了鮮明的對比。此外,計算機科學更強調快速獲取結果的重要性,而非可重複利用的無錯誤代碼。

任何數據科學家,都能夠從計算機科學最佳編碼實踐課程當中受益。結構化腳本與軟件包、簡潔的代碼編寫風格、測試與記錄代碼的能力,將幫助我們更高效地管理從探索性數據科學到生產性機器學習的過渡。此外,計算機科學還帶來一種重要的思維模式,幫助我們編寫出更易於理解且可複用的代碼。即使是那些單純為了分析論文數據而編寫數據科學腳本的學術型數據科學家,也將從這些實踐當中獲得助益。如果科學家們能夠編寫出更簡潔的代碼,並佐以用於輸入、輸出以及函數行為驗證的單元測試,那麼對科學中可重複性問題的處理能力將得到極大增強。

數據科學當中包含大量值得學習的主題,有時候會令剛剛上手的朋友感到不知所措。但是,計算機科學並非補充性知識;相反,對於希望保證代碼可操作性的數據科學家而言,計算機科學更是一種基礎性前提。幸運的是,目前市面上存在大量優秀資源,可供感興趣的朋友學習並應用這些重要的編碼實踐。

數據科學仍是一種高度主觀的學科

數據科學承諾利用數據——而非人類判斷——做出最佳決策。雖然這個目標聽起來有理有據,但目前的現實還遠遠無法支撐起這樣的效果,這是因為我們使用的數據內容與分析方法在很大程度上仍受到人類的影響。事實上,就連數據科學中的所謂客觀因素,同樣與人類行為密不可分。正如Vicki Boykis在文章中提到,神經網絡從始至終都是人的體現。

典型機器學習系統中的每一個步驟,都會受到個人選擇的影響。下面來看幾種具體決策方向:

  • 數據收集: 我們需要收集什麼數據?使用什麼傳感器?要調查誰?如何表達我們的問題?

  • 特徵工程: 我們建立哪些特徵?應當使用特定領域知識還是自動化特徵工程?如何填充缺失值?哪些意見需要被剔除?

  • 建模: 我們應該使用哪些超參數?模型的複雜度應該控制在怎樣的水平?

  • 驗證: 我們使用哪些評估指標?驗證流程該如何設計?理想的結果應該擁有怎樣的性能表現?

  • 部署: 我們能否信任結果並將其展示給客戶?是否需要引入人工評估預測,以進行完整性檢查?

很明顯,不同的人對於上述問題將給出不同的結論。 《同一套數據集,不同的分析師(Many Analysts, One Data Set)》一文列舉了一個實例,描述多位數據科學家如何憑藉不同方法,利用相同的數據集得出相互矛盾的決策結果。毫不誇張地說,我們完全可以通過變更分析方法的方式,利用同一數據集同時證明某個論點及其對立觀點。由此來看,我們不該對任何一項研究得同的結論堅持不放,而應該以懷疑的態度審視元分析過程。

此外,人為偏見(無論有意還是無意)都會出現在數據當中,進而影響到機器學習模型。正如《數學毀滅性武器(Weapons of Math Destruction》一書所提到,將決策工作交由機器處理並不能消除歧視,而只是對現實數據中存在的現有偏見進行了一番“整理”。我們的最終目標當然是利用數據科學消除決策偏見,但只要仍有人類參與,我們就不能盲目信賴機器學習的預測結果。

數據科學的主觀性,是否意味著我們將陷入關於真理的“不可知論”當中?我認為我們有必要重新思考這個問題:我們不可能找到完全正確的答案,而只能利用數據科學——哪怕仍存在缺陷——不斷朝著更好的方向邁進。畢竟,數據科學只是科學的一個子領域,因為其目標同樣是隨著時間的推進而減少錯誤機率。同樣的,研究問題的人員越多,工作結果就越容易直接比較,也能幫助我們不斷提升結果質量。假設有20名科學家進行20項不同的分析,只要他們能夠後續比較分析方法並協同努力,那麼最終成果將優於任何單一項目。

在數據科學實踐當中,我們必須牢記:與任何其他領域一樣,數據科學並非沒有缺陷,我們也不應該毫無保留地對其給予信任。因此,負責任的數據科學研究態度,應該是每隔一段時間展示分析結果、嘗試找出結果中的謬誤、將自己的結果與其他類似工作進行比較,並在展示結果時充分與現實情況進行對比。

正是由於數據科學的一大前提在於人類的判斷力,因此我們必須意識到:

人員與溝通技巧至關重要

儘管看起來像是廢話(畢竟,有哪個領域能夠接受負面的溝通效果呢?),但我每天都在提醒自己,必須要切實有效地向來自各個技術領域的人們傳遞機器學習知識。單純了解機器學習術語還遠遠不夠,我們需要能夠與擁有不同理解的人們溝通,並告知他們需要知曉的種種細節。

(舉個例子,有些朋友非常了解我的工作內容,能跟我進行長時間的機器學習細節討論;但也有些人認為我是「管電腦的」……)

以我自己為例,機器學習決策並不能替代人工選擇(即使有時準確率更高),畢竟最終要由建築工程師來決定哪些建議值得採納。事實上,自主建築運營的全面實現,也許要比無人駕駛汽車更為困難。單純建立模型、證明模型準確性並將結果提交給客戶,當然還遠遠不夠。數據科學家還需要玩轉一片混亂的社交互動場景。如果無法說服他人,那麼即使開發出了最強大的機器學習模型,它也不可能發揮任何實際作用。

我日常工作中最常規的組成部分,就是面向內部與外部小組通過文章與案例演示來解釋分析方法,了解我們的客戶如何制定當前決策,並與行業內專家交談以將知識轉化為數據科學系統。大學里肯定不教這些內容,課堂上我們總是認為科學家可以始終高舉完美客觀的大旗——但現實工作是位好老師,狠狠地擊碎了我的幼稚夢想。

即使在解釋了計算機如何做出決策之後,客戶有時候仍然不願意採納,這是因為人類絕不是純理性的動物。在呈現出客觀層面更好的選擇時,人們可能出於習慣、不信任、熟悉或者某些誤導性信息等理由,而下意識到選擇其他選項。

我們不妨以外出兜風例具體聊聊這個問題:人們似乎會出於邏輯角度選擇兩點之間距離更長的路徑。為什麼?因為沿途風景更漂亮。天真的數據科學家們當然會推薦模型給出的最短路線,但真正了解客戶的數據科學家們會意識到,他們想要旅途中充分享受與大自然的親密接觸。

同樣的,有時候客戶不願使用最佳機器學習預測方案,是因為準確性並不是唯一的考量因素。例如,我們預測了建築工程師開始為建築物供暖的理想時間點,但不少工程師仍然會更早打開設備,因為他們不希望租戶感到溫度不適。這當然不合理(我們會按時提出建議,確保在租戶抵達室內時將溫度提升至正確的水平),但除非能夠把人徹底從決策流程中剔除出去,否則需要做出調整的永遠只能是計算機系統這一方。

也許除了計算機科學課程之外,我們還可以參加一些社會學課程來了解人類同胞的想法。

使用標準工具,同時放慢新技術的採用速度

我們怎樣才能保證算法當中不存在任何錯誤?首先,從sklearn上導入模型,這比自己編寫靠譜得多。除非大家是在搞前沿研究,否則真的沒什麼理由自己動手編寫機器學習模型。相反,最好是使用經過廣泛測試及使用的公開庫提供的函數(我稱其為標準工具)來完成任務。

在最近的一條推文中,我提到差勁的數據科學家總愛自主編寫算法,而優秀的科學家們則選擇從標準庫處導入算法。這裡面當然有戲謔的成分,但我仍然堅持這樣一條原則:相較於自主開發的代碼,使用經過廣泛測試的開源庫中的代碼,幾乎永遠是更加高效可靠的作法。

這種標準工具優先的邏輯不僅適用於機器學習模型。事實上,我們希望對數據集執行的幾乎一切操作,都能在pandas中找到對應的實現方案(假設您使用Python),所以不妨優先從這裡入手。同樣的,與統計、繪圖、測試、調度、任務部署以及機器學習流水線內大部分其他操作相關的標準庫也所在多有,請善加利用。

我現在這份工作,原本是由兩位擁有博士學位的數據科學家負責的。作為學術精英,他們一直渴望發明自己的數據結構、指標、算法、文件加載機制等等(可能是為了證明自己的學位貨真價實吧……),但這也帶來了一大堆無法理解的混亂代碼。我入職後的前六個月,主要工作就是用三個import語句替換這些上百行的腳本。現在,我可能非常驕傲地向大家宣布,我已經成為這套機器庫出色的負貢獻者。

我在數據科學前線工作這一年 2

此外,不要盲目採用新近發布的庫/技術/框架/數據庫。像SQL數據庫、sklearn機器學習以及pand數據操作這樣的標準工具雖然古老而且無聊,但卻能夠正常運作——而且經過了大範圍的測試與可靠性評估。別搞新官上任三把火那種沒用的事情,雖然起初在熱情的支持下吐故納新似乎很有樂趣,但在經歷一系列錯誤與文檔匱乏問題的折磨之後,大家很快就會筋疲力盡。

新興技術往往只是媒體頭條的跟踪對象,但對於實際從業的人員及企業幾乎沒有任何即時影響。不少年輕一代的技術人員對我這種觀點持反對意見,但相較於那些新鮮出爐但還沒有證明過自己的技術,我確實更偏愛那些無聊卻已經非常成熟的方案。在內部,我們的工程團隊對庫版本的升級問題進行過長時間的爭論;最終,我們認為如果沒有明顯的優勢或者需求,我們不會單純因新版本的發布而升級。要向機器學習項目中添加庫之前必須經過嚴格證明,因為新庫的加入意味著我們需要管理的依賴項也將同步增加。

生命力最頑強的企業,恰恰就是那些安於平凡且步伐穩健的企業(例如Caterpillar);而那些行動迅速,而且總是顯得“酷酷”的初創公司則往往在幾年之內就會煙消雲散。最強大的機器學習系統絕不是塞滿了尖端技術的工具展櫃,而是久經考驗、以數據科學標準工具為基礎的可靠小背包。

利用外部簡單性,隱藏數據科學的內部複雜性

計算機非常擅長處理人類幾乎無法應對的大規模數字。為了有效將計算機與人類的長處結合起來,我們應當利用計算機分析大型數據集,且只向決策者展示其中最關鍵的幾項數值。數百萬數字進,幾個數字出。複雜模型在內,可行性建議在外。

過去一年以來,我開發出一種理論,即圖表中的數據點越多(黃金數據點大概是……7?),結論就越是缺乏實際意義。人類確實沒有能力準確地分析複雜定量圖。熱圖雖然很酷,但有人能利用包含1000個數據點的熱圖(相較於只有5個數字的柱狀圖)做出關鍵性決策嗎?不存在的。

我在數據科學前線工作這一年 3

我是那種喜歡細讀數字並了解機器學習模型細節的人,但我也很清楚,大多數朋友其實並不想一下子被數據所吞沒。客戶和製定決策的領導者們想听重點、聽乾貨,一定是這樣。換句話說,內容越簡練,圖表的展示效果就越好。

我在數據科學前線工作這一年 4

外部簡單性這一論點,並不代表單純使用線性模型。數據科學往往只涉及復雜的算法與高技術培訓性操作,因此對於非技術人員而言,必須確保數據科學擁有一套平易近人的“外殼”。不過需要注意的是,有些數據科學模型太過複雜,以至於我們自己可能都不太理解。那麼,有必要以無法解釋為代價,通過混合模型提高那麼一丁點精度嗎?答案恐怕是否定的。

為了用外部簡單性掩蓋內部複雜性,我們應當使用有助於描述模型決策的工具。 SHAP值就是一種非常實用的技術,當然大家也可以選擇其他方法。為了解釋建築物的最佳運作啟動時間,我們對所有特徵(包括工程化特徵)採用SHAP值,並將其組合為人類能夠理解的特徵組——例如天氣與建築物內部條件。我們採用複雜的機器學習算法,SHAP值的介入能夠簡化算法幫助我們理解,並有必要在向客戶展示產品之前借助自己的專業知識做出進一步簡化。

簡化定量信息的一種可行方法,是準備一份單純以數字為起點的報告,而後根據需要慢慢添加其他數字(或者圖形)。這種累加的方法相當於由少而多,確保演示與報告內容當中不存在無關緊要的統計數據——與之對應的,就是由多而少,準備大量圖表而後逐一刪除。請記住,人不是計算機,所以千萬不要把只適合計算機的展示方式擺到人類面前。

“名不副實”綜合症

再加一點:每個人都或多或少會有“名不副實”綜合症;自省是對的,但不要被這種情緒所支配。

最後,作為數據科學(也包括其他專業)中的一個重要問題,我想跟大家聊聊:不要讓“名不副實”焦慮或者偶爾犯下的錯誤,佔據你的全部情緒。

每個人都會產生一種感覺,認為自己沒有資格負擔起目前的工作,或者終究會因無法勝任而被“曝光”。在這裡我要勸勸大家,不要為此過度煩惱,畢竟並不是只有我們存在這樣的想法,而且學習新事物與產出的結果同樣重要。另外,如果您才剛剛邁入數據科學圈,那麼也可以安心享受一波新手紅利(例如尋找新的方法來解決問題)。另外,雖然身邊的人們可能非常成功、甚至擁有輝煌的成功,但請相信,他們的成長道路上同樣佈滿荊棘(這是種倖存者偏差)。

!()(https://static001.infoq.cn/resource/image/cb/82/cbc042e4c441897af52ee32d17825482.png ) 人們有不同的知識領域

即使是表現最出色的人們,在初學者階段也曾犯下、而且未來還會繼續犯下種種錯誤。錯誤並不意味著我們沒有資格擔當數據科學家或者計算機程序員;相反,這只意味著我們有機會進一步學習,了解如何做得更好。在數據科學領域,我們需要更多的人加入進來,我也一直擔心總是把數據科學家描述成高不可攀的角色,會令一些非常優秀的潛在人才望而生畏。這是種誤解,因為我們必須要投向行業才能獲得某一領域中的專業知識,如果不邁出第一步,那麼知識永遠無從談起。事實上,數據科學是個非常開放的學科,而且不存在進入這一領域的“典型”途徑。總而言之,如果大家還在為自己的教育背景對不上或者缺少專業知識而苦惱,那麼好消息是——這完全是種誤區,數據科學絕不是只適合少數精英的專業方向。

總結

在數據科學領域工作了一年之後,我最初對於數據科學的無限樂觀,已經被謹慎的熱情所取代。機器學習確實能夠很好地解決一小部分問題(比人類更好),但卻無法搞定所有人為錯誤。我們必須認識到這一領域的局限性,避免對數據科學的過度炒作,踏踏實實做出承諾並成功踐行,才是發展的正道。我們同時需要強調的是,機器學習可以帶來令人印象深刻的結果,這也是不爭的事實。最後,最好的機器學習系統應該通過提高工作效率的方式協助人類,而非完全取代人類。

原文鏈接:

https://towardsdatascience.com/lessons-from-a-year-in-the-data-science-trenches-f06efa6355fd