Отрицательные значения SHAP в H2O в Python с использованием pred_contributions - PullRequest
1 голос
/ 18 июня 2020

Я пытался вычислить значения SHAP для Gradient Boosting Classifier в модуле H2O в Python. Ниже приведен адаптированный пример в документации для метода predict_contibutions (адаптированный из https://github.com/h2oai/h2o-3/blob/master/h2o-py/demos/predict_contributionsShap.ipynb).

import h2o
import shap
from h2o.estimators.gbm import H2OGradientBoostingEstimator
from h2o import H2OFrame

# initialize H2O
h2o.init()

# load JS visualization code to notebook
shap.initjs()

# Import the prostate dataset
h2o_df = h2o.import_file("https://raw.github.com/h2oai/h2o/master/smalldata/logreg/prostate.csv")

# Split the data into Train/Test/Validation with Train having 70% and test and validation 15% each
train,test,valid = h2o_df.split_frame(ratios=[.7, .15])

# Convert the response column to a factor
h2o_df["CAPSULE"] = h2o_df["CAPSULE"].asfactor()

# Generate a GBM model using the training dataset
model = H2OGradientBoostingEstimator(distribution="bernoulli",
                                     ntrees=100,
                                     max_depth=4,
                                     learn_rate=0.1)

model.train(y="CAPSULE", x=["AGE","RACE","PSA","GLEASON"],training_frame=h2o_df)

# calculate SHAP values using function predict_contributions
contributions = model.predict_contributions(h2o_df)

# convert the H2O Frame to use with shap's visualization functions
contributions_matrix = contributions.as_data_frame().to_numpy() # the original method is as_matrix()

# shap values are calculated for all features
shap_values = contributions_matrix[:,0:4]

# expected values is the last returned column
expected_value = contributions_matrix[:,4].min()

# force plot for one observation
X=["AGE","RACE","PSA","GLEASON"]
shap.force_plot(expected_value, shap_values[0,:], X)

Изображение, полученное мной из приведенного выше кода: график силы для одного наблюдения

Что означает результат? Учитывая, что проблема выше является проблемой классификации, прогнозируемое значение должно быть вероятностью (или даже прогнозируемой категорией - 0 или 1), верно? И базовое значение, и прогнозируемое значение отрицательны.

Кто-нибудь может мне с этим помочь?

1 Ответ

1 голос
/ 18 июня 2020

То, что вы получили, скорее всего, логарифм , а не сама вероятность. Чтобы получить вероятность, вам необходимо преобразовать каждый логарифм в пространство вероятностей, то есть

p=e^x/(1 + e^x)

, когда вы напрямую используете SHAP , вы можете добиться этого, указав model_output параметр:

shap.TreeExplainer(model, data, model_output='probability')
...