Question: I need to plot how each feature impacts the predicted probability for each sample from my LightGBM binary classifier. So I need to output Shap values in probability, instead of normal Shap values. It does not appear to have any options to output in term of probability. The example code below is what I use to generate dataframe of Shap values and do a force_plot for the first data sample. Does anyone know how I should modify the code to change the output? I'm new to Shap value and the Shap package. Thanks a lot in advance. import pandas as pd import numpy as np import shap import lightgbm as lgbm from sklearn.model_selection import train_test_split from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X = pd.DataFrame(data.data, columns=data.feature_names) y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) model = lgbm.LGBMClassifier() model.fit(X_train, y_train) explainer = shap.TreeExplainer(model) shap_values = explainer(X_train) # force plot of first row for class 1 class_idx = 1 row_idx = 0 expected_value = explainer.expected_value[class_idx] shap_value = shap_values[:,:,class_idx].values[row_idx] shap.force_plot (base_value = expected_value, shap_values = shap_value, features = X_train.iloc[row_idx, :], matplotlib=True) # dataframe of shap values for class 1 shap_df = pd.DataFrame(shap_values[:,:, 1 ].values, columns = shap_values.feature_names) 

Answer: TL;DR: You can achieve plotting results in probability space with link="logit" in the force_plot method: import pandas as pd import numpy as np import shap import lightgbm as lgbm from sklearn.model_selection import train_test_split from sklearn.datasets import load_breast_cancer from scipy.special import expit shap.initjs() data = load_breast_cancer() X = pd.DataFrame(data.data, columns=data.feature_names) y = data.target X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) model = lgbm.LGBMClassifier() model.fit(X_train, y_train) explainer_raw = shap.TreeExplainer(model) shap_values = explainer_raw(X_train) # force plot of first row for class 1 class_idx = 1 row_idx = 0 expected_value = explainer_raw.expected_value[class_idx] shap_value = shap_values[:, :, class_idx].values[row_idx] shap.force_plot( base_value=expected_value, shap_values=shap_value, features=X_train.iloc[row_idx, :], link="logit", )  Expected output:  Alternatively, you may achieve the same with the following, explicitly specifying model_output="probability" you're interested in to explain: explainer = shap.TreeExplainer( model, data=X_train, feature_perturbation="interventional", model_output="probability", ) shap_values = explainer(X_train) # force plot of first row for class 1 class_idx = 1 row_idx = 0 shap_value = shap_values.values[row_idx] shap.force_plot( base_value=expected_value, shap_values=shap_value, features=X_train.iloc[row_idx, :] )  Expected output:  However, it might be more interesting for understanding what's happening here to find out where these figures come from:  Our target proba for the point of interest:  model_proba= model.predict_proba(X_train.iloc[[row_idx]]) model_proba # array([[0.00275887, 0.99724113]])   Base case raw from model given X_train as background (note, LightGBM outputs raw for class 1):  model.predict(X_train, raw_score=True).mean() # 2.4839751932445577   Base case raw from SHAP (note, they are symmetric):  bv = explainer_raw(X_train).base_values[0] bv # array([-2.48397519, 2.48397519])   Raw SHAP values for the point of interest:  sv_0 = explainer_raw(X_train).values[row_idx].sum(0) sv_0 # array([-3.40619584, 3.40619584])   Proba inferred from SHAP values (via sigmoid):  shap_proba = expit(bv + sv_0) shap_proba # array([0.00275887, 0.99724113])   Check:  assert np.allclose(model_proba, shap_proba)  Please ask questions if something is not clear. Side notes  Proba might be misleading if you're analyzing raw size effect of different features because sigmoid is non-linear and saturates after reaching certain threshold.   Some people expect to see SHAP values in probability space as well, but this is not feasible because:  SHAP values are additive by construction (to be precise SHapley Additive exPlanations are average marginal contributions over all possible feature coalitions) exp(a + b) != exp(a) + exp(b)   You may find useful:  Feature importance in a binary classification and extracting SHAP values for one of the classes only answer  How to interpret base_value of GBT classifier when using SHAP? answer