機(jī)器學(xué)習(xí)模型中特征貢獻(xiàn)度分析:預(yù)測貢獻(xiàn)與錯誤貢獻(xiàn)
在機(jī)器學(xué)習(xí)領(lǐng)域,特征重要性分析是一種廣泛應(yīng)用的模型解釋工具。但是特征重要性并不等同于特征質(zhì)量。本文將探討特征重要性與特征有效性之間的關(guān)系,并引入兩個關(guān)鍵概念:預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度。
核心概念
- 預(yù)測貢獻(xiàn)度:衡量特征在模型預(yù)測中的權(quán)重,反映模型在訓(xùn)練集上識別的模式。這與傳統(tǒng)的特征重要性概念相似。
- 錯誤貢獻(xiàn)度:衡量特征在模型在驗(yàn)證集上產(chǎn)生錯誤時的權(quán)重。這更能反映特征在新數(shù)據(jù)上的泛化能力。
本文將詳細(xì)闡述這兩個概念的計算方法,并通過實(shí)例展示基于錯誤貢獻(xiàn)度的特征選擇如何優(yōu)于傳統(tǒng)的基于預(yù)測貢獻(xiàn)度的方法。
基礎(chǔ)概念示例
考慮一個二元分類問題:預(yù)測個人年收入是否超過10萬美元。假設(shè)我們已有模型預(yù)測結(jié)果:
預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度的計算主要基于兩個要素:
- 模型對每個樣本的預(yù)測誤差
- 每個樣本的SHAP(SHapley Additive exPlanations)值
接下來,我們將深入探討這兩個關(guān)鍵問題:
- 分類模型中應(yīng)采用何種誤差度量?
- 如何處理分類模型中的SHAP值?
分類模型中的錯誤度量選擇
在分類模型中,選擇合適的誤差度量至關(guān)重要。我們需要一個能在樣本級別計算并可在整個數(shù)據(jù)集上聚合的度量指標(biāo)。
對數(shù)損失(又稱交叉熵)是分類問題中常用的損失函數(shù),其數(shù)學(xué)表達(dá)式如下:
對數(shù)損失適合我們的需求,因?yàn)椋?/span>
- 公式外部是簡單的平均操作
- 作為損失函數(shù),其值越低越好,符合誤差的概念
為了更直觀地理解對數(shù)損失,我們可以關(guān)注單個樣本的貢獻(xiàn):
在二元分類問題中,y只能取0或1,因此可以簡化為:
通過可視化可以更好地理解對數(shù)損失的特性:
預(yù)測概率越偏離真實(shí)值(0或1),損失越大。且當(dāng)預(yù)測嚴(yán)重偏離時(如預(yù)測0.2而實(shí)際為1,或預(yù)測0.8而實(shí)際為0),損失增長速度超過線性。
以下是計算單樣本對數(shù)損失的Python實(shí)現(xiàn):
def individual_log_loss(y_true, y_pred, eps=1e-15):
"""計算單個樣本的對數(shù)損失"""
y_pred = np.clip(y_pred, eps, 1 - eps)
return -y_true * np.log(y_pred) - (1 - y_true) * np.log(1 - y_pred)
應(yīng)用到我們的示例數(shù)據(jù)集:
可以觀察到,樣本1和2的對數(shù)損失較小,因?yàn)轭A(yù)測接近實(shí)際值;而樣本0的對數(shù)損失較大。
分類模型中SHAP值的處理方法
在樹模型(如XGBoost、LightGBM和CatBoost)中,計算SHAP值相對簡單:
from shap import TreeExplainer
shap_explainer = TreeExplainer(model)
shap_values = shap_explainer.shap_values(X)
假設(shè)我們得到以下SHAP值:
SHAP值的基本解釋:
- 正值表示該特征增加了預(yù)測概率
- 負(fù)值表示該特征降低了預(yù)測概率
SHAP值之和與模型預(yù)測直接相關(guān),但并不等于預(yù)測概率(介于0和1之間)。所以我們需要一個函數(shù)將SHAP值之和轉(zhuǎn)換為概率,該函數(shù)應(yīng)滿足:
- 將任意實(shí)數(shù)映射到[0,1]區(qū)間
- 嚴(yán)格單調(diào)遞增
Sigmoid函數(shù)滿足這些要求。因此模型對特定樣本的預(yù)測概率等于該樣本SHAP值之和的Sigmoid函數(shù)值。
Sigmoid函數(shù)圖像:
Python實(shí)現(xiàn):
def shap_sum2proba(shap_sum):
"""將SHAP值之和轉(zhuǎn)換為預(yù)測概率"""
return 1 / (1 + np.exp(-shap_sum))
下圖示例中的樣本在Sigmoid曲線上的位置:
接下來,我們將詳細(xì)討論預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度的計算方法。
預(yù)測貢獻(xiàn)度的計算
預(yù)測貢獻(xiàn)度反映了特征對模型最終預(yù)測的影響程度。當(dāng)一個特征的SHAP值絕對值較大時,表明該特征對預(yù)測結(jié)果有顯著影響。因此可以通過計算特征SHAP值的絕對值平均來量化預(yù)測貢獻(xiàn)度。
實(shí)現(xiàn)代碼如下:
prediction_contribution = shap_values.abs().mean()
應(yīng)用到我們的示例數(shù)據(jù)集,得到以下結(jié)果:
從結(jié)果可以看出,就特征重要性而言,job是最主要的特征,其次是nationality,然后是age。
錯誤貢獻(xiàn)度的計算
錯誤貢獻(xiàn)度旨在評估移除某個特征后模型錯誤的變化。利用SHAP值,我們可以模擬特征缺失的情況:從SHAP值總和中減去特定特征的SHAP值,然后應(yīng)用Sigmoid函數(shù),即可得到模型在缺少該特征時的預(yù)測概率。
實(shí)現(xiàn)代碼如下:
y_pred_wo_feature = shap_values.apply(lambda feature: shap_values.sum(axis=1) - feature).applymap(shap_sum2proba)
應(yīng)用到示例數(shù)據(jù)集的結(jié)果:
解讀結(jié)果:
- 如果沒有job特征,模型對三個樣本的預(yù)測概率分別為71%、62%和73%。
- 如果沒有nationality特征,預(yù)測概率分別為13%、95%和0%。
可以看出,預(yù)測結(jié)果對特征的依賴程度各不相同。接下來我們計算移除特征后的對數(shù)損失:
ind_log_loss_wo_feature = y_pred_wo_feature.apply(lambda feature: individual_log_loss(y_true=y_true, y_pred=feature))
結(jié)果如下:
對第一個樣本而言,移除job特征會導(dǎo)致對數(shù)損失增加到1.24,而移除nationality特征只會使對數(shù)損失增加到0.13。
為了評估特征的影響,我們可以計算完整模型的對數(shù)損失與移除特征后對數(shù)損失的差值:
ind_log_loss = individual_log_loss(y_true=y_true, y_pred=y_pred)
ind_log_loss_diff = ind_log_loss_wo_feature.apply(lambda feature: ind_log_loss - feature)
結(jié)果如下:
結(jié)果解讀如下:
- 負(fù)值表示特征的存在減少了預(yù)測錯誤,對該樣本有積極影響。
- 正值表示特征的存在增加了預(yù)測錯誤,對該樣本有消極影響。
最后計算每個特征的錯誤貢獻(xiàn)度,即這些差值的平均值:
error_contribution = ind_log_loss_diff.mean()
結(jié)果如下:
結(jié)果解讀:
- 負(fù)值表示特征總體上有積極影響,減少了模型的平均錯誤。
- 正值表示特征總體上有消極影響,增加了模型的平均錯誤。
在這個例子中,job特征的存在平均減少了0.897的對數(shù)損失,而nationality特征的存在平均增加了0.049的對數(shù)損失。盡管nationality是第二重要的特征(根據(jù)預(yù)測貢獻(xiàn)度),但它實(shí)際上略微降低了模型性能。
實(shí)際數(shù)據(jù)集應(yīng)用案例
我們將使用一個名為"Gold"的金融時間序列數(shù)據(jù)集來演示這些概念的實(shí)際應(yīng)用。該數(shù)據(jù)集來源于Pycaret庫。
特征說明:
- 所有特征都表示為百分比回報率
- 特征包括金融資產(chǎn)在觀察時刻前22、14、7和1天的回報率(分別標(biāo)記為"T-22"、"T-14"、"T-7"、"T-1")
完整的預(yù)測特征列表如下:
總共有120個特征。
預(yù)測目標(biāo):預(yù)測22天后黃金回報率是否會超過5%。因此,這是一個二元分類問題:
- 0:22天后黃金回報率小于或等于5%
- 1:22天后黃金回報率大于5%
實(shí)驗(yàn)步驟:
- 隨機(jī)劃分?jǐn)?shù)據(jù)集:33%用于訓(xùn)練,33%用于驗(yàn)證,34%用于測試。
- 使用訓(xùn)練集訓(xùn)練LightGBM分類器。
- 在訓(xùn)練、驗(yàn)證和測試集上進(jìn)行預(yù)測。
- 使用SHAP庫計算各數(shù)據(jù)集的SHAP值。
- 計算每個特征在各數(shù)據(jù)集上的預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度。
分析結(jié)果:
圖:驗(yàn)證集上的預(yù)測貢獻(xiàn)度vs錯誤貢獻(xiàn)度
主要發(fā)現(xiàn):
- 美國債券ETF在T-22時點(diǎn)是最重要的特征,但它并未帶來顯著的錯誤減少。
- 3個月Libor在T-22時點(diǎn)是最有效的特征,因?yàn)樗畲蟪潭鹊販p少了錯誤。
- 玉米價格在T-1和T-22時點(diǎn)都是重要特征,但T-1時點(diǎn)的特征存在過擬合現(xiàn)象(增加了預(yù)測錯誤)。
- 總體而言,T-1或T-14時點(diǎn)的特征錯誤貢獻(xiàn)度較高,而T-22時點(diǎn)的特征錯誤貢獻(xiàn)度較低。這表明較近期的特征可能更容易導(dǎo)致過擬合,而較早期的特征可能具有更好的泛化能力。
這些發(fā)現(xiàn)為我們提供了寶貴的模型洞察,并為特征選擇提供了新的思路。下一節(jié)我們將探討如何利用錯誤貢獻(xiàn)度進(jìn)行特征選擇。
驗(yàn)證:基于錯誤貢獻(xiàn)度的遞歸特征消除
遞歸特征消除(Recursive Feature Elimination,RFE)是一種迭代式特征選擇方法,通過逐步移除特征來優(yōu)化模型性能。本節(jié)將比較基于預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度的RFE方法。
RFE算法概述:
- 初始化特征集
- 使用當(dāng)前特征集訓(xùn)練模型
- 評估各特征的重要性或貢獻(xiàn)度
- 移除"最差"特征
- 重復(fù)步驟2-4,直到達(dá)到預(yù)定的特征數(shù)量或性能標(biāo)準(zhǔn)
傳統(tǒng)RFE vs. 基于錯誤貢獻(xiàn)度的RFE:
- 傳統(tǒng)RFE:移除預(yù)測貢獻(xiàn)度最低的特征
- 基于錯誤貢獻(xiàn)度的RFE:移除錯誤貢獻(xiàn)度最高的特征
實(shí)驗(yàn)結(jié)果
驗(yàn)證集上的對數(shù)損失比較:
基于錯誤貢獻(xiàn)度的RFE在驗(yàn)證集上顯著優(yōu)于傳統(tǒng)RFE。
測試集上的對數(shù)損失比較:
盡管差異相對減小,但基于錯誤貢獻(xiàn)度的RFE在測試集上仍然優(yōu)于傳統(tǒng)RFE,證明了其更好的泛化能力。
驗(yàn)證集上的平均精度比較:
盡管錯誤貢獻(xiàn)度是基于對數(shù)損失計算的,但在平均精度這一不同的評估指標(biāo)上,基于錯誤貢獻(xiàn)度的RFE仍然表現(xiàn)出色。
根據(jù)驗(yàn)證集性能,我們選擇:
- 基于錯誤貢獻(xiàn)度的RFE:19個特征的模型
- 基于預(yù)測貢獻(xiàn)度的RFE:14個特征的模型
測試集上的平均精度比較:
最終結(jié)果:
- 基于錯誤貢獻(xiàn)度的RFE(19個特征):72.8%的平均精度
- 基于預(yù)測貢獻(xiàn)度的RFE(14個特征):65.6%的平均精度
基于錯誤貢獻(xiàn)度的RFE在測試集上獲得了7.2個百分點(diǎn)的性能提升,這是一個顯著的改進(jìn)。
總結(jié)
本研究深入探討了機(jī)器學(xué)習(xí)模型中特征重要性的概念,并提出了區(qū)分特征重要性和特征有效性的新方法。
- 引入了預(yù)測貢獻(xiàn)度和錯誤貢獻(xiàn)度兩個概念,為特征評估提供了新的視角。
- 詳細(xì)闡述了基于SHAP值計算這兩種貢獻(xiàn)度的方法,為實(shí)踐應(yīng)用提供了可操作的指導(dǎo)。
- 通過金融數(shù)據(jù)集的案例分析,展示了錯誤貢獻(xiàn)度在特征選擇中的實(shí)際應(yīng)用價值。
- 證明了基于錯誤貢獻(xiàn)度的遞歸特征消除方法可以顯著提高模型性能,在測試集上實(shí)現(xiàn)了7.2%的平均精度提升。
通過深入理解特征的預(yù)測貢獻(xiàn)和錯誤貢獻(xiàn),數(shù)據(jù)科學(xué)家可以構(gòu)建更加穩(wěn)健和高效的機(jī)器學(xué)習(xí)模型,為決策制定提供更可靠的支持。