Scikit-learn 核心開發人員專訪:建立機器學習工作流最容易犯這2點錯誤

  • 2019 年 11 月 28 日
  • 筆記

本文作者 | Haebichan Jung

編  譯 | skura

本文是一篇對 Scikit-learn 開發者的專訪,原載於 towardsdatascience,我們對其進行了編譯整理,採訪內容如下文。

YouTube影片頻道:https://www.youtube.com/channel/UCuHZ1UYfHRqk3-5N5oc97Kw

採訪者:Haebichan Jung,TowardsDataScience 網站項目負責人。舊金山 Recurly 的數據科學家。

受訪者:Andreas Muller,Scikit learn 的核心開發人員,書籍《Python 機器學習入門》的作者,哥倫比亞大學數據科學研究所的科學家、講師。

Haebichan Jung:開源社區是如何維護 Scikit-learn 的?結構化的庫的工作流程和所有權是怎麼樣的?

Andreas Muller:首先是用戶。大多數對 Scikit-learn 有貢獻的人最開始都是用戶。如果你不使用這個軟體包,你就沒有動力去做這件事情。

其次,大多數偉大的貢獻都是由人們的用例驅動的。有些版本是我為 Scikit-learn 編寫的,因為我想使用它們。這些通常是最好的版本。你不想迎合軟體太具體的用例,你不想在功能上加標籤。

第三,對於像 Scikit-learn 那樣複雜的東西,你不想一開始就添加一些新的大功能。很多人都有他們最喜歡的模型,他們想通過將其添加到 Scikit-learn 中來開始他們的貢獻。但是,現在將一個模型添加到 Scikit-learn 需要大約一年的時間。所以我真的建議從小事做起。我本人是從文檔的排版開始的。改進文檔總是受歡迎的。還有很多關於問題追蹤的東西。

Haebichan Jung:在機器學習工作流中實現 Scikit-learn 的那些人中,你看到了哪些常見的錯誤或低效的事情?

Andreas Muller:一般來說,與 Scikit-learn 和機器學習相關的常見錯誤有兩種。

1.對於 Scikit 學習,每個人都可能在使用管道。如果你不使用管道,那你可能有些地方做錯了。2 年前,我們引入了列轉換器,它允許你處理具有連續和分類變數的數據,或者處理其他類型 One-Hot 編碼器時,一切都很好。

2。我在機器學習中看到的一個常見錯誤是沒有對度量標準給予足夠的關注。Scikit-learn 將精度用作默認度量。但一旦你有了一個不平衡的數據,準確度是一個可怕的指標。你真的應該考慮使用其他指標。我們不會改變默認的度量標準,因為準確性被廣泛使用,而且有如此清楚的解釋。但是,在機器學習中,查看其他度量並為你的用例考慮是否使用它們是最常見的問題。

什麼是管道?如果它不準確,還有什麼其他指標更適合機器學習?

在 Scikit-learn 中,每個 ML 模型都封裝在一個稱為「估計器」的簡單 python 類中。通常在機器學習過程中,你可能會有一個帶有一系列預處理步驟的分類器。管道允許你封裝所有預處理步驟、特徵選擇、縮放、變數編碼等,以及通常在單個估計器中具有的最終監督模型。

所以你有一個對象來完成你所有的工作。它非常方便,能夠使編寫錯誤的程式碼出現的更少,因為它可以確保你正的訓練集和測試集是一致的。最後,你應該使用交叉驗證或網格搜索 CV。在這種情況下,重要的是所有的預處理都在交叉驗證循環中進行。如果在交叉驗證循環之外進行功能選擇,可能會發生非常糟糕的事情。但在你的管道中,你知道一切都在交叉驗證循環中。

Andreas Muller 哥倫比亞系列講座

對於度量,它們通常在二進位分類中被忽略。在二進位分類中,精度取決於你的目標是什麼。我喜歡看 ROC 曲線下的面積和平均精度。這些是某種細粒度的度量。我也喜歡看精確召回曲線(AUPRC)。這些指標的意義在於,它們不依賴於你應用的決策閾值,因為它們是排名指標。所以你需要決定在哪裡設置閾值來表示「在什麼概率下我說是 1 類還是 0 類?」。

你可以研究的其他指標是 F1 指標或平均召回率/精確度,這些也很有趣。

Haebichan Jung:Scikit-learn 包中是否有其他工具或功能讓你覺得使用不足或被低估?

Andreas Muller:有一個功能還沒被充分利用,因為它還是很新的,它就是 Hist 梯度增強。這是 LightGBM 的根的實現,因此比以前的梯度增強實現快得多。它比 XGBoost 稍快,比 LightGBM 稍慢。目前它還不能支援缺失值的處理,但這個功能將很快在 2 周后的下一個版本中發布。它也不支援分類變數,這個功能將在明年春天左右發布。

Haebichan Jung:你提到 LightGBM 很有意思,因為越來越多基於 python 的 ML 庫正在發布,比如 Catboost,還有像 Pythorch 這樣的深度學習框架。你覺得這些在 ML 領域成長的玩家怎麼樣?這種現象是競爭的反應嗎?

Andreas Muller:我認為在大多數情況下,多元化是好的。其中大多數框架提供了類似於 Scikit-learn 的介面,因此與我們的包兼容。由於 Scikit-learn 的應用非常廣泛,所以開發速度很慢。我們可以看到,XGBoost 和 LightGBM 對人們來說非常有價值。因此,我們希望每個人都知道這一點,我們希望包括在 Scikit-learn 中的包能夠接觸到更廣泛的受眾。

對於深度學習庫來說,一部分原因是它們可以更快地移動,因為我們移動得太慢了。當然還有兩件事需要注意:

1.與Google或 Facebook 相比,我們的資源真的很少,所以和那些公司的工程師競爭是沒有意義的。我認為 Keras 真的很酷,我沒有理由在 Scikit-learn 中重新實現這樣的東西。

2.技術原因。現在,要在不同的平台上無縫地實現 GPU 支援仍然很困難。你可以在 Tensorflow 中看到這一點。Tensorflow 上有不同的版本,針對不同的架構進行編譯,你必須自己編譯。我們不會在 Scikit-learn 增加這麼多麻煩。

Haebichan Jung:你在哥倫比亞大學關於不平衡數據的講座中說過,這個問題有兩個主要的解決方案:1)在改變數據後建立模型(欠取樣/過取樣)和 2)改變模型(訓練程式本身)。每種策略的優缺點是什麼,尤其是在 Scikit-learn 方面?

Andreas Muller:我想從你的問題中退一步,再次提到最重要的是指標以及你如何評估它。你的目標是什麼?你的目標絕不是精確,也絕不是 ROC-AUC。這不是你做應用的目的。你應該考慮在應用程式的上下文中生成特定結果意味著什麼。

一旦有了這個目標,你就可以定義度量,嘗試不同的方法來最大化這些度量。重取樣非常吸引人的地方在於,你經常可以拋出大量數據,卻不會真正影響結果。如果你有 1:1000+ 的比率,你不想把它低估到 1:1,那麼你可以設置成 1:100 或 1:10,你可以得到完全相同的結果。這樣你的數據集減少了 100 倍。

「你的目標絕不是精確,也絕不是 ROC-AUC。這不是你做應用的目的。你應該考慮在應用程式的上下文中生成特定結果意味著什麼。」

所以如果你有大量的數據並且計算不是問題的話,欠取樣是更有效地得到類似結果的方法。相反,我並沒有真正看到人們在實踐中使用 SMOTE,這就是合成數據生成。人們經常提到它,但我有點懷疑。

在改變模型方面,類權重是人們經常使用且會有幫助的。類權重實際上改變了損失函數,這樣就好像對少數類進行了過取樣。所以你使用了所有的樣本,但是給了少數類更多的權重。這是人們發現的有用的東西。但是,這更像是嘗試不同的東西,並且你有正確的度量來衡量哪個解決方案最適合你的問題。

來自 Andreas Muller 的哥倫比亞系列講座

Haebichan Jung:有趣的是,你是以這種方式提到 SMOTE。在我的公司,我們一直在試驗 SMOTE。但就實際結果而言,在 AUC 或其他方面並沒有什麼大的好處。而且,因為我正在創建所有這些合成數據,它大大減慢了我的管道線。所以我想問你,你自己的懷疑是從哪裡來的?

Andreas Muller:因為我和每個人說的都和你說的一模一樣。

Haebichan Jung:那你覺得這是為什麼?

Andreas Muller:對我來說,機器學習中的很多東西都是經驗性的。如果你在很多數據集上嘗試它,但它對你沒有幫助,那麼它就是沒有幫助。很難說為什麼梯度增強效果很好。我想大多數人都相信梯度增強效果很好,但我不認為有人能正確解釋為什麼梯度增強比支援向量機更有效。我認為沒有人能用簡潔或有意義的方式來解釋。

就 SMOTE 而言,我認為發生了兩件事:

1.我認為 SMOTE 對數據的分布做出了假設。所以 A)要麼假設相鄰樣本之間的直線是錯誤的;B)如果樣本太遠,並且中間有其他類的樣本,那麼情況可能會打破。

2.可能是添加這些合成樣本實際上對你感興趣的模型類沒有幫助。

實際上,我和一個合作者有一個計劃,要寫一篇關於廣泛基準的論文。正如你所說,為什麼要嘗試使用 SMOTE?因為這是在驗證的文獻中提出的方法,但在實踐中,人們發現它並沒有多大作用。

關於完整的採訪,請觀看 YouTube 上的其他影片,Andreas 將深入解讀解Scikit-learn 包:https://www.youtube.com/watch?v=6RSQIHAVzuo

via:https://towardsdatascience.com/want-to-truly-master-scikit-learn-2-essential-tips-from-the-official-developer-himself-dada6ff56b99