機器學習模型中特征貢獻度分析:預測貢獻與錯誤貢獻
在機器學習領域,特征重要性分析是一種廣泛應用的模型解釋工具。但是特征重要性并不等同于特征質量。本文將探討特征重要性與特征有效性之間的關系,并引入兩個關鍵概念:預測貢獻度和錯誤貢獻度。
核心概念
- 預測貢獻度:衡量特征在模型預測中的權重,反映模型在訓練集上識別的模式。這與傳統的特征重要性概念相似。
- 錯誤貢獻度:衡量特征在模型在驗證集上產生錯誤時的權重。這更能反映特征在新數據上的泛化能力。
本文將詳細闡述這兩個概念的計算方法,并通過實例展示基于錯誤貢獻度的特征選擇如何優于傳統的基于預測貢獻度的方法。
基礎概念示例
考慮一個二元分類問題:預測個人年收入是否超過10萬美元。假設我們已有模型預測結果:

預測貢獻度和錯誤貢獻度的計算主要基于兩個要素:
- 模型對每個樣本的預測誤差
- 每個樣本的SHAP(SHapley Additive exPlanations)值
接下來,我們將深入探討這兩個關鍵問題:
- 分類模型中應采用何種誤差度量?
- 如何處理分類模型中的SHAP值?
分類模型中的錯誤度量選擇
在分類模型中,選擇合適的誤差度量至關重要。我們需要一個能在樣本級別計算并可在整個數據集上聚合的度量指標。
對數損失(又稱交叉熵)是分類問題中常用的損失函數,其數學表達式如下:

對數損失適合我們的需求,因為:
- 公式外部是簡單的平均操作
- 作為損失函數,其值越低越好,符合誤差的概念
為了更直觀地理解對數損失,我們可以關注單個樣本的貢獻:

在二元分類問題中,y只能取0或1,因此可以簡化為:

通過可視化可以更好地理解對數損失的特性:

預測概率越偏離真實值(0或1),損失越大。且當預測嚴重偏離時(如預測0.2而實際為1,或預測0.8而實際為0),損失增長速度超過線性。
以下是計算單樣本對數損失的Python實現:
def individual_log_loss(y_true, y_pred, eps=1e-15):
"""計算單個樣本的對數損失"""
y_pred = np.clip(y_pred, eps, 1 - eps)
return -y_true * np.log(y_pred) - (1 - y_true) * np.log(1 - y_pred)應用到我們的示例數據集:

可以觀察到,樣本1和2的對數損失較小,因為預測接近實際值;而樣本0的對數損失較大。
分類模型中SHAP值的處理方法
在樹模型(如XGBoost、LightGBM和CatBoost)中,計算SHAP值相對簡單:
from shap import TreeExplainer
shap_explainer = TreeExplainer(model)
shap_values = shap_explainer.shap_values(X)假設我們得到以下SHAP值:

SHAP值的基本解釋:
- 正值表示該特征增加了預測概率
- 負值表示該特征降低了預測概率
SHAP值之和與模型預測直接相關,但并不等于預測概率(介于0和1之間)。所以我們需要一個函數將SHAP值之和轉換為概率,該函數應滿足:
- 將任意實數映射到[0,1]區間
- 嚴格單調遞增
Sigmoid函數滿足這些要求。因此模型對特定樣本的預測概率等于該樣本SHAP值之和的Sigmoid函數值。

Sigmoid函數圖像:

Python實現:
def shap_sum2proba(shap_sum):
"""將SHAP值之和轉換為預測概率"""
return 1 / (1 + np.exp(-shap_sum))下圖示例中的樣本在Sigmoid曲線上的位置:

接下來,我們將詳細討論預測貢獻度和錯誤貢獻度的計算方法。
預測貢獻度的計算
預測貢獻度反映了特征對模型最終預測的影響程度。當一個特征的SHAP值絕對值較大時,表明該特征對預測結果有顯著影響。因此可以通過計算特征SHAP值的絕對值平均來量化預測貢獻度。
實現代碼如下:
prediction_contribution = shap_values.abs().mean()應用到我們的示例數據集,得到以下結果:

從結果可以看出,就特征重要性而言,job是最主要的特征,其次是nationality,然后是age。
錯誤貢獻度的計算
錯誤貢獻度旨在評估移除某個特征后模型錯誤的變化。利用SHAP值,我們可以模擬特征缺失的情況:從SHAP值總和中減去特定特征的SHAP值,然后應用Sigmoid函數,即可得到模型在缺少該特征時的預測概率。
實現代碼如下:
y_pred_wo_feature = shap_values.apply(lambda feature: shap_values.sum(axis=1) - feature).applymap(shap_sum2proba)應用到示例數據集的結果:

解讀結果:
- 如果沒有job特征,模型對三個樣本的預測概率分別為71%、62%和73%。
- 如果沒有nationality特征,預測概率分別為13%、95%和0%。
可以看出,預測結果對特征的依賴程度各不相同。接下來我們計算移除特征后的對數損失:
ind_log_loss_wo_feature = y_pred_wo_feature.apply(lambda feature: individual_log_loss(y_true=y_true, y_pred=feature))結果如下:

對第一個樣本而言,移除job特征會導致對數損失增加到1.24,而移除nationality特征只會使對數損失增加到0.13。
為了評估特征的影響,我們可以計算完整模型的對數損失與移除特征后對數損失的差值:
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)結果如下:

結果解讀如下:
- 負值表示特征的存在減少了預測錯誤,對該樣本有積極影響。
- 正值表示特征的存在增加了預測錯誤,對該樣本有消極影響。
最后計算每個特征的錯誤貢獻度,即這些差值的平均值:
error_contribution = ind_log_loss_diff.mean()結果如下:

結果解讀:
- 負值表示特征總體上有積極影響,減少了模型的平均錯誤。
- 正值表示特征總體上有消極影響,增加了模型的平均錯誤。
在這個例子中,job特征的存在平均減少了0.897的對數損失,而nationality特征的存在平均增加了0.049的對數損失。盡管nationality是第二重要的特征(根據預測貢獻度),但它實際上略微降低了模型性能。
實際數據集應用案例
我們將使用一個名為"Gold"的金融時間序列數據集來演示這些概念的實際應用。該數據集來源于Pycaret庫。

特征說明:
- 所有特征都表示為百分比回報率
- 特征包括金融資產在觀察時刻前22、14、7和1天的回報率(分別標記為"T-22"、"T-14"、"T-7"、"T-1")
完整的預測特征列表如下:

總共有120個特征。
預測目標:預測22天后黃金回報率是否會超過5%。因此,這是一個二元分類問題:
- 0:22天后黃金回報率小于或等于5%
- 1:22天后黃金回報率大于5%

實驗步驟:
- 隨機劃分數據集:33%用于訓練,33%用于驗證,34%用于測試。
- 使用訓練集訓練LightGBM分類器。
- 在訓練、驗證和測試集上進行預測。
- 使用SHAP庫計算各數據集的SHAP值。
- 計算每個特征在各數據集上的預測貢獻度和錯誤貢獻度。
分析結果:
圖:驗證集上的預測貢獻度vs錯誤貢獻度
主要發現:
- 美國債券ETF在T-22時點是最重要的特征,但它并未帶來顯著的錯誤減少。
- 3個月Libor在T-22時點是最有效的特征,因為它最大程度地減少了錯誤。
- 玉米價格在T-1和T-22時點都是重要特征,但T-1時點的特征存在過擬合現象(增加了預測錯誤)。
- 總體而言,T-1或T-14時點的特征錯誤貢獻度較高,而T-22時點的特征錯誤貢獻度較低。這表明較近期的特征可能更容易導致過擬合,而較早期的特征可能具有更好的泛化能力。
這些發現為我們提供了寶貴的模型洞察,并為特征選擇提供了新的思路。下一節我們將探討如何利用錯誤貢獻度進行特征選擇。
驗證:基于錯誤貢獻度的遞歸特征消除
遞歸特征消除(Recursive Feature Elimination,RFE)是一種迭代式特征選擇方法,通過逐步移除特征來優化模型性能。本節將比較基于預測貢獻度和錯誤貢獻度的RFE方法。
RFE算法概述:
- 初始化特征集
- 使用當前特征集訓練模型
- 評估各特征的重要性或貢獻度
- 移除"最差"特征
- 重復步驟2-4,直到達到預定的特征數量或性能標準
傳統RFE vs. 基于錯誤貢獻度的RFE:
- 傳統RFE:移除預測貢獻度最低的特征
- 基于錯誤貢獻度的RFE:移除錯誤貢獻度最高的特征
實驗結果
驗證集上的對數損失比較:

基于錯誤貢獻度的RFE在驗證集上顯著優于傳統RFE。
測試集上的對數損失比較:

盡管差異相對減小,但基于錯誤貢獻度的RFE在測試集上仍然優于傳統RFE,證明了其更好的泛化能力。
驗證集上的平均精度比較:

盡管錯誤貢獻度是基于對數損失計算的,但在平均精度這一不同的評估指標上,基于錯誤貢獻度的RFE仍然表現出色。
根據驗證集性能,我們選擇:
- 基于錯誤貢獻度的RFE:19個特征的模型
- 基于預測貢獻度的RFE:14個特征的模型
測試集上的平均精度比較:

最終結果:
- 基于錯誤貢獻度的RFE(19個特征):72.8%的平均精度
- 基于預測貢獻度的RFE(14個特征):65.6%的平均精度
基于錯誤貢獻度的RFE在測試集上獲得了7.2個百分點的性能提升,這是一個顯著的改進。
總結
本研究深入探討了機器學習模型中特征重要性的概念,并提出了區分特征重要性和特征有效性的新方法。
- 引入了預測貢獻度和錯誤貢獻度兩個概念,為特征評估提供了新的視角。
- 詳細闡述了基于SHAP值計算這兩種貢獻度的方法,為實踐應用提供了可操作的指導。
- 通過金融數據集的案例分析,展示了錯誤貢獻度在特征選擇中的實際應用價值。
- 證明了基于錯誤貢獻度的遞歸特征消除方法可以顯著提高模型性能,在測試集上實現了7.2%的平均精度提升。
通過深入理解特征的預測貢獻和錯誤貢獻,數據科學家可以構建更加穩健和高效的機器學習模型,為決策制定提供更可靠的支持。




























