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