0
本文作者: skura | 2019-11-25 18:14 |
本文是一篇對 Scikit-learn 開發(fā)者的專訪,原載于 towardsdatascience,AI 開發(fā)者編譯整理,采訪內(nèi)容如下文。
采訪者:Haebichan Jung,TowardsDataScience 網(wǎng)站項目負(fù)責(zé)人。舊金山 Recurly 的數(shù)據(jù)科學(xué)家。
受訪者:Andreas Muller,Scikit learn 的核心開發(fā)人員,書籍《Python 機(jī)器學(xué)習(xí)入門》的作者,哥倫比亞大學(xué)數(shù)據(jù)科學(xué)研究所的科學(xué)家、講師。
Haebichan Jung:開源社區(qū)是如何維護(hù) Scikit-learn 的?結(jié)構(gòu)化的庫的工作流程和所有權(quán)是怎么樣的?
Andreas Muller:首先是用戶。大多數(shù)對 Scikit-learn 有貢獻(xiàn)的人最開始都是用戶。如果你不使用這個軟件包,你就沒有動力去做這件事情。
其次,大多數(shù)偉大的貢獻(xiàn)都是由人們的用例驅(qū)動的。有些版本是我為 Scikit-learn 編寫的,因為我想使用它們。這些通常是最好的版本。你不想迎合軟件太具體的用例,你不想在功能上加標(biāo)簽。
第三,對于像 Scikit-learn 那樣復(fù)雜的東西,你不想一開始就添加一些新的大功能。很多人都有他們最喜歡的模型,他們想通過將其添加到 Scikit-learn 中來開始他們的貢獻(xiàn)。但是,現(xiàn)在將一個模型添加到 Scikit-learn 需要大約一年的時間。所以我真的建議從小事做起。我本人是從文檔的排版開始的。改進(jìn)文檔總是受歡迎的。還有很多關(guān)于問題追蹤的東西。
Haebichan Jung:在機(jī)器學(xué)習(xí)工作流中實現(xiàn) Scikit-learn 的那些人中,你看到了哪些常見的錯誤或低效的事情?
Andreas Muller:一般來說,與 Scikit-learn 和機(jī)器學(xué)習(xí)相關(guān)的常見錯誤有兩種。
1.對于 Scikit 學(xué)習(xí),每個人都可能在使用管道。如果你不使用管道,那你可能有些地方做錯了。2 年前,我們引入了列轉(zhuǎn)換器,它允許你處理具有連續(xù)和分類變量的數(shù)據(jù),或者處理其他類型 One-Hot 編碼器時,一切都很好。
2。我在機(jī)器學(xué)習(xí)中看到的一個常見錯誤是沒有對度量標(biāo)準(zhǔn)給予足夠的關(guān)注。Scikit-learn 將精度用作默認(rèn)度量。但一旦你有了一個不平衡的數(shù)據(jù),準(zhǔn)確度是一個可怕的指標(biāo)。你真的應(yīng)該考慮使用其他指標(biāo)。我們不會改變默認(rèn)的度量標(biāo)準(zhǔn),因為準(zhǔn)確性被廣泛使用,而且有如此清楚的解釋。但是,在機(jī)器學(xué)習(xí)中,查看其他度量并為你的用例考慮是否使用它們是最常見的問題。
什么是管道?如果它不準(zhǔn)確,還有什么其他指標(biāo)更適合機(jī)器學(xué)習(xí)?
在 Scikit-learn 中,每個 ML 模型都封裝在一個稱為「估計器」的簡單 python 類中。通常在機(jī)器學(xué)習(xí)過程中,你可能會有一個帶有一系列預(yù)處理步驟的分類器。管道允許你封裝所有預(yù)處理步驟、特征選擇、縮放、變量編碼等,以及通常在單個估計器中具有的最終監(jiān)督模型。
所以你有一個對象來完成你所有的工作。它非常方便,能夠使編寫錯誤的代碼出現(xiàn)的更少,因為它可以確保你正的訓(xùn)練集和測試集是一致的。最后,你應(yīng)該使用交叉驗證或網(wǎng)格搜索 CV。在這種情況下,重要的是所有的預(yù)處理都在交叉驗證循環(huán)中進(jìn)行。如果在交叉驗證循環(huán)之外進(jìn)行功能選擇,可能會發(fā)生非常糟糕的事情。但在你的管道中,你知道一切都在交叉驗證循環(huán)中。
Andreas Muller 哥倫比亞系列講座
對于度量,它們通常在二進(jìn)制分類中被忽略。在二進(jìn)制分類中,精度取決于你的目標(biāo)是什么。我喜歡看 ROC 曲線下的面積和平均精度。這些是某種細(xì)粒度的度量。我也喜歡看精確召回曲線(AUPRC)。這些指標(biāo)的意義在于,它們不依賴于你應(yīng)用的決策閾值,因為它們是排名指標(biāo)。所以你需要決定在哪里設(shè)置閾值來表示「在什么概率下我說是 1 類還是 0 類?」。
你可以研究的其他指標(biāo)是 F1 指標(biāo)或平均召回率/精確度,這些也很有趣。
Haebichan Jung:Scikit-learn 包中是否有其他工具或功能讓你覺得使用不足或被低估?
Andreas Muller:有一個功能還沒被充分利用,因為它還是很新的,它就是 Hist 梯度增強(qiáng)。這是 LightGBM 的根的實現(xiàn),因此比以前的梯度增強(qiáng)實現(xiàn)快得多。它比 XGBoost 稍快,比 LightGBM 稍慢。目前它還不能支持缺失值的處理,但這個功能將很快在 2 周后的下一個版本中發(fā)布。它也不支持分類變量,這個功能將在明年春天左右發(fā)布。
Haebichan Jung:你提到 LightGBM 很有意思,因為越來越多基于 python 的 ML 庫正在發(fā)布,比如 Catboost,還有像 Pythorch 這樣的深度學(xué)習(xí)框架。你覺得這些在 ML 領(lǐng)域成長的玩家怎么樣?這種現(xiàn)象是競爭的反應(yīng)嗎?
Andreas Muller:我認(rèn)為在大多數(shù)情況下,多元化是好的。其中大多數(shù)框架提供了類似于 Scikit-learn 的接口,因此與我們的包兼容。由于 Scikit-learn 的應(yīng)用非常廣泛,所以開發(fā)速度很慢。我們可以看到,XGBoost 和 LightGBM 對人們來說非常有價值。因此,我們希望每個人都知道這一點,我們希望包括在 Scikit-learn 中的包能夠接觸到更廣泛的受眾。
對于深度學(xué)習(xí)庫來說,一部分原因是它們可以更快地移動,因為我們移動得太慢了。當(dāng)然還有兩件事需要注意:
1.與谷歌或 Facebook 相比,我們的資源真的很少,所以和那些公司的工程師競爭是沒有意義的。我認(rèn)為 Keras 真的很酷,我沒有理由在 Scikit-learn 中重新實現(xiàn)這樣的東西。
2.技術(shù)原因?,F(xiàn)在,要在不同的平臺上無縫地實現(xiàn) GPU 支持仍然很困難。你可以在 Tensorflow 中看到這一點。Tensorflow 上有不同的版本,針對不同的架構(gòu)進(jìn)行編譯,你必須自己編譯。我們不會在 Scikit-learn 增加這么多麻煩。
Haebichan Jung:你在哥倫比亞大學(xué)關(guān)于不平衡數(shù)據(jù)的講座中說過,這個問題有兩個主要的解決方案:1)在改變數(shù)據(jù)后建立模型(欠采樣/過采樣)和 2)改變模型(訓(xùn)練程序本身)。每種策略的優(yōu)缺點是什么,尤其是在 Scikit-learn 方面?
Andreas Muller:我想從你的問題中退一步,再次提到最重要的是指標(biāo)以及你如何評估它。你的目標(biāo)是什么?你的目標(biāo)絕不是精確,也絕不是 ROC-AUC。這不是你做應(yīng)用的目的。你應(yīng)該考慮在應(yīng)用程序的上下文中生成特定結(jié)果意味著什么。
一旦有了這個目標(biāo),你就可以定義度量,嘗試不同的方法來最大化這些度量。重采樣非常吸引人的地方在于,你經(jīng)??梢話伋龃罅繑?shù)據(jù),卻不會真正影響結(jié)果。如果你有 1:1000+ 的比率,你不想把它低估到 1:1,那么你可以設(shè)置成 1:100 或 1:10,你可以得到完全相同的結(jié)果。這樣你的數(shù)據(jù)集減少了 100 倍。
「你的目標(biāo)絕不是精確,也絕不是 ROC-AUC。這不是你做應(yīng)用的目的。你應(yīng)該考慮在應(yīng)用程序的上下文中生成特定結(jié)果意味著什么?!?br/>
所以如果你有大量的數(shù)據(jù)并且計算不是問題的話,欠采樣是更有效地得到類似結(jié)果的方法。相反,我并沒有真正看到人們在實踐中使用 SMOTE,這就是合成數(shù)據(jù)生成。人們經(jīng)常提到它,但我有點懷疑。
在改變模型方面,類權(quán)重是人們經(jīng)常使用且會有幫助的。類權(quán)重實際上改變了損失函數(shù),這樣就好像對少數(shù)類進(jìn)行了過采樣。所以你使用了所有的樣本,但是給了少數(shù)類更多的權(quán)重。這是人們發(fā)現(xiàn)的有用的東西。但是,這更像是嘗試不同的東西,并且你有正確的度量來衡量哪個解決方案最適合你的問題。
來自 Andreas Muller 的哥倫比亞系列講座
Haebichan Jung:有趣的是,你是以這種方式提到 SMOTE。在我的公司,我們一直在試驗 SMOTE。但就實際結(jié)果而言,在 AUC 或其他方面并沒有什么大的好處。而且,因為我正在創(chuàng)建所有這些合成數(shù)據(jù),它大大減慢了我的管道線。所以我想問你,你自己的懷疑是從哪里來的?
Andreas Muller:因為我和每個人說的都和你說的一模一樣。
Haebichan Jung:那你覺得這是為什么?
Andreas Muller:對我來說,機(jī)器學(xué)習(xí)中的很多東西都是經(jīng)驗性的。如果你在很多數(shù)據(jù)集上嘗試它,但它對你沒有幫助,那么它就是沒有幫助。很難說為什么梯度增強(qiáng)效果很好。我想大多數(shù)人都相信梯度增強(qiáng)效果很好,但我不認(rèn)為有人能正確解釋為什么梯度增強(qiáng)比支持向量機(jī)更有效。我認(rèn)為沒有人能用簡潔或有意義的方式來解釋。
就 SMOTE 而言,我認(rèn)為發(fā)生了兩件事:
1.我認(rèn)為 SMOTE 對數(shù)據(jù)的分布做出了假設(shè)。所以 A)要么假設(shè)相鄰樣本之間的直線是錯誤的; B)如果樣本太遠(yuǎn),并且中間有其他類的樣本,那么情況可能會打破。
2.可能是添加這些合成樣本實際上對你感興趣的模型類沒有幫助。
實際上,我和一個合作者有一個計劃,要寫一篇關(guān)于廣泛基準(zhǔn)的論文。正如你所說,為什么要嘗試使用 SMOTE?因為這是在驗證的文獻(xiàn)中提出的方法,但在實踐中,人們發(fā)現(xiàn)它并沒有多大作用。
關(guān)于完整的采訪,請觀看 YouTube 上的其他視頻,Andreas 將深入解讀解Scikit-learn 包:https://www.youtube.com/watch?v=6RSQIHAVzuo
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。