【问题标题】:what is the output of shap_values & explainer.expected_value ?shap_values & explainer.expected_value 的输出是什么?
【发布时间】:2018-11-28 13:33:53
【问题描述】:

我正在 XGBClassifier 模型上运行 shap 并尝试了解输出。 我的代码:

params2 = {'n_estimators': 100,
               'learning_rate': 0.5,
               'seed': 0,
               'subsample': 0.8,
               'n_jobs': 50,
               'colsample_bytree': 0.8,
               'objective': 'binary:logistic',
               'max_depth': 10,
               'min_child_weight': 300,
               'gamma': 2,
               'max_delta_step': 6
               }

estimator = xgb.XGBClassifier(**params2)
mapper = DataFrameMapper([(i, None) if j != 'object' and j != 'bool' else (i,
                          [CategoricalDomain(
                           missing_value_treatment="as_value",
                           invalid_value_treatment="as_missing",
                           missing_value_replacement=
                           train_x[i].value_counts().idxmax(),
                           invalid_value_replacement=
                           train_x[i].value_counts().idxmax()),
                           LabelEncoder()])
                           for i, j in zip(train_x.columns.values, train_x.dtypes.values)],
                           input_df=True, df_out=True)

pmml_pipeline = PMMLPipeline([("mapper", mapper),("classifier", estimator)])
pmml_pipeline.fit(train_x, train_y.as_matrix())
train_x_encode = pmml_pipeline.named_steps['mapper'].fit_transform(train_x)
explainer = shap.TreeExplainer(pmml_pipeline.named_steps['classifier'])
shap_values = explainer.shap_values(train_x_encode)
print explainer.expected_value

根据我的理解,explainer.expected_value 假设返回一个大小为 2 的数组,shap_values 应该返回两个矩阵,一个用于正值,一个用于负值,因为这是一个分类模型。 但是explainer.expected_value实际上返回一个值,shap_values返回一个矩阵

我的问题是:

  1. 我错过了什么,为什么 shap 的输出不像模型输出那样是二维的。
  2. 如果explainer.expected_value 应该是一维的,那么它代表什么(我希望得到两个值 - 平均预测概率为 1,平均预测概率为 2)
  3. 关于shap_values 矩阵:对于分类变量,我可以平均每个变量值的所有shap 值并说我得到的平均值是该值对目标变量的影响吗?

【问题讨论】:

    标签: python machine-learning xgboost


    【解决方案1】:

    我能想到的原因是你的真实标签只有一个独特的价值。在这种情况下,explainer.expected_value 不是一个数组而是一个数字。另外,shap_values 只包含一个矩阵。

    1. 如果我对真实标签的假设是正确的,那么您什么都不会错过。看一下源码,例如here
    2. 在这种情况下,它将是您在标签中拥有的唯一标签/类别的预期值
    3. 我不确定我是否理解正确,但据我所知,您不需要对这些值进行平均

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2021-01-21
      • 2017-11-22
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2016-02-11
      相关资源
      最近更新 更多