你真的對(duì)你構(gòu)建的ML模型足夠了解么?!
點(diǎn)擊以上,盡在AI中國(guó)
我們真的知道我們建立的ML模型中發(fā)生了什么嗎?我們來(lái)探索一下。
在我之前的博客中,我們看到了對(duì)XGBoost、LightGBM和Catboost的對(duì)比研究。通過(guò)這種分析,我們得出結(jié)論,catboost在速度和準(zhǔn)確性上優(yōu)于其他兩種。在這一部分中,我們將深入討論catboost,并探索catboost為高效建模和理解超參數(shù)提供的新功能。
對(duì)于新讀者,catboost是Yandex團(tuán)隊(duì)在2017年開發(fā)的開源梯度增強(qiáng)算法。它是一種機(jī)器學(xué)習(xí)算法,允許用戶快速處理大數(shù)據(jù)集的分類特征,不同于XGBoost和LightGBM。Catboost可用于解決回歸、分類和排序問(wèn)題。
作為數(shù)據(jù)科學(xué)家,我們可以很容易地訓(xùn)練模型并做出預(yù)測(cè),但我們往往無(wú)法理解這些奇怪的算法中發(fā)生了什么。這也是為什么我們看到離線評(píng)測(cè)和最終生產(chǎn)的模型性能存在巨大差異的原因之一?,F(xiàn)在我們應(yīng)該停止將ML視為“黑箱”,在提高模型準(zhǔn)確性的同時(shí),關(guān)注模型解釋。這也有助于我們識(shí)別數(shù)據(jù)偏差。在本節(jié)中,我們將了解catboost如何通過(guò)以下函數(shù)幫助我們分析模型并提高可見(jiàn)性:
特征重要性
你為什么想知道它?刪除不必要的特征以簡(jiǎn)化模型和縮短訓(xùn)練/預(yù)測(cè)時(shí)間,獲得對(duì)您的目標(biāo)值最有影響的函數(shù)并操縱它們以獲得商業(yè)利益(例如,醫(yī)療醫(yī)療保健提供商希望確定哪些因素會(huì)導(dǎo)致每個(gè)患者患某些疾病的風(fēng)險(xiǎn),以便他們可以通過(guò)靶向藥物直接解決這些風(fēng)險(xiǎn)因素)。
除了選擇特征重要性的類型,我們還應(yīng)該知道我們想要使用哪些數(shù)據(jù)來(lái)發(fā)現(xiàn)特征重要性——訓(xùn)練、測(cè)試或完成數(shù)據(jù)集。選擇一個(gè)對(duì)另一個(gè)有利有弊,但是最后你需要決定你是想知道模型在多大程度上依賴于每個(gè)特征來(lái)預(yù)測(cè)(使用訓(xùn)練數(shù)據(jù))還是該特征對(duì)性能的貢獻(xiàn)程度以及模型對(duì)看不見(jiàn)的數(shù)據(jù)的影響(使用測(cè)試數(shù)據(jù))。正如我們將在后面看到的,只有一些方法可用于發(fā)現(xiàn)不用于訓(xùn)練模型的數(shù)據(jù)的特征重要性。
如果你關(guān)心第二個(gè),并假設(shè)你有所有的時(shí)間和資源,找出特征重要性的最原始和可靠的方法是訓(xùn)練多個(gè)模型,一次留下一個(gè)特征,并在測(cè)試集上比較性能。如果性能從基線(我們使用所有函數(shù)時(shí)的性能)變化很大,說(shuō)明這個(gè)特性非常重要。但是,因?yàn)槲覀兩钤谝粋€(gè)需要優(yōu)化精度和計(jì)算時(shí)間的實(shí)際環(huán)境中,所以這種方法是不必要的。以下是一些智能方法,其中catboost可以幫助您找到最適合您的模型的函數(shù):
CB . get _ feature _ importance(type = " _ _ _ _ _ _ ")
“類型”可能值:
-預(yù)測(cè)值更改
-損失功能變化
-功能重要性
預(yù)測(cè)值更改非排名指標(biāo)和損失函數(shù)更改排名指標(biāo)
-形狀值
計(jì)算每個(gè)對(duì)象的SHAP值
-互動(dòng)
計(jì)算每個(gè)特征之間的成對(duì)得分
預(yù)測(cè)值變化
對(duì)于每個(gè)特征,PredictionValuesChange顯示了特征值變化時(shí)預(yù)測(cè)的平均變化程度。重要性值越大,平均值越大。如果這個(gè)特性改變了,預(yù)測(cè)值也會(huì)改變。
優(yōu)點(diǎn):計(jì)算成本低,因?yàn)椴恍枰啻斡?xùn)練或測(cè)試,不會(huì)存儲(chǔ)任何額外的信息。您將得到標(biāo)準(zhǔn)化的值作為輸出(所有的重要性加起來(lái)為100)。
缺點(diǎn):可能會(huì)給排名目標(biāo)帶來(lái)誤導(dǎo)性的結(jié)果,可能會(huì)把groupwise的特性放在最前面,即使它們對(duì)最終的損失值有一點(diǎn)影響。
損失函數(shù)損失函數(shù)變化
為了獲得該特征的重要性,catboost簡(jiǎn)單地采用在正常條件下(當(dāng)我們包括該特征時(shí))使用該模型獲得的度量(損失函數(shù))和沒(méi)有該特征的模型之間的差異。差異越大,特征越重要。在catboost文檔中,沒(méi)有明確提到如何找到?jīng)]有特征的模型。
優(yōu)缺點(diǎn):這對(duì)于大部分題型都很有效,不同于預(yù)測(cè)值的變化。在這種情況下,你可以得到排名問(wèn)題的誤導(dǎo)性結(jié)果,同時(shí),它的計(jì)算量很大。
形狀值
https://github.com/slundberg/shap
SHAP值將預(yù)測(cè)值分解為每個(gè)元素的貢獻(xiàn)。它測(cè)量特征對(duì)單個(gè)預(yù)測(cè)值的影響,并比較基線預(yù)測(cè)(訓(xùn)練數(shù)據(jù)集的目標(biāo)值的平均值)。
shap值的兩個(gè)主要使用案例:
1.特征的對(duì)象級(jí)貢獻(xiàn)
shap _ values = model . get _ feature _ importance(Pool(X _ test,label=y_test,cat _ features = category _ features _ indexes),
type="ShapValues ")
expected_value = shap_values[0,-1]
形狀值=形狀值[:,:-1]
shap.initjs()
shap.force_plot(expected_value,shap_values[3,:,X_test.iloc[3,:))
https://github.com/slundberg/shap
2.整個(gè)數(shù)據(jù)集的概要(整體特征重要性)
形狀摘要圖(形狀值,X測(cè)試)
雖然我們可以通過(guò)shap得到準(zhǔn)確的特征重要度,但是它們?cè)谟?jì)算上比catboost內(nèi)置的特征重要度更昂貴。
捕獲賞金
基于相同概念但不同實(shí)現(xiàn)的另一個(gè)特征重要性是基于排列的特征重要性。Catboost不使用,純模型無(wú)關(guān),計(jì)算簡(jiǎn)單。
我們?nèi)绾芜x擇?
雖然PredictionValuesChange和losfunctionchange都可以用于所有類型的指標(biāo),但建議使用losfunctionchange對(duì)指標(biāo)進(jìn)行排序。除了PredictionValuesChange,其他所有方法都可以使用測(cè)試數(shù)據(jù),并使用根據(jù)訓(xùn)練數(shù)據(jù)訓(xùn)練的模型來(lái)查找特征重要性。
為了更好地理解這些差異,下面是我們討論的所有方法的結(jié)果:
catboost功能的結(jié)果。從經(jīng)典的“成人”人口普查數(shù)據(jù)集中預(yù)測(cè)人們是否會(huì)上報(bào)5萬(wàn)美元以上的收入(使用對(duì)數(shù)損失)。
從上圖可以看出,大多數(shù)方法都符合頂層特性??雌饋?lái)LossFunctionChange最接近shap(更可靠)。但是直接比較這些方法是不公平的,因?yàn)轭A(yù)測(cè)值的變化是基于訓(xùn)練數(shù)據(jù)的,而其他方法都是基于測(cè)試數(shù)據(jù)的。
我們還應(yīng)該看到運(yùn)行所有這些所需的時(shí)間:
互相地
有了這個(gè)參數(shù),就可以求出一對(duì)元素的強(qiáng)弱(兩個(gè)元素的重要性)。
在輸出中,您將獲得每對(duì)特征的列表。該列表將有三個(gè)值,第一個(gè)值是該對(duì)中第一個(gè)元素的索引,第二個(gè)值是該對(duì)中第二個(gè)元素的索引,第三個(gè)值是該對(duì)的要素重要性分?jǐn)?shù)。請(qǐng)查看嵌入式筆記本了解實(shí)施詳情。
值得注意的是,單個(gè)特征重要性中的前兩個(gè)特征不一定是最強(qiáng)的一對(duì)。
筆記本
筆記本電腦中使用的數(shù)據(jù)集
對(duì)象重要性
你為什么想知道它?從訓(xùn)練數(shù)據(jù)中刪除最無(wú)用的訓(xùn)練對(duì)象。根據(jù)哪些新對(duì)象預(yù)計(jì)最“有用”,優(yōu)先給一批新對(duì)象做標(biāo)記,類似于主動(dòng)學(xué)習(xí)。
通過(guò)這個(gè)函數(shù),可以計(jì)算出每個(gè)對(duì)象對(duì)測(cè)試數(shù)據(jù)優(yōu)化指標(biāo)的影響。正值反映優(yōu)化指標(biāo)的增加,負(fù)值反映優(yōu)化指標(biāo)的減少。該方法是本文中描述的方法的實(shí)現(xiàn)。這些算法的細(xì)節(jié)超出了本文的范圍。
關(guān)于對(duì)象重要性的Catboost教程
cb.get_object_importance中有三種類型的update _ methods:single point:最快最不精確的方法TopKLeaves:指定葉子的個(gè)數(shù)。該值越高,計(jì)算越精確,速度越慢。AllPoints:最慢最準(zhǔn)確的方法。
例如,以下值將方法設(shè)置為TopKLeaves,并將葉數(shù)限制為3:
TopKLeaves:top= 3
模型分析圖
Catboost最近在其最新更新中引入了這一功能。有了這個(gè)函數(shù),我們將能夠可視化算法如何劃分每個(gè)特征的數(shù)據(jù),并查看特定于特征的統(tǒng)計(jì)數(shù)據(jù)。更具體地說(shuō),我們將能夠看到:每個(gè)bin的平均目標(biāo)值(bin用于連續(xù)函數(shù))或每個(gè)類別的平均預(yù)測(cè)值(目前僅支持OHE函數(shù));通過(guò)不同的特征值預(yù)測(cè)每個(gè)箱中的對(duì)象數(shù)量;對(duì)于每一個(gè)物體,特征值都是變化的,所以會(huì)落在某個(gè)區(qū)域。然后,模型根據(jù)新的特征值對(duì)目標(biāo)進(jìn)行預(yù)測(cè),得到預(yù)測(cè)在區(qū)域內(nèi)的平均值(由紅點(diǎn)給出)。
這個(gè)圖表將為我們提供信息,例如我們?nèi)绾纹骄指?我們不希望所有對(duì)象都進(jìn)入一個(gè)區(qū)域),我們的預(yù)測(cè)是否接近目標(biāo)(藍(lán)色和橙色線),紅線將告訴我們我們的預(yù)測(cè)有多敏感。
數(shù)字特征分析
單一熱編碼特征分析