\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"test_index = 0 # Select some test example\n",
"\n",
"props = [(\"color\", \"grey\"), (\"font-weight\", \"bold\")]\n",
"Styles = [dict(selector = \"caption\", props = props)]\n",
"props_b = [(\"caption-side\", \"bottom\")]\n",
"Styles_b = [dict(selector = \"caption\", props = props_b)]\n",
"\n",
"df = pd.DataFrame([rf_predictions[test_index]], index = [\"\"], \n",
" columns=rf.classes_).round(2)\n",
"display(df.style.format(precision=2).set_caption(\"Original prediction\").set_table_styles(Styles))\n",
"\n",
"df = pd.DataFrame([rfx_predictions_k[test_index]], index = [\"\"], \n",
" columns=rfx.classes_).round(2)\n",
"display(df.style.format(precision=2).set_caption(\"Constrained prediction\").set_table_styles(Styles))\n",
" \n",
"display_board(X_orig_test[test_index],\n",
" f\"Test example [{y_test[test_index]}]\",\n",
" Styles_b)\n",
"\n",
"for i, e in enumerate(examples[test_index]):\n",
" caption = f\"Example #{i+1} [{y_train[e]}, {weights[test_index][i]:.2f}]\" \n",
" display_board(X_orig_train[examples[test_index][i]],\n",
" caption, Styles_b)"
]
},
{
"cell_type": "markdown",
"id": "2eb54947-8c0c-4d66-8f22-41e5ed4c00c7",
"metadata": {},
"source": [
"Let us check how many training examples contribute to the predictions in the original forest."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "cbff0f50-f4a2-4088-add1-9d8e831f1fd2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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+eWXNWDAAM2fP9/rBQIAAFSEx2Fn27ZtuvfeeyVJf//73xUWFqaDBw9q4cKFevXVV71eIAAAQEV4HHbOnj2roKAgSdLq1asVHx+vGjVqqH379jp48KDXCwQAAKgIj8NOkyZNtGzZMh0+fFirVq1Sz549JUk5OTkKDg72eoEAAAAV4XHY+dOf/qQJEyYoMjJSd999t+655x5JP8/ytG7d2usFAgAAVISvpwf85je/UadOnZSVlaVWrVq52rt166ZBgwZ5tTgAAICKuqrf2XE4HAoKClJqaqrOnTsnSWrbtq1atGjh1eIAAAAqyuOwc/z4cXXr1k3NmjVT3759lZWVJUl65JFHlJSU5PUCAQAAKsLjsDNu3Dj5+fnp0KFDqlWrlqt9yJAhWrlypVeLAwAAqCiP1+ysXr1aq1atUsOGDd3amzZtyqPnAACg2vF4ZufMmTNuMzoXHDt2THa73StFAQAAeIvHYadz586u10VIks1mU0lJiV566SV17drVq8UBAABUlMe3sV566SXFxsbq66+/VmFhoSZNmqRdu3bpxIkT+vLLLyujRgAAgKvm8czO7bffrh07dujuu+9Wjx49dObMGcXHx2v79u269dZbK6NGAACAq+bxzI708+/sPPvss96uBQAAwOvKFXZ27NhR7hPecccdV10MAACAt5Ur7Nx5552y2Wwyxly2n81mU3FxsVcKAwAA8IZyhZ3MzMzKrgMAAKBSlCvsREREVHYdAAAAleKqFijv2bNHr732mnbv3i2bzaYWLVooISFBzZs393Z9AAAAFeLxo+d///vfFRUVpfT0dLVq1Up33HGHtm3bpqioKP3tb3+rjBoBAACumsczO5MmTdKUKVP03HPPubVPmzZNTz75pH772996rTgAAICK8nhmJzs7Ww899FCp9gcffFDZ2dleKQoAAMBbPA47sbGx+uKLL0q1b9y4Uffee69XigIAAPAWj8NO//799eSTT2rs2LFatGiRFi1apLFjx2ry5MkaNGiQPv30U9fnSjZs2KC4uDg5nU7ZbDYtW7bMbf/IkSNls9ncPu3bt3frU1BQoISEBIWGhqp27drq37+/jhw54ullAQAAi/J4zc7jjz8uSZo3b57mzZtX5j6pfD8weObMGbVq1UqjRo3Sr3/96zL79O7dWwsWLHBt+/v7u+1PTEzUZ599piVLlqhevXpK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62cOHTpUBVdTPVxuTDMzM8vcJ8msW7fOdQ7G1N2V/p5e7OJHz41hTC9WnjF9++23TZMmTUzNmjVNq1atzLJly9zOwZi6u9KYZmVlmZEjRxqn02lq1qxpmjdvbl5++WVTUlLiOofVx9RmjDHXIFMBAABUCdbsAAAASyPsAAAASyPsAAAASyPsAAAASyPsAAAASyPsAAAASyPsAAAASyPsAAAASyPsAKg0sbGxSkxMLHf/AwcOyGazKSMjo9JqsgJPxxW40fFuLMCifvzxRzmdTuXm5rrefbV79241atTokseMHDlSp06d0rJly7xSw9KlS+Xn51fu/uHh4crKylJoaKhXvh8AJMIOYFn/+te/dOedd6pWrVr66quvXC8F9IaioqJyhZi6det6dF4fHx85HI6rLQsAysRtLMCiNm3apI4dO0qSNm7c6PrzpUyfPl3vvvuuPvnkE9lsNtlsNq1fv951a+nDDz9UbGysatasqUWLFun48eMaOnSoGjZsqFq1aik6Olrvv/++2zkvvt0SGRmpGTNm6OGHH1ZQUJAaNWqkN954w7X/4ttY69evl81m09q1axUTE6NatWqpQ4cO2rNnj9v3PP/886pfv76CgoL0yCOPaPLkybrzzjsve73fffed+vbtq8DAQIWFhWn48OE6duyY63v9/f31xRdfuPq//PLLCg0NVVZWliRp5cqV6tSpk371q1+pXr166tevn/bv31/qWj788EPde++9CggIUNu2bbV3715t3bpVMTExCgwMVO/evfXjjz+6jhs5cqQGDhyoZ599VvXr11dwcLAee+wxFRYWXvJaCgsLNWnSJN18882qXbu22rVr53pLuCQdPHhQcXFxqlOnjmrXrq2WLVtqxYoVlx0fwFKq+k2kALzn4MGDJiQkxISEhBg/Pz9Ts2ZNExISYvz9/Y3dbjchISHmP/7jP8o89vTp02bw4MGmd+/eJisry2RlZZmCggLXG9MjIyPNRx99ZP7973+bH374wRw5csS89NJLZvv27Wb//v3m1VdfNT4+Pmbz5s2uc3bp0sU88cQTru2IiAhTt25d8+c//9ns27fPJCcnmxo1apjdu3cbY4zru7Zv326M+f+3Obdr186sX7/e7Nq1y9x7772mQ4cOrnMuWrTI1KxZ0/z1r381e/bsMc8++6wJDg42rVq1uuQ4HT161ISGhpopU6aY3bt3m23btpkePXqYrl27uvpMnDjRREREmFOnTpmMjAxjt9vN0qVLXfv//ve/m48++sjs3bvXbN++3cTFxZno6GhTXFzsdi0tWrQwK1euNN99951p3769ueuuu0xsbKzZuHGj2bZtm2nSpIn5wx/+4DrviBEjTGBgoBkyZIjZuXOn+cc//mFuuukm89RTT11yXIcNG2Y6dOhgNmzYYL7//nvz0ksvGbvdbvbu3WuMMeb+++83PXr0MDt27DD79+83n332mUlLS7vk+ABWQ9gBLKSoqMhkZmaab775xvj5+ZmMjAzz/fffm8DAQJOWlmYyMzPNjz/+eMnjR4wYYQYMGODWduEf7ZSUlCt+f9++fU1SUpJru6yw8+CDD7q2S0pKTP369c38+fPdvuvisLNmzRrXMcuXLzeSzLlz54wxxrRr186MGTPGrY6OHTteNuxMnTrV9OzZ063t8OHDRpLZs2ePMcaYgoIC07p1azN48GDTsmVL88gjj1z22nNycowk8+2337pdy1tvveXq8/777xtJZu3ata625ORk07x5c9f2iBEjTN26dc2ZM2dcbfPnzzeBgYGuIPXLcf3++++NzWYzP/zwg1s93bp1M1OmTDHGGBMdHW2mT59+2foBK+M2FmAhvr6+ioyM1P/8z/+obdu2atWqlbKzsxUWFqbOnTsrMjLyqhf/xsTEuG0XFxfrhRde0B133KF69eopMDBQq1ev1qFDhy57njvuuMP1Z5vNJofDoZycnHIf06BBA0lyHbNnzx7dfffdbv0v3r5Yenq61q1bp8DAQNenRYsWkuS6FeXv769Fixbpo48+0rlz55SSkuJ2jv3792vYsGG65ZZbFBwcrMaNG0tSqev/Ze1hYWGSpOjoaLe2i6+/VatWqlWrlmv7nnvuUX5+vg4fPlzqWrZt2yZjjJo1a+Z2PWlpaa5r+eMf/6jnn39eHTt21LRp07Rjx47Ljg9gNSxQBiykZcuWOnjwoIqKilRSUqLAwECdP39e58+fV2BgoCIiIrRr166rOnft2rXdtl9++WXNmTNHKSkpio6OVu3atZWYmHjZtSWSSi1sttlsKikpKfcxNptNktyOudB2gTHmsucrKSlRXFycZs6cWWrfhTAl/bzuSZJOnDihEydOuI1BXFycwsPD9eabb8rpdKqkpERRUVGlrr+s2i9uu9L1X3z8xdfi4+Oj9PR0+fj4uO0LDAyUJD3yyCPq1auXli9frtWrVys5OVkvv/yyEhISyvW9wPWOmR3AQlasWKGMjAw5HA4tWrRIGRkZioqKUkpKijIyMq64KNXf31/FxcXl+q4vvvhCAwYM0IMPPqhWrVrplltu0b59+7xxGR5p3ry5tmzZ4tb29ddfX/aYu+66S7t27VJkZKSaNGni9rkQaPbv369x48bpzTffVPv27fXQQw+5Qsnx48e1e/duPfPMM+rWrZtuu+02nTx50mvX9M033+jcuXOu7c2bNyswMFANGzYs1bd169YqLi5WTk5OqWv55ZNt4eHh+sMf/qClS5cqKSlJb775ptfqBao7wg5gIREREQoMDNT//u//asCAAWrUqJG+++47xcfHq0mTJoqIiLjs8ZGRkdqxY4f27NmjY8eOqaio6JJ9mzRpotTUVG3atEm7d+/WY489puzsbG9f0hUlJCTo7bff1rvvvqt9+/bp+eef144dO8qcBblgzJgxOnHihIYOHaotW7bo3//+t1avXq2HH35YxcXFKi4u1vDhw9WzZ0+NGjVKCxYs0M6dO/Xyyy9LkurUqaN69erpjTfe0Pfff6/PP/9c48eP99o1FRYWavTo0fruu+/0z3/+U9OmTdPYsWNVo0bp/2Q3a9ZMv/vd7/TQQw9p6dKlyszM1NatWzVz5kxXuE1MTNSqVauUmZmpbdu26fPPP9dtt93mtXqB6o6wA1jM+vXr1bZtW9WsWVNfffWVbr75ZjmdznId++ijj6p58+aKiYnRTTfdpC+//PKSfadOnaq77rpLvXr1UmxsrBwOhwYOHOilqyi/3/3ud5oyZYomTJigu+66S5mZmRo5cqRq1qx5yWOcTqe+/PJLFRcXq1evXoqKitITTzyhkJAQ1ahRQy+88IIOHDjgeize4XDorbfe0jPPPKOMjAzVqFFDS5YsUXp6uqKiojRu3Di99NJLXrumbt26qWnTpurcubMGDx6suLg4TZ8+/ZL9FyxYoIceekhJSUlq3ry5+vfvr6+++krh4eGSfl5fNWbMGN12223q3bu3mjdvrnnz5nmtXqC6s5kr3dwGgOtMjx495HA49N5771V1KR7z9q9YA2CBMoDr3NmzZ/X666+rV69e8vHx0fvvv681a9YoNTW1qksDUE0QdgBc12w2m1asWKHnn39eBQUFat68uT766CN17969qksDUE1wGwsAAFgaC5QBAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAICl/R+ZaCgbSYMgiwAAAABJRU5ErkJggg==",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"xrfc_predictions, all_non_zero_weights = rfx.predict_proba(X_test, c=1.0, return_weights=True)\n",
"\n",
"lengths = [len(w) for w in all_non_zero_weights]\n",
"\n",
"plt.hist(lengths, 10)\n",
"plt.xlabel(\"# training examples\")\n",
"plt.ylabel(\"# test examples\")\n",
"plt.show()\n",
"\n",
"assert np.allclose(rf_predictions, xrfc_predictions)"
]
},
{
"cell_type": "markdown",
"id": "4deb9aaa-80be-4485-a1b0-84e1817efed7",
"metadata": {},
"source": [
"Rather than constraining the predictions to a fixed number by setting a value for `k`, we could set a limit on the cumulative sum of the highest weights, e.g., to 30% (`c=0.3`)."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "4d659e12-c21e-4c61-b06e-f9c7d5469a28",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"