支招 | 構建機器學習系統的六個重要步驟
- 2019 年 10 月 5 日
- 筆記
原標題 | Six Important Steps to Build a Machine Learning System
作 者 | Rahul Agarwal
翻 譯 | Pita、鄴調(江蘇科技大學)

圖片來自:Pixabay
構建一個偉大的機器學習系統是一門講究的藝術。
在構建的過程中,你需要考慮很多事情。但是作為數據科學家的我們往往只擔心了項目的其中某些部分。
儘管大部分時間都在建模,但實際上,機器學習項目的成功或失敗取決於許多其他因素。
機器學習管道不僅僅是創建模型
在培訓模型之前以及培訓模型並將其部署到生產中之後,了解其中發生了什麼是至關重要的。
這篇文章是關於解釋端到端數據項目管道涉及的內容。這是我在職業生涯中很晚才學到的東西。
1.問題定義

非常顯然,第一個重要步驟就是 定義問題 。
而且,這可能是整個構建機器學習系統過程中最重要的部分。
那麼,我們如何為機器學習定義問題呢?
這取決於很多因素。在我們考慮的所有要素中,第一個應該是了解它將如何使業務受益。
這也是任何數據科學項目的聖杯,如果你的項目無法為業務帶來幫助,那麼這個項目將不會部署並走向終結。
一旦你有了想法並確定了業務的兼容性,你就需要定義一個項目成功的衡量標準。
那麼問題來了,怎樣才算項目成功了呢?
是達到90%,95%還是達到99%就算成功了呢?
在我看來,可能70%的預測準確性我就已經感到很滿意了,因為普通人不會超過這個準確度,同時,你可以讓這個過程自動化。
注意了,現階段不應該定這麼高的(準確度)目標,是時候理智地對待每1%的準確度變化如何影響項目的成功。
舉個例子:對於點擊預測問題/欺詐應用,與審查情緒預測的準確度增加1%相比,1%的準確度增加將提升它們的業務底線。
並非所有準確度的增加帶來的結果都是相同的。
2.數據

在為你的機器學習模型進行數據獲取和數據創建時,你需要思考幾個問題。
需要回答的最重要的問題是:這個模型需要實時工作嗎?
如果你的回答是「是」的話,這種情況就無法使用Hive / Hadoop等系統來進行數據存儲,因為這類系統可能會引入大量延遲,並且更適合離線批處理。
問題2:你的模型需要實時訓練嗎?

如果機器學習模型的性能表現隨著時間的推移而降低,如上圖所示,那麼應該考慮進行實時訓練。隨著互聯網趨勢的變化相當快,實時訓練可能對大多數的點擊預測系統更有益。
問題3:測試和訓練的數據之間是否存在不一致情況?
或者用簡單的話來說 – 你是否懷疑生產數據來自與培訓數據不同的分布?
例如:在針對點擊預測問題的實時訓練中,你向用戶展示了廣告,而他沒有點擊。這是一個失敗的例子嗎?通常用戶可能會在10分鐘後才進行點擊。但是你已經創建了數據並在此基礎上訓練了你的模型。
在為你設計的模型準備數據時,你應該考慮許多因素。在這個階段,你需要提出問題並從頭到尾思考整個過程才能成功。
3.評估分析

我們應該如何評估分析我們設計的模型的表現呢?
這裡的黃金標準是訓練-測試-驗證拆分。
經常,我們會通過取樣來製作訓練驗證測試集,但是我們忘記了一個隱含的假設 —— 數據很少是IID(獨立且恆等分布)。
簡單來說,我們假設每個數據點彼此獨立且恆等分布,即使不是完全錯誤的,至少也是錯誤的。
對於一家互聯網公司而言,2007年的數據點與2019年的數據點是截然不同的。由於很多因素,互聯網發展的速度才是最重要的,因此它們並非來自相同的分布。
如果你有做過貓與狗的預測問題,那麼隨機抽樣方面的就會表現得非常好。但是,在大多數機器學習模型中,它們的任務是預測未來。
你可以考慮使用時間變數拆分數據,而不是從數據中隨機抽樣。例如:對於點擊預測問題,你可以將上個月的所有過去的數據作為上個月的訓練數據和驗證數據。
你要考慮的下一個因素是基準線模型。
假設我們使用RMSE作為時間序列模型的評估指標。我們在測試集上評估了模型,結果RMSE為4.8。
所以這是個好的RMSE嗎?咱也不敢問,咱也不知道啊。因此我們需要一個基準線RMSE,它可能來自當前用於相同任務的模型。或者使用一些簡單的模型。對於時間序列模型,失敗的基準線是對最後一天的預測,即預測前一天的數量。
對於NLP分類模型,我通常會將基準線設置為Countvectorizer(Bag of words)上Logistic回歸模型的評價指標(precision, F1, log loss)。
你還應該考慮如何在多個組中打破評估,這樣你的模型不會導致不必要的偏差。

去年,亞馬遜被曝正在秘密使用人工智慧招聘工具的消息,該工具顯示出對女性的偏見。為了使得我們的機器學習模型免於這種不一致,我們需要在不同的組上評估我們的模型。也許我們的模型對於女性而言並不像男性那麼準確,因為在訓練數據中,女性的數量要少得多。
或者一個預測產品是否會被購買的模型對於特定的產品類別非常有效,而對於其他類別則不然。
事先牢記這些事情並準確地思考特定評估方法可能出現的問題,這無疑能幫助我們設計一個好的機器學習系統。
4.功能特性

良好的功能特性是任何機器學習模型的支柱,而且這些特性往往是你會花最多時間設計的部分。我已經看到,這個(功能特性)也是你可以進行調優以獲得最大模型性能的部分。
好的功能特性的創建通常需要領域知識、創造力和大量的時間。
最重要的是,對於不同的模型,功能特性的創建練習可能會發生變化。例如,對於神經網路和XGboost,特性創建是非常不同的。
理解特性創建的各種方法本身就是一個相當大的主題。我在這裡寫了一篇關於特性創建的文章。點擊底部【閱讀原文】可戳相關鏈接查看:

https://towardsdatascience.com/the-hitchhikers-guide-to-feature-extraction-b4c157e96631
一旦創建了許多功能特性,接下來要做的就是刪除冗餘特性。以下文章有一些方法可以做到這一點:

https://towardsdatascience.com/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2
5.建模

可解釋的手冊(https://christophm.github.io/interpretable-ml-book/terminology.html)
現在輪到我們最關心的部分了。有何不可呢?它是我們最終在項目結束時交付的部分。這就是我們花費了所有時間在數據採集和清理,特徵創建和諸如此類的部分。
那麼在創建模型時我們需要考慮什麼?
可能你需要問自己的第一個問題是,你的模型是否需要可解釋?
在相當多的用例中,業務可能需要一個可解釋的模型。其中一個這樣的用例是,當我們想要做屬性建模的時候。我們在這裡定義了各種廣告流(電視、廣播、報紙等)對收入的影響。在這種情況下,了解來自每個廣告流的響應就變得很有必要。
如果我們需要最大限度地提高精度或其他指標,我們仍然希望使用像NeuralNets或XGBoost這樣的黑盒模型。
除了模型選擇之外,你還應該考慮其他事項:
- 模型架構:nns有多少層,gbt有多少樹,或者您需要為線性模型創建特性交互。
- 如何優化超參數?:您應該嘗試自動執行此部分。市場上有很多這樣的工具。我傾向於使用hyperopt。
6.實驗

現在你已經創建了模型,它的性能比基準線或者你當前的模型表現得更好。我們該如何繼續研究呢?
我們有兩個選擇:
- 在進一步改進我們的模型時進入一個無止境的循環。
- 在生產環境中測試我們的模型,了解可能出現的問題,然後通過持續集成繼續改進我們的模型。
我更喜歡第二種方法。Andrew Ng說,在他的第三門課程中【敬請點擊閱讀原文訪問相關鏈接】,他命名為「深入學習專業化的機器學習項目」—
「不要一開始就試圖設計和構建完美的系統。相反,快速構建和訓練一個基本的系統——也許只需幾天。即使基本系統離你能建立的「最佳」系統還很遠,但研究基本系統的功能是很有價值的:你會很快找到線索,告訴你最有希望的方向,在哪方面投入時間。」
我還想強調的一點是持續整合。如果當前模型的性能比現有模型好,為什麼不在生產中部署它,而不是在增量收益之後運行呢?
要測試你的模型優於現有模型的假設的有效性,可以設置A/B測試。一些用戶(測試組)看到你的模型,而一些用戶(控制項)看到來自上一個模型的預測。
你應該始終致力於最大程度地縮短模型首次在線實驗的時間。這不僅產生了價值,還讓你了解了你的模型存在的缺點與實時回饋,然後你可以第一時間進行處理。
結論
在機器學習中沒有什麼是簡單的。不應該有任何假設。
在構建機器學習管道時,你應該始終對所做的任何決策保持批評態度。
一個簡單的決定可能是你的機器學習項目成敗的區別。
所以要明智地思考,多思考。
這篇文章是增加我對機器學習生態系統的理解的一部分,靈感來自Facebook工程團隊的一組很棒的影片(https://research.fb.com/videos/?cat=3)。
如果你想了解更多關於如何構建機器學習項目和最佳實踐的知識,我想請他(Andrew Ng)在Coursera Deep Learning Specialization中推出的第三門非常棒的課程名為結構化機器學習項目。一定要去看看。【敬請點擊閱讀原文訪問相關鏈接】
謝謝你的閱讀。我也會在未來寫更多適合初學者的帖子。請在medium上關注我(https://medium.com/@rahul_agarwal),或訂閱我的部落格(http://eepurl.com/dbQnuX)以了解他們的情況。一如既往,我歡迎回饋和建設性的批評,可以在twitter@mlwhiz上聯繫到我。
作者@rahul agarwal
via https://towardsdatascience.com/6-important-steps-to-build-a-machine-learning-system-d75e3b83686