Xgboost : 一个变量特定的特征重要性

数据挖掘 机器学习 Python 分类 xgboost 特征
2022-02-15 15:28:19

我有一个类似这样的数据集:

data = [['Alex',10,13,1,0],['Bob',11,14,12,0],['Clarke',13,15,13,1],['bob',12,15,1,1]]
df = pd.DataFrame(data,columns = ["dealer","x","y","z","loss"])

我正在尝试预测二进制列丢失,我已经完成了这个xgboost模型。我得到了整体特征重要性。现在我需要明智地选择经销商的 5 个最重要的功能

怎么做?

我曾尝试使用石灰包,但它只适用于随机森林。

如果我得到每个观察(行)的特征重要性,那么我也可以明智地计算特征重要性经销商。

好心的帮助

期望的输出: 在此处输入图像描述

2个回答

如果您使用每个观察的解释,您可以平均(或以其他方式聚合)每个样本中特征的重要性Dealer


例如,shap用于生成每个观察的解释:

import pandas as pd
from sklearn.linear_model import LogisticRegression
import shap

data = [['Alex',10,13,1,0],['Bob',11,14,12,0],['Clarke',13,15,13,1],['Bob',12,15,1,1]]
df = pd.DataFrame(data, columns=["dealer","x","y","z","loss"])

lr = LogisticRegression()
lr.fit(df[['x', 'y', 'z']], df['loss'])

# Whatever explainer you prefer:
explainer = shap.explainers.Permutation(lr.predict_proba, df[['x', 'y', 'z']])
shap_values = explainer(df[['x', 'y', 'z']])

# get just the explanations for the positive class
shap_values = shap_values[...,1]

shap_df = pd.DataFrame(abs(shap_values.values))
shap_df.columns = ['x_shap', 'y_shap', 'z_shap']
shap_df['dealer'] = df['dealer']
shap_df.groupby('dealer').mean()

生产

经销商 x_shap y_shap z_shap
亚历克斯 0.260427 0.140054 0.075176
鲍勃 0.106593 0.069035 0.091146
克拉克 0.268328 0.083706 0.085807

您正在寻找的是 - “当经销商是 X 时,每个功能有多重要。”

您可以尝试排列重要性

  • 可用于拟合模型
  • 它与模型无关
  • 也可以为测试数据完成。

根据经销商将 X、Y 切片并分别获取重要性。

显示在Ocean_Proximity特征上的加利福尼亚住房数据

from sklearn.inspection import permutation_importance

for val in x_train.ocean_proximity.unique():        # Loop on column value
    x = x_train.loc[x_train.ocean_proximity==val,:] # Slices X
    y = y_train.loc[x_train.ocean_proximity==val]   # Slices Y
    
    result = permutation_importance(model, x, y, n_repeats=5, random_state=0)
    result = pd.DataFrame(result.importances_mean, index= cols)
    
    # print, sorted top 4 Features
    print('Ocean--',val,result.sort_values(by=0,ascending=False)[:4])   

注意-使用此测试和“杂质减少”方法的每个特征的重要性值是不可比较的。