I'm using Pima Indians Diabetes Database(https://www.kaggle.com/uciml/pima-indians-diabetes-database). I made predictions using XGboost and I'm trying to analyze the features using SHAP.

However when I use force_plot with just one training example(a 1x8 vector) it shows that my output is -2.02. This is a classification problem, I shouldn't be seeing such a value. I'm new in SHAP and I don't know what the problem is.

Here is my code:

import numpy as np
import xgboost as xgb
import sklearn as skl
import shap

dataset=np.loadtxt("diabetes.csv", delimiter=",")
X_train, X_test, y_train, y_test=skl.model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)

model.fit(X_train, y_train)

accuracy=skl.metrics.accuracy_score(y_test, predictions)

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)
shap.force_plot(explainer.expected_value, shap_values[0,:].reshape(1, 8), X_train[0,:].reshape(1, 8))

Accuracy of my model is: 77,95.

Here is the result of my plot


The default link function is the identity, so you are seeing log-odds rather than probabilities. To see the probability, try adding link='logit' to your call of force_plot like so:

                shap_values[0,:].reshape(1, 8),
                X_train[0,:].reshape(1, 8),

You can read more at the SHAP documentation site.

| improve this answer | |
  • $\begingroup$ I did what you sad, I see 0.12 now as my output. Does it means my output is 0? $\endgroup$ – J.Smith Aug 5 '19 at 10:56
  • $\begingroup$ That would mean that the probability output by the model is 0.12. If you are using 0.5 as a cutoff, then your prediction is 0. But note that you can use any cutoff value that you'd like. This is what gives rise to the ROC curve and AUC metric. $\endgroup$ – DKL Aug 6 '19 at 9:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.