为什么要停止过度使用置换重要性来寻找影响特征
數據分析師通常為了某些任務需要計算特征重要度。特征重要度可以幫助使用者了解數據中是否存在偏差或者模型中是否存在缺陷。并且特征重要度可用于理解底層流程和做出業務決策。模型最重要的特性可能會給我們進一步的特征工程提供靈感。
目前計算特征重要性的方法有很多種。其中一些方法基于特定的模型,例如線性回歸模型中的回歸系數、基于樹的模型中的增益重要性或神經網絡中的批處理范數參數(批處理參數通常用于NN pruning,即神經網絡剪枝壓縮)。其他一些方法是“通用的”,它們幾乎可以應用于任何模型: SHAP 值、置換重要性(permutaion importance)、刪除和重新學習方法(drop-and-relearn approach)等。
盡管機器學習模型的黑箱可解釋性是模型開發研究的一個重要組成部分,但是Harmanpreet等人的一項研究顯示,并非所有的數據分析師和科學家都知道如何正確地解釋模型。這些方法的有效性和易用性使得它們幾乎成為不二選擇。實際上,如果可以通過運行pip install lib, lib.explain(model)來解決問題,為什么還要費心具體的理論呢。
在這篇文章中,主要想要說明一個認知偏差,即過度使用置換重要性來尋找影響特征。本文將說明在某些情況下,置換重要性給出了錯誤的、誤導性的結果。
置換重要性(Permutation Importance)
置換重要性是一種常用的特征重要性類型。其核心思想在于:如果用隨機排列的值替換特征,會導致模型分數的下降。它是通過幾個簡單的步驟來計算的:
- (1) 置換訓練數據集中的第i個特征的值(feature_i),保持其它特征不變。生成置換后的訓練數據集(X_train_permuted);
- (2) 用第2步訓練好的模型以及X_train_permuted數據集進行預測(y_hat_permuted);
- (3)計算對應的準確度得分(score_permuted);
- (4)每個特征的置換重要性即為對應的差異系數(score_permuted - score)。
用于說明計算的代碼如下:
def calculate_permutation_importance(model,X: pd.DataFrame,y: pd.Series,scoring_function: Callable = sklearn.metrics.roc_auc_score,n_repeats: int = 3,seed: int = 42, ) -> Tuple[any, float, Dict[str, float], np.array]:"""Example of permutation importance calculation :param model: sklearn model, or any model with `fit` and `predict` methods:param X: input features:param y: input target:param scoring_function: function to use for scoring, should output single float value:param n_repeats: how many times make permutation:param seed: random state for experiment reproducibility:return:"""# step 1 - train modelmodel.fit(X, y)# step 2 - make predictions for train data and score (higher score - better)y_hat_no_shuffle = model.predict(X)score = scoring_function(*(y, y_hat_no_shuffle))# step 3 - calculate permutation importancefeatures = X.columnsitems = [(key, 0) for key in features]importances = collections.OrderedDict(items)for n in range(n_repeats):for col in features:# copy data to avoid using previously shuffled versionsX_temp = X.copy()# shuffle feature_i valuesX_temp[col] = X[col].sample(X.shape[0], replace=True, random_state=seed+n).values# make prediction for shuffled datasety_hat = model.predict(X_temp)# calculate scorescore_permuted = scoring_function(*(y, y_hat))# calculate delta score# better model <-> higher score# lower the delta -> more important the featuredelta_score = score_permuted - score# save resultimportances[col] += delta_score / n_repeatsimportances_values = np.array(list(importances.values()))importance_ranks = rank_array(importances_values)return model, score, importances, importance_ranks置換重要性很容易解釋、實現和使用。雖然計算需要對訓練數據進行n_features次預測,但與模型再訓練或精確SHAP值計算相比,置換重要性不需要大量的重新計算。此外,置換重要性允許選擇特征:如果置換數據集上的分數高于正常數據集,那么就表明應該刪除該特征并重新訓練模型。基于這些原因,置換重要性在許多機器學習項目中得到了廣泛的應用。
存在的問題
雖然置換重要性是一個非常有吸引力的模型解釋選擇,但它有幾個問題,特別是在特征具有一定相關性關系時。Giles Hooker和Lucas Mentch在他們的論文https://arxiv.org/abs/1905.03151中闡述如下:
對這一問題可能的解釋是模型的外推性能。假設模型是使用兩個高度正相關的特征x1和x2(下圖中的左圖)進行訓練的。為了計算特征x1的重要性,我們對特征進行隨機化處理,并對“隨機”點(中心圖上的紅色點)進行預測。但這個模型在左上角和右下角都沒有看到x1的任何訓練例子。因此,要做出預測,它必須外推到以前看不見的區域(右圖)。我們知道,所有模型的外推性能都很糟糕,因此做出了出乎意料的預測。這些“來自新區域的分數”強烈影響最終分數,當然也影響置換重要性。
圖1 置換重要性問題的一個直觀說明-未知區域Giles Hooker和Lucas Mentch提出了幾種替代方法來代替置換重要性:
測試
為了了解特征相關性對置換重要性和其他特征重要性方法的影響程度,本文進行了以下實驗。
測試方法
首先,生成一個具有指定數量的特性和樣本的正態分布數據集(n_features=50,n_samples=10000)。所有特征的平均值為0,標準差為1。所有的數據集特征通過最大相關度(max_correlation)相互關聯。
生成數據集后,為每個特征添加了均勻分布的噪聲。每個特征的噪聲量是從([-0.5noise_magnitude_max,0.5noise_magnitude_max],noise_magnitude_max=var)的均勻分布中隨機選擇的。這樣做是為了降低特征相關性。至此,特征就生成完畢了。
現在我們需要創建一個指標。對于每個特征,生成了一個權重,它是從具有指定gamma和scale參數(gamma=1,scale=1)的gamma分布中采樣的。選擇Gamma分布是因為它看起來非常類似于典型的特征重要性分布。然后將每個特征權重除以權重之和,使權重之和等于1。這樣做是為了減少隨機權重生成對最終結果的影響。
然后將指標設置為特征與相應特征權重的線性組合。
對于生成的數據集和目標,本文使用以下參數訓練了一個LightGBM模型:
learning_rate: 0.01 n_estimators: 100 random_state: 42所有其他參數均為默認值。并且使用內置的增益重要性、SHAP重要性和置換重要性算法來計算每個特征的重要性等級(置換重復五次,得分取平均值)。
然后計算特征的重要性與實際重要性之間的Spearman秩相關系數。實際重要性等于秩(-weights)。最佳可能的相關性系數為1.0,即特征重要性與實際重要性(特征權重)的順序相同。
每個實驗的數據(數據集統計相關性,模型重要性與內置增益重要性、SHAP重要性和置換重要性之間的Spearman秩相關系數)被保存以供進一步分析。這個實驗用不同的初始值,用不同的最大相關系數和噪聲幅值最大值組合(max_correlation,noise_magnitude_max)進行了50次試驗。也用“舍棄置換重要度”和“置換再訓練重要度”方法進行了同樣的實驗,但由于需要大量的計算,只進行了5次。
示例分析
為了直觀理解,接下來將拿一個實驗舉例說明。實驗的具體代碼可以在這里找到:示例實驗。實驗參數為:
TASK = "classification" OBJECTIVE = "binary" METRIC = roc_auc_score MU = 0 VAR = 1 N_FEATUES = 50 N_SAMPLES = 10_000 NOISE_MAGNITUDE_MAX = 1 SEED = 42生成數據集的相關矩陣的一部分:
圖3 部分特征數據集R2相關矩陣我們可以看到這些特征之間高度相關(平均絕對相關約為0.96)。相關統計:
圖4 特征數據集相關性的統計。abs_*前綴代表相關性的絕對值(注:數據集中的特征可以相互負相關和正相關)生成特征權重的分布:
圖5 實際特征權重分布。只有幾個特性是重要的計算的特征重要性和實際重要性之間的Spearman rank相關性:
Model's score [train data]: 0.9998 Permutation spearman corr: 0.5724 SHAP spearman corr: 0.4721 LGB gain spearman corr: 0.4567以及實際和計算特征重要性的圖示如下:
圖6 實際重要性和計算重要性,noise_magnitude_max=1我們可以在這里看到幾個問題(用綠色圓圈標記):
以下是對相同實驗參數的實際和計算的特征重要性排序的說明,noise_magnitude_max=10(abs_correlation_mean從0.96下降到0.36):
Model's score [train data]: 0.9663 Permutation spearman corr: 0.6430 SHAP spearman corr: 0.7139 LGB gain spearman corr: 0.6978 圖7 實際重要性和計算重要性,noise_magnitude_max=10仍然不是完美的,但是對于前十位重要特征排序效果良好。
實驗結果
本節介紹實驗以及對應結果。“permutaions vs SHAP vs Gain”實驗總共進行了1200次,而“permutaions vs Relearning”實驗則進行了120次。
permutaions vs SHAP vs Gain
在本小節中,將比較使用置換重要性、SHAP值和內置增益計算的特征重要性排序。
從下面的圖中,我們可以看到實際特征重要性與計算特征重要性(置換重要性、SHAP值、內置增益重要性)之間的相關性,正如預期的那樣,與特征相關性的平均值和最大值呈負相關。置換重要性受高度相關特征的影響最大。內置增益和SHAP計算的重要性沒有區別。
圖8 Spearman特征排序相關性=f(特征相關性平均值) 圖9 Spearman特征排序相關性=f(特征相關性最大值) 圖10 Spearman特征排序相關性=f(模型得分) 圖11 模型得分=f(特征相關性均值)此外,我們可以看到實際特征重要性和計算結果之間的相關性取決于模型的得分:得分越高,相關性越低(圖10)。目前還不清楚為什么會發生這種情況,但可以假設,更多的相關特征會導致更精確的模型(從圖11中可以看出),因為特征空間更密集,“未知”區域更少。
Permutations vs Relearning
在本小節中,將置換重要性與再學習方法進行比較。
令人驚訝的是,再學習方法在所有相關關系中的表現明顯比置換差,這可以從下面的圖中看出。另外,再學習方法花費了大約n_features數倍的時間來運行。
圖12 Spearman特征排序相關性=f(特征相關性均值) 圖13 Spearman特征排序相關性=f(特征相關性最大值)結論
總結
在這篇文章中,描述了置換重要性方法以及與之相關的問題。展示了高度相關的特征如何以及為什么會影響置換重要性,這將導致誤導性的結果。做了一個實驗,結果表明置換重要性受高度相關特征的影響最大。還展示了,盡管重新學習方法被認為是有希望的,但是它們的表現比置換的重要性更差,并且需要更多的時間來運行。
這篇文章的主題和實驗都是受到了Giles Hooker 和Lucas Mentch.的作品Please Stop Permuting Features An Explanation and Alternatives (https://arxiv.org/abs/1905.03151) 的啟發。
作者:Denis Vorotyntsev
本文代碼:https://github.com/DenisVorotyntsev/StopPermutingFeatures
deephub翻譯組
總結
以上是生活随笔為你收集整理的为什么要停止过度使用置换重要性来寻找影响特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在不更改word行距的情况下,完全显示公
- 下一篇: 双千兆和全千兆有什么区别?_千兆字节,太