天天看點

機器學習模型調優總結!

作者:Xiaoyou Wang,編譯:機器之心​

無論是 Kaggle 競賽還是工業部署,機器學習模型在搭建起來之後都面臨着無盡的調優需求。在這個過程中我們要遵循怎樣的思路呢?

如果準确性不夠,機器學習模型在真實世界就沒有什麼實用性了。對于開發者們來說,如何提高性能是非常重要的工作,本文将介紹一些常用政策,包括選擇最佳算法、調整模型設定和特征工程。

如果你學習過正确的教程,很快就能訓練起自己的第一個機器學習模型。然而想要在第一個模型上跑出很好的效果是極難的。在模型訓練完後,我們需要花費大量時間進行調整以提高性能。不同類型的模型有不同的調優政策,在本文中,我們将介紹模型調優的常用政策。

模型好不好?

在模型調優之前,我們首先需要知道現在的模型性能是好是壞。如果你不知道如何衡量模型的性能,可以參考:

  • ​​https://www.mage.ai/blog/definitive-guide-to-accuracy-precision-recall-for-product-developers​​
  • ​​https://www.mage.ai/blog/product-developers-guide-to-ml-regression-model-metrics​​

每個模型都有基線名額。我們可以使用「模式類别」作為分類模型的基線名額。如果你的模型優于基準線,那麼恭喜你,這是一個好的開始。如果模型能力還沒有達到基準水準,這說明你的模型還沒有從資料中獲得有價值的見解(insight)。為了提高性能,還有很多事情要做。

當然還有一個情況就是模型的表現「太過優秀」了,比如 99% 的準确率和 99% 的召回率。這并不是什麼好事,可能表示你的模型存在一定的問題。一個可能的原因是「資料洩露」,我們将在「消除資料洩漏功能」部分讨論如何解決此問題。

改進模型的政策

一般來說,模型調優有 3 個方向:選擇更好的算法,調優模型參數,改進資料。

比較不同算法

比較多個算法是提高模型性能的一個簡單的想法,不同的算法适合不同類型的資料集,我們可以一起訓練它們,找到表現最好的那個。例如對于分類模型,我們可以嘗試邏輯回歸、支援向量機、XGBoost、神經網絡等。

機器學習模型調優總結!

圖源:https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

超參數調優

超參數調優是一種常用的模型調優方法。在機器學習模型中,學習過程開始之前需要選擇的一些參數被稱為超參數。比如決策樹允許的最大深度,以及随機森林中包含的樹的數量。超參數明顯影響學習過程的結果。調整超參數可以讓我們在學習過程中很快獲得最佳結果。

機器學習模型調優總結!

我們非常建議使用公開可用的庫幫助進行超參數調整,例如 optuna。

用召回率換精度

對于分類模型,我們通常用 2 個名額來衡量模型的性能:精度和召回率。根據問題的不同,你可能需要優化召回率或精度中的一個。有一種快速的方法來調整模型以在兩個名額之間進行權衡。分類模型預測标簽類别的機率,是以我們可以簡單地修改機率門檻值來修改召回率和精度。

例如,如果我們建立一個模型來預測乘客在泰坦尼克号沉船事故中是否生還,該模型可以預測乘客生還或死亡的機率。果機率高于 50%,模型将預測乘客會幸存,反之乘客死亡。如果我們想要更高的精度,我們可以增加機率門檻值。然後,該模型将預測較少的乘客幸存,但會更精确。

機器學習模型調優總結!

特征工程

除了選擇最佳算法和調優參數外,我們還可以從現有資料中生成更多特征,這被稱為特征工程。

建立新的特征

建構新的特征需要一定的領域知識和創造力。這是一個建構新特征的例子:

  • 建立一個功能來計算文本中的字母數。
  • 建立一個功能來計算文本中的單詞數。
  • 建立一個了解文本含義的特征(例如詞嵌入)。
  • 過去 7 天、30 天或 90 天的聚合使用者事件計數。
  • 從日期或時間戳特征中提取「日」、「月」、「年」和「假期後的天數」等特征。

使用公共資料集來增加訓練資料

當你窮盡從現有資料集中生成新特征的想法時,另一個想法是從公共資料集中擷取特征。假如你正在建構一個用來預測使用者是否會轉換為會員的模型,可用的資料集中卻沒有太多的使用者資訊,隻有「電子郵件」和「公司」屬性。那麼你就可以從第三方擷取使用者和公司以外的資料,如使用者位址、使用者年齡、公司規模等等,這些資料可以用于豐富你的訓練資料。

機器學習模型調優總結!

特征選擇

添加更多特征并不總是好的。去除不相關和嘈雜的特征有助于減少模型訓練時間并提高模型性能。scikit-learn 中有多種特征選擇方法可以用來去除不相關的特征。

删除資料洩露(data leakage)特征

正如上文提到的,一種場景是模型的性能「非常好」。但是在部署模型并在生産中使用這些模型時,性能會變得很差。造成這個問題的原因可能是「資料洩露」,這是模型訓練的一個常見陷阱。資料洩露是指使用一些發生在目标變量之後的特征,并包含目标變量的資訊。然而現實生活中的預測不會有那些資料洩露特征。

例如想要預測使用者是否會打開電子郵件,特征可能就包括使用者是否點選了電子郵件。模型一旦看到使用者點選了它,那麼就預測使用者 100% 會打開它。然而在現實生活中,我們無法知道是否有人在打開電子郵件之前沒有點選它。

我們可以使用 SHAP 值 debug 資料洩露問題,用 SHAP 庫繪制圖表可以顯示出影響最大的特征以及它們如何定向影響模型的輸出。如果特征與目标變量高度相關并且權重非常高,那麼它們可能是資料洩露特征,我們可以将它們從訓練資料中删除。

機器學習模型調優總結!

更多資料

擷取更多訓練資料是提高模型性能一種明顯而有效的方法。更多的訓練資料能夠讓模型找到更多見解,并獲得更高的準确率。

機器學習模型調優總結!

那麼,什麼時候該停止調優了?

你需要知道如何開始,也需要知道在何時停止,很多時候怎樣才算足夠是一個難以回答的問題。模型的提升仿佛是無限的,沒有終點:總會有新想法帶來新資料、建立新功能或算法的新調整。首先,最低限度的标準是模型性能至少應優于基線名額。一旦滿足了最低标準,我們應該采用以下流程來改進模型并判斷何時停止:

  • 嘗試所有改進模型的政策。
  • 将模型性能與你必須驗證的其他一些名額進行比較,以驗證模型是否有意義。
  • 在進行了幾輪模型調整後,評估一下繼續修改和性能提升百分點之間的成本效益。
  • 如果模型表現良好,并且在嘗試了一些想法後幾乎沒有繼續改進,請将模型部署到生産過程中并測量實際性能。
  • 如果真實條件下的性能和測試環境中類似,那你的模型就算可以用了。如果生産性能比訓練中的性能差,則說明訓練中存在一些問題,這可能是因為過拟合或者資料洩露。這意味着還需要重新調整模型。

結論

模型調優是一個漫長而複雜的過程,包含模型的重新訓練、新想法的試驗、效果評估和名額對比。通過本文介紹的思路,希望你可以将自己的機器學習技術提升到更高的水準。