Skip to content

Instantly share code, notes, and snippets.

@glemaitre
Last active March 29, 2022 09:55
Show Gist options
  • Save glemaitre/9a30dd3a704675164b84d9bf7128882e to your computer and use it in GitHub Desktop.
Save glemaitre/9a30dd3a704675164b84d9bf7128882e to your computer and use it in GitHub Desktop.
TreeSHAP bug reproducer
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "9e424e70",
"metadata": {},
"source": [
"## Comparing the TreeSHAP and `Exact` explainers"
]
},
{
"cell_type": "markdown",
"id": "f3cb9aac",
"metadata": {},
"source": [
"We define the same dataset as exposed in [gh-2345](https://github.com/slundberg/shap/issues/2345)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "708e24a8",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"X = np.vstack([\n",
" [[0, 0]] * 400,\n",
" [[0, 1]] * 100,\n",
" [[1, 0]] * 100,\n",
" [[1, 1]] * 400,\n",
"])\n",
"y = np.array(\n",
" [0] * 400 +\n",
" [50] * 100 +\n",
" [50] * 100 +\n",
" [100] * 400\n",
")"
]
},
{
"cell_type": "markdown",
"id": "793075d6",
"metadata": {},
"source": [
"### Define two trees with different split ordering\n",
"\n",
"We vary the `random_state` to make sure that\n",
"\n",
"* `tree_1` considers `X[0]` as a root split\n",
"* `tree_2` considers `X[1]` as a root split\n",
"\n",
"Note that the 2 trees compute the same prediction on any data points. They are two distinct implementations of the same mathematical decision function."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "16949644",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAFUCAYAAAAgQOYwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABJwUlEQVR4nO3de3xU9bX//9eHYARFrNyLEigJSCSQkEACCISLhyIXETRiK+HiURAtKlp7qFEUkF+xWrH1AqV4MAi2KEWOIKBHyv1msV88saJcFbwQMKFiJAQS1u+PCVMCSUhIwp6ZvJ+PxzxkZu+ZvSYuFiufvffn48wMERERkVBWw+sARERERKqaGh4REREJeWp4REREJOSp4REREZGQp4ZHREREQp4aHhEREQl5anhEREQk5KnhERERkZCnhkdERERCnhoeERERCXlqeERERCTkqeERERGRkKeGR0REREKeGh4REREJeWp4REREJOSp4REREZGQp4ZHREREQp4aHhEREQl5anhEREQk5KnhERERkZCnhkdERERCnhoeERERCXlqeERERCTkqeERERGRkKeGR0REREKeGh4REREJeWp4REREJOSp4REREZGQp4ZHREREQp4aHhEREQl5anhEREQk5KnhERERkZCnhkdERERCXk2vAxAJZbVr1z54/Pjxxl7HIcGhVq1ambm5uU28jkMkFDkz8zoGkZDlnDP9HZOycs5hZs7rOERCkU5piYiISMhTwyMiIiIhTw2PiIiIhDw1PCIiIhLy1PCIVDNZWVk0a9aMf/zjH/7XHn/8cX7+858D8OSTT9K4cWOGDRvm375lyxZiY2Np3bo1ffv25dChQwCcOHGCuLg46tSpw8qVKy/q95g6dSqRkZFERkYyderUEvdzzhEbG0tcXBxxcXFkZGRcxChFJFCo4RGpZurXr88f/vAHRo0axYkTJ/jwww+ZO3cuL7zwgn+f0aNHs3DhQgDMjNTUVGbNmsXOnTtJTk5m4sSJAISHh7N9+3Y6duxY7jiOHDlywd9h3bp1LF68mI8//piPP/6YN998k3Xr1pW4/9atW9m+fTvbt2+nXbt2F3xcEQleanhEqqEhQ4bQtm1bHnvsMUaNGsULL7xA/fr1i91327Zt1KlThy5dugAwbtw43njjjQs67qFDh3jxxRfp2rUrDzzwwAXHv3DhQkaNGkXt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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"from sklearn.tree import plot_tree\n",
" \n",
"_, ax = plt.subplots(figsize=(10, 6))\n",
"tree_1 = DecisionTreeRegressor(random_state=2)\n",
"tree_1.fit(X, y)\n",
"_ = plot_tree(tree_1, ax=ax)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "39b1a909",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Hz+epKQkfD4fY8aMCTRCn3zyCcnJySQmJjJixIhAQ1CSF198kaSkJBISEujTpw/79u0D/Bc+jxgxgoEDBxIfH8+yZctITEzknnvuoWPHjqxcuZJly5bRrl072rZtS69evdi5cycAq1evPmvf8urduzc1a9YEoG3btuTn55OVlQX471obM2YM1apVo0GDBgwePJjXX3+9XNtOt3z5cpKTk4mJiQH8UwJoGQyRC0/z8IhcYCtWrCArK4tPPvkE8M8VA/7THsuXL+ejjz4iMjKSAQMGlOr9mjdvznvvvUdkZCTffvstCQkJXH/99dStWxeAf/3rX/z9738nIiKCyZMn8+Mf/5gPPvgAgNGjRzNjxgzuvfdehg0bxkMPPcStt97K2rVrA7d5F+f9999nyZIlrF+/nosuuoj58+dz3333sWjRosD2LVu2UK9ePVavXs3WrVuZMWMGL7zwAgcPHqRNmzasXbuW1q1b8+KLL3LbbbcF5uM5fd8zZWZm0qtXryJjat++fYmnlgBefvllWrVqRePGjQH/TMxRUVGB7c2aNQuM1JzvttMVtd+pxlBELhw1PCIXmM/n47PPPuPuu++mZ8+egdmEV61axZAhQ7jkkksAGDFiBDNnzjzn+2VnZzN69GgyMjKoXr06mZmZbN++nY4dOwJw2223ERERAfibquzsbF555RXAP9pUo0YNjhw5wrZt2wKjRl27dqVVq1YlHnfJkiV8+OGHgeUi8vPzC92p1a9fv0ILksbGxpKUlATApk2bSExMpHXr1gDcfvvtjBs3ju+///6sfc9Ur149tm7des7fS1Hef/99Hn30Ud59991i9ynpIvPz3XY++4lIxVLDI3KBtWjRgm3btrFy5UqWL19OWloaGRkZJf5DWL16dfLz8wPPjx07FvhzWloazZs3Z968eURERNCmTZtC22vVqhX4s5kxa9YsunbtWuj9jxw5gnNluznIzBg9ejSPPvpokdtPP25Rz8883umf/8x9T3e+IzwbN25k6NChLF68mJYtWwZeP7VMRbt27YDCy1Sc77bTRUVFsXbt2sDzkpbBEJHKo2t4RC6wL7/8koiICG688UamT5/OgQMHOHz4ML169WLBggUcPXqUvLw80tPTAz8THR3N1q1byc3N5cSJE4HTRgDfffcdV155JREREbz//vts27at2GMPGDCA6dOnB1Ym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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"_, ax = plt.subplots(figsize=(10, 6))\n",
"tree_2 = DecisionTreeRegressor(random_state=0)\n",
"tree_2.fit(X, y)\n",
"_ = plot_tree(tree_2, ax=ax)"
]
},
{
"cell_type": "markdown",
"id": "2844808b",
"metadata": {},
"source": [
"### Explaining the prediction for a given data point with TreeSHAP"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1b6bb090",
"metadata": {},
"outputs": [],
"source": [
"X_test = np.array([[1, 1]])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "6609a1f9",
"metadata": {},
"outputs": [],
"source": [
"from shap import Explainer"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9ec30981",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
".values =\n",
"array([[32.5, 17.5]])\n",
"\n",
".base_values =\n",
"array([[50.]])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_1_explainer = Explainer(model=tree_1, algorithm=\"tree\")\n",
"tree_1_explainer(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0ffbae96",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
".values =\n",
"array([[17.5, 32.5]])\n",
"\n",
".base_values =\n",
"array([[50.]])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_2_explainer = Explainer(model=tree_2, algorithm=\"tree\")\n",
"tree_2_explainer(X_test)"
]
},
{
"cell_type": "markdown",
"id": "832baa37",
"metadata": {},
"source": [
"We observe that we can reproduce the bug regarding the asymmetry of SHAP values reported in the original issue linked above."
]
},
{
"cell_type": "markdown",
"id": "67eac2e3",
"metadata": {},
"source": [
"### Explaining the prediction for a given data point with the `Exact` explainer"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "a347415e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(array([1, 1]),)\n"
]
},
{
"data": {
"text/plain": [
".values =\n",
"array([[25., 25.]])\n",
"\n",
".base_values =\n",
"array([50.])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from shap.explainers import Exact\n",
"from shap.maskers import Independent\n",
"\n",
"explainer = Exact(tree_1.predict, Independent(X, max_samples=X.shape[0]))\n",
"explainer(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "55f11777",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(array([1, 1]),)\n"
]
},
{
"data": {
"text/plain": [
".values =\n",
"array([[25., 25.]])\n",
"\n",
".base_values =\n",
"array([50.])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"explainer = Exact(tree_2.predict, Independent(X, max_samples=X.shape[0]))\n",
"explainer(X_test)"
]
},
{
"cell_type": "markdown",
"id": "07e936db",
"metadata": {},
"source": [
"The `Exact` explainer is not subject to the asymmetry problem.\n",
"\n",
"We can as well check that a Python implementation of the same decision function leads to the same explaination."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f7e6d7af",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(array([1, 1]),)\n"
]
},
{
"data": {
"text/plain": [
".values =\n",
"array([[25., 25.]])\n",
"\n",
".base_values =\n",
"array([50.])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def my_predict_one(x):\n",
" if x[0] < 0.5 and x[1] < 0.5:\n",
" return 0\n",
" elif x[0] > 0.5 and x[1] > 0.5:\n",
" return 100\n",
" else:\n",
" return 50\n",
"\n",
" \n",
"def my_predict(X):\n",
" return np.array(\n",
" [my_predict_one(x) for x in X]\n",
" )\n",
"\n",
"explainer = Exact(my_predict, masker=Independent(X, max_samples=X.shape[0]))\n",
"explainer(X_test)"
]
},
{
"cell_type": "markdown",
"id": "b6d3450d",
"metadata": {},
"source": [
"### Checking the ACV implementation of SHAP values"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "3939f707",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1216.45it/s]\n"
]
},
{
"data": {
"text/plain": [
"array([[[25.],\n",
" [25.]]])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from acv_explainers import ACVTree\n",
"\n",
"ACVTree(tree_1, X).shap_values(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "e0b6b424",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1452.82it/s]\n"
]
},
{
"data": {
"text/plain": [
"array([[[25.],\n",
" [25.]]])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ACVTree(tree_2, X).shap_values(X_test)"
]
},
{
"cell_type": "markdown",
"id": "464b4598",
"metadata": {},
"source": [
"### Checking the FastTreeSHAP implementation\n",
"\n",
"We now observe that this bug is also present in the FastTreeSHAP implementation."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "b5437856",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
"poetry 1.1.13 requires packaging<21.0,>=20.4, but you have packaging 21.3 which is incompatible.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip install -q fasttreeshap"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "b2c9535d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
".values =\n",
"array([[32.5, 17.5]])\n",
"\n",
".base_values =\n",
"array([[50.]])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import fasttreeshap\n",
"\n",
"fasttreeshap.TreeExplainer(tree_1, algorithm=\"v2\")(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fd412556",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
".values =\n",
"array([[17.5, 32.5]])\n",
"\n",
".base_values =\n",
"array([[50.]])\n",
"\n",
".data =\n",
"array([[1, 1]])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fasttreeshap.TreeExplainer(tree_2, algorithm=\"v2\")(X_test)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment