Created
December 4, 2025 15:56
-
-
Save tteofili/ec3e2d1dddf0b1ccc0507336458427bc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells" : [ { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:39:41.213606Z", | |
| "start_time" : "2025-12-04T15:39:41.212183Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : "", | |
| "id" : "e635173ef70d8762", | |
| "outputs" : [ ], | |
| "execution_count" : null | |
| }, { | |
| "metadata" : { | |
| "collapsed" : true, | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:27:55.135540Z", | |
| "start_time" : "2025-12-04T15:27:52.008915Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "import pandas as pd\n", "import json\n", "import operator\n", "import re\n", "\n", "from ellmer.selfexplainer import SelfExplainer" ], | |
| "id" : "909306fc9640edd9", | |
| "outputs" : [ { | |
| "name" : "stderr", | |
| "output_type" : "stream", | |
| "text" : [ "/Users/tteofili/dev/ellmer/ellmer/selfexplainer.py:535: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", " if nm is not None and len(ns) is not 0 and len(cf) is not 0:\n", "/Users/tteofili/dev/ellmer/ellmer/selfexplainer.py:535: SyntaxWarning: \"is not\" with a literal. Did you mean \"!=\"?\n", " if nm is not None and len(ns) is not 0 and len(cf) is not 0:\n" ] | |
| } ], | |
| "execution_count" : 3 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:27:55.142210Z", | |
| "start_time" : "2025-12-04T15:27:55.138584Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "def token_perturb_for_target_label(row, ranked_cols, predict_fn, label, k):\n", "\n", " row = row.copy()\n", " top_k = ranked_cols[:k]\n", "\n", " for entry in top_k:\n", " if \"__\" not in entry:\n", " raise ValueError(f\"Ranked column entry must be 'attr__token', got: {entry}\")\n", "\n", " attr, token = entry.split(\"__\", 1)\n", "\n", " if attr not in row:\n", " continue\n", "\n", " original_val = str(row[attr])\n", "\n", " counterpart_attr = None\n", " if attr.startswith(\"ltable_\"):\n", " counterpart_attr = \"rtable_\" + attr[len(\"ltable_\"):]\n", " elif attr.startswith(\"rtable_\"):\n", " counterpart_attr = \"ltable_\" + attr[len(\"rtable_\"):]\n", "\n", " if label == 1:\n", " # remove the token from the attribute\n", " pattern = re.escape(token)\n", " new_val = re.sub(pattern, \"\", original_val, flags=re.IGNORECASE)\n", "\n", " # clean double spaces left behind\n", " new_val = re.sub(r\"\\s+\", \" \", new_val).strip()\n", " row[attr] = new_val\n", "\n", " else:\n", " # make token equal to the counterpart’s value or its matching token\n", " if counterpart_attr in row:\n", " counterpart_val = str(row[counterpart_attr])\n", "\n", " # if counterpart contains the same token, force-copy only that token\n", " if re.search(re.escape(token), counterpart_val, flags=re.IGNORECASE):\n", " replacement = token\n", " else:\n", " # replace token with the *whole counterpart attribute* (fallback)\n", " replacement = counterpart_val\n", "\n", " pattern = re.escape(token)\n", " new_val = re.sub(pattern, replacement, original_val, flags=re.IGNORECASE)\n", "\n", " row[attr] = new_val\n", "\n", " new_pred = predict_fn(row)\n", " return row, new_pred\n" ], | |
| "id" : "428d878712482b1", | |
| "outputs" : [ ], | |
| "execution_count" : 4 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:27:57.383217Z", | |
| "start_time" : "2025-12-04T15:27:57.224350Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "llm = SelfExplainer(explanation_granularity='attribute',\n", " temperature=1,\n", " model_name='gpt-5-nano', model_type='azure_openai',\n", " prompts={\"ptse\": {\"er\": \"../ellmer/prompts/er.txt\"}})" ], | |
| "id" : "b56f71faca9a505a", | |
| "outputs" : [ { | |
| "name" : "stderr", | |
| "output_type" : "stream", | |
| "text" : [ "/Users/tteofili/dev/ellmer/ellmer/selfexplainer.py:38: LangChainDeprecationWarning: The class `AzureChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 1.0. An updated version of the class exists in the :class:`~langchain-openai package and should be used instead. To use it run `pip install -U :class:`~langchain-openai` and import as `from :class:`~langchain_openai import AzureChatOpenAI``.\n", " self.llm = AzureChatOpenAI(model_name=model_name, request_timeout=120,\n" ] | |
| } ], | |
| "execution_count" : 5 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:28:00.185812Z", | |
| "start_time" : "2025-12-04T15:28:00.181468Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "def predict_fn(row):\n", " return llm.predict(pd.DataFrame(row))['match_score'].values[0]\n" ], | |
| "id" : "a710f7acb402396a", | |
| "outputs" : [ ], | |
| "execution_count" : 6 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:22.982092Z", | |
| "start_time" : "2025-12-04T15:37:22.976149Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "with open(\"/Users/tteofili/dev/ellmer/experiments/azure_openai/gpt-5-nano/token/beers/20251204/14_51/0_results.json\") as f:\n", " d = json.load(f)" ], | |
| "id" : "20da3c2e2a410071", | |
| "outputs" : [ ], | |
| "execution_count" : 46 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:24.204944Z", | |
| "start_time" : "2025-12-04T15:37:24.200170Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "ltuple = pd.json_normalize(d['data'][0]['cot_sample']['ltuple']).add_prefix('ltable_')\n", "rtuple = pd.json_normalize(d['data'][0]['cot_sample']['rtuple']).add_prefix('rtable_')" ], | |
| "id" : "e6b98d295d5adc27", | |
| "outputs" : [ ], | |
| "execution_count" : 47 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:25.377641Z", | |
| "start_time" : "2025-12-04T15:37:25.369509Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "beers_row = pd.concat([ltuple, rtuple], axis=1)\n", "beers_row" ], | |
| "id" : "3bba24732497f80f", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ " ltable_Beer_Name ltable_Brew_Factory_Name \\\n", "0 Bulleit Bourbon Barrel Aged G'Knight Oskar Blues Grill & Brew \n", "\n", " ltable_Style ltable_ABV \\\n", "0 American Amber / Red Ale 8.70 % \n", "\n", " rtable_Beer_Name rtable_Brew_Factory_Name \\\n", "0 Figure Eight Bourbon Barrel Aged Jumbo Love Figure Eight Brewing \n", "\n", " rtable_Style rtable_ABV \n", "0 Barley Wine - " ], | |
| "text/html" : [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ltable_Beer_Name</th>\n", " <th>ltable_Brew_Factory_Name</th>\n", " <th>ltable_Style</th>\n", " <th>ltable_ABV</th>\n", " <th>rtable_Beer_Name</th>\n", " <th>rtable_Brew_Factory_Name</th>\n", " <th>rtable_Style</th>\n", " <th>rtable_ABV</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Bulleit Bourbon Barrel Aged G'Knight</td>\n", " <td>Oskar Blues Grill & Brew</td>\n", " <td>American Amber / Red Ale</td>\n", " <td>8.70 %</td>\n", " <td>Figure Eight Bourbon Barrel Aged Jumbo Love</td>\n", " <td>Figure Eight Brewing</td>\n", " <td>Barley Wine</td>\n", " <td>-</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ] | |
| }, | |
| "execution_count" : 48, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 48 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:26.279169Z", | |
| "start_time" : "2025-12-04T15:37:26.271760Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "prediction = pd.json_normalize(d['data'][0]['cot_sample'])['prediction']\n", "prediction" ], | |
| "id" : "2565ccf869a697d5", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ "0 0\n", "Name: prediction, dtype: int64" ] | |
| }, | |
| "execution_count" : 49, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 49 | |
| }, { | |
| "metadata" : { }, | |
| "cell_type" : "code", | |
| "outputs" : [ ], | |
| "execution_count" : null, | |
| "source" : "", | |
| "id" : "9fe431c5ad2e4300" | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:27.858339Z", | |
| "start_time" : "2025-12-04T15:37:27.845997Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "self_explanation = pd.json_normalize(d['data'][0]['cot_sample']['saliency'])\n", "self_explanation" ], | |
| "id" : "bcd247cd99207821", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ " ltable_Beer_Name__Bulleit ltable_Beer_Name__Bourbon \\\n", "0 0.7 0.25 \n", "\n", " ltable_Beer_Name__Barrel ltable_Beer_Name__Aged \\\n", "0 0.2 0.15 \n", "\n", " ltable_Beer_Name__G'Knight ltable_Brew_Factory_Name__Oskar \\\n", "0 0.65 0.05 \n", "\n", " ltable_Brew_Factory_Name__Blues ltable_Brew_Factory_Name__Grill \\\n", "0 0.05 0.05 \n", "\n", " ltable_Brew_Factory_Name__& ltable_Brew_Factory_Name__Brew ... \\\n", "0 0.05 0.05 ... \n", "\n", " rtable_Beer_Name__Barrel rtable_Beer_Name__Aged rtable_Beer_Name__Jumbo \\\n", "0 0.2 0.18 0.76 \n", "\n", " rtable_Beer_Name__Love rtable_Brew_Factory_Name__Figure \\\n", "0 0.64 0.5 \n", "\n", " rtable_Brew_Factory_Name__Eight rtable_Brew_Factory_Name__Brewing \\\n", "0 0.5 0.6 \n", "\n", " rtable_Style__Barley rtable_Style__Wine rtable_ABV__- \n", "0 0.6 0.55 0.1 \n", "\n", "[1 rows x 29 columns]" ], | |
| "text/html" : [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ltable_Beer_Name__Bulleit</th>\n", " <th>ltable_Beer_Name__Bourbon</th>\n", " <th>ltable_Beer_Name__Barrel</th>\n", " <th>ltable_Beer_Name__Aged</th>\n", " <th>ltable_Beer_Name__G'Knight</th>\n", " <th>ltable_Brew_Factory_Name__Oskar</th>\n", " <th>ltable_Brew_Factory_Name__Blues</th>\n", " <th>ltable_Brew_Factory_Name__Grill</th>\n", " <th>ltable_Brew_Factory_Name__&</th>\n", " <th>ltable_Brew_Factory_Name__Brew</th>\n", " <th>...</th>\n", " <th>rtable_Beer_Name__Barrel</th>\n", " <th>rtable_Beer_Name__Aged</th>\n", " <th>rtable_Beer_Name__Jumbo</th>\n", " <th>rtable_Beer_Name__Love</th>\n", " <th>rtable_Brew_Factory_Name__Figure</th>\n", " <th>rtable_Brew_Factory_Name__Eight</th>\n", " <th>rtable_Brew_Factory_Name__Brewing</th>\n", " <th>rtable_Style__Barley</th>\n", " <th>rtable_Style__Wine</th>\n", " <th>rtable_ABV__-</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>0.7</td>\n", " <td>0.25</td>\n", " <td>0.2</td>\n", " <td>0.15</td>\n", " <td>0.65</td>\n", " <td>0.05</td>\n", " <td>0.05</td>\n", " <td>0.05</td>\n", " <td>0.05</td>\n", " <td>0.05</td>\n", " <td>...</td>\n", " <td>0.2</td>\n", " <td>0.18</td>\n", " <td>0.76</td>\n", " <td>0.64</td>\n", " <td>0.5</td>\n", " <td>0.5</td>\n", " <td>0.6</td>\n", " <td>0.6</td>\n", " <td>0.55</td>\n", " <td>0.1</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>1 rows × 29 columns</p>\n", "</div>" ] | |
| }, | |
| "execution_count" : 50, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 50 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:29.066595Z", | |
| "start_time" : "2025-12-04T15:37:29.056915Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "post_hoc_explanation = pd.json_normalize(d['data'][0]['certa_sample']['saliency'])\n", "post_hoc_explanation" ], | |
| "id" : "ea0e7d561021f797", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ " ltable_Brew_Factory_Name__Blues ltable_Beer_Name__G'Knight \\\n", "0 0.590909 0.636364 \n", "\n", " ltable_ABV__8.70 ltable_Beer_Name__Bulleit ltable_Brew_Factory_Name__& \\\n", "0 0.636364 0.681818 0.681818 \n", "\n", " ltable_Brew_Factory_Name__Oskar ltable_Style__/ ltable_Style__Amber \\\n", "0 0.681818 0.681818 0.681818 \n", "\n", " ltable_Beer_Name__Aged ltable_Beer_Name__Barrel ... \\\n", "0 0.545455 0.590909 ... \n", "\n", " rtable_Beer_Name__Eight rtable_Beer_Name__Figure rtable_Style__Barley \\\n", "0 0.318182 0.318182 0.318182 \n", "\n", " rtable_Beer_Name__Love rtable_Brew_Factory_Name__Figure \\\n", "0 0.272727 0.318182 \n", "\n", " rtable_Beer_Name__Bourbon rtable_Beer_Name__Barrel \\\n", "0 0.318182 0.318182 \n", "\n", " rtable_Brew_Factory_Name__Brewing ltable_Style__American ltable_ABV__% \n", "0 0.318182 0.590909 0.590909 \n", "\n", "[1 rows x 29 columns]" ], | |
| "text/html" : [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ltable_Brew_Factory_Name__Blues</th>\n", " <th>ltable_Beer_Name__G'Knight</th>\n", " <th>ltable_ABV__8.70</th>\n", " <th>ltable_Beer_Name__Bulleit</th>\n", " <th>ltable_Brew_Factory_Name__&</th>\n", " <th>ltable_Brew_Factory_Name__Oskar</th>\n", " <th>ltable_Style__/</th>\n", " <th>ltable_Style__Amber</th>\n", " <th>ltable_Beer_Name__Aged</th>\n", " <th>ltable_Beer_Name__Barrel</th>\n", " <th>...</th>\n", " <th>rtable_Beer_Name__Eight</th>\n", " <th>rtable_Beer_Name__Figure</th>\n", " <th>rtable_Style__Barley</th>\n", " <th>rtable_Beer_Name__Love</th>\n", " <th>rtable_Brew_Factory_Name__Figure</th>\n", " <th>rtable_Beer_Name__Bourbon</th>\n", " <th>rtable_Beer_Name__Barrel</th>\n", " <th>rtable_Brew_Factory_Name__Brewing</th>\n", " <th>ltable_Style__American</th>\n", " <th>ltable_ABV__%</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>0.590909</td>\n", " <td>0.636364</td>\n", " <td>0.636364</td>\n", " <td>0.681818</td>\n", " <td>0.681818</td>\n", " <td>0.681818</td>\n", " <td>0.681818</td>\n", " <td>0.681818</td>\n", " <td>0.545455</td>\n", " <td>0.590909</td>\n", " <td>...</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.272727</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.590909</td>\n", " <td>0.590909</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>1 rows × 29 columns</p>\n", "</div>" ] | |
| }, | |
| "execution_count" : 51, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 51 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:37:32.401691Z", | |
| "start_time" : "2025-12-04T15:37:32.390848Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "# compare\n", "explanations = pd.concat([self_explanation, post_hoc_explanation], axis=0, keys=['self', 'post_hoc'])\n", "explanations.head()" ], | |
| "id" : "92275ff5b2d6fc4d", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ " ltable_Beer_Name__Bulleit ltable_Beer_Name__Bourbon \\\n", "self 0 0.700000 0.250000 \n", "post_hoc 0 0.681818 0.681818 \n", "\n", " ltable_Beer_Name__Barrel ltable_Beer_Name__Aged \\\n", "self 0 0.200000 0.150000 \n", "post_hoc 0 0.590909 0.545455 \n", "\n", " ltable_Beer_Name__G'Knight ltable_Brew_Factory_Name__Oskar \\\n", "self 0 0.650000 0.050000 \n", "post_hoc 0 0.636364 0.681818 \n", "\n", " ltable_Brew_Factory_Name__Blues ltable_Brew_Factory_Name__Grill \\\n", "self 0 0.050000 0.05 \n", "post_hoc 0 0.590909 0.50 \n", "\n", " ltable_Brew_Factory_Name__& ltable_Brew_Factory_Name__Brew ... \\\n", "self 0 0.050000 0.05 ... \n", "post_hoc 0 0.681818 NaN ... \n", "\n", " rtable_Beer_Name__Aged rtable_Beer_Name__Jumbo \\\n", "self 0 0.180000 0.760000 \n", "post_hoc 0 0.318182 0.272727 \n", "\n", " rtable_Beer_Name__Love rtable_Brew_Factory_Name__Figure \\\n", "self 0 0.640000 0.500000 \n", "post_hoc 0 0.272727 0.318182 \n", "\n", " rtable_Brew_Factory_Name__Eight \\\n", "self 0 0.500000 \n", "post_hoc 0 0.318182 \n", "\n", " rtable_Brew_Factory_Name__Brewing rtable_Style__Barley \\\n", "self 0 0.600000 0.600000 \n", "post_hoc 0 0.318182 0.318182 \n", "\n", " rtable_Style__Wine rtable_ABV__- ltable_Style__/ \n", "self 0 0.550000 0.100000 NaN \n", "post_hoc 0 0.318182 0.318182 0.681818 \n", "\n", "[2 rows x 30 columns]" ], | |
| "text/html" : [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th></th>\n", " <th>ltable_Beer_Name__Bulleit</th>\n", " <th>ltable_Beer_Name__Bourbon</th>\n", " <th>ltable_Beer_Name__Barrel</th>\n", " <th>ltable_Beer_Name__Aged</th>\n", " <th>ltable_Beer_Name__G'Knight</th>\n", " <th>ltable_Brew_Factory_Name__Oskar</th>\n", " <th>ltable_Brew_Factory_Name__Blues</th>\n", " <th>ltable_Brew_Factory_Name__Grill</th>\n", " <th>ltable_Brew_Factory_Name__&</th>\n", " <th>ltable_Brew_Factory_Name__Brew</th>\n", " <th>...</th>\n", " <th>rtable_Beer_Name__Aged</th>\n", " <th>rtable_Beer_Name__Jumbo</th>\n", " <th>rtable_Beer_Name__Love</th>\n", " <th>rtable_Brew_Factory_Name__Figure</th>\n", " <th>rtable_Brew_Factory_Name__Eight</th>\n", " <th>rtable_Brew_Factory_Name__Brewing</th>\n", " <th>rtable_Style__Barley</th>\n", " <th>rtable_Style__Wine</th>\n", " <th>rtable_ABV__-</th>\n", " <th>ltable_Style__/</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>self</th>\n", " <th>0</th>\n", " <td>0.700000</td>\n", " <td>0.250000</td>\n", " <td>0.200000</td>\n", " <td>0.150000</td>\n", " <td>0.650000</td>\n", " <td>0.050000</td>\n", " <td>0.050000</td>\n", " <td>0.05</td>\n", " <td>0.050000</td>\n", " <td>0.05</td>\n", " <td>...</td>\n", " <td>0.180000</td>\n", " <td>0.760000</td>\n", " <td>0.640000</td>\n", " <td>0.500000</td>\n", " <td>0.500000</td>\n", " <td>0.600000</td>\n", " <td>0.600000</td>\n", " <td>0.550000</td>\n", " <td>0.100000</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>post_hoc</th>\n", " <th>0</th>\n", " <td>0.681818</td>\n", " <td>0.681818</td>\n", " <td>0.590909</td>\n", " <td>0.545455</td>\n", " <td>0.636364</td>\n", " <td>0.681818</td>\n", " <td>0.590909</td>\n", " <td>0.50</td>\n", " <td>0.681818</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>0.318182</td>\n", " <td>0.272727</td>\n", " <td>0.272727</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.318182</td>\n", " <td>0.681818</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>2 rows × 30 columns</p>\n", "</div>" ] | |
| }, | |
| "execution_count" : 52, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 52 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:55:30.655705Z", | |
| "start_time" : "2025-12-04T15:55:30.503424Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "explanations_viz = explanations.copy()\n", "explanations_viz.columns = explanations.columns.str.split('__').str[-1]\n", "explanations_viz.T.plot(kind='bar', stacked=False, figsize=(12, 6), rot=58)" ], | |
| "id" : "fcf69878d4338a74", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ "<Axes: >" ] | |
| }, | |
| "execution_count" : 60, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| }, { | |
| "data" : { | |
| "text/plain" : [ "<Figure size 1200x600 with 1 Axes>" ], | |
| "image/png" : "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Jb3z58/r9u3bdeXKlcayyMhIDQgI0Jw5c2rfvn31zJkzdknLqkuXLtqnTx/jb+t3umTJEg0KCtK33nrLrundTXJyslEgv3z5su7fv1+3b99u0wxl/vz5WrVqVa1cubKWL1/eaNpljyfhiYmJev78eZ02bZrmz59fK1WqpJs3b073fu/n999/Vx8fH+PJ8uDBg9XX11enTZumVatW1bZt26YryBk9erRxs0tOTtZDhw5pWFiYlihRQr28vHTt2rXGtmfOnNGZM2eme+yCn376SfPmzav/+9//9IMPPtABAwZow4YNtVChQlqlShUdNGiQ5s6dWz/44AOH9TW9l2+//VYtFos2atRIu3TpokOHDtVz585px44dtWDBgpnS9F/1drPdDh066Lhx42yW37x5U7ds2aINGzbUcuXK2TXNixcv6qxZs7RcuXJaokQJu9/Ann76aaMgoHr7+r59+3ajlrx9+/Z26QaQ8qHXhg0b1N3dXWNjY7VevXo2rU6+//57rVq1qkObte3evVuLFi2qn3zyiSYkJKRa//bbb6uHh0e6mibGxMTo1KlTdfTo0cY9Z86cOTp9+nSNiIjQYsWKaadOnXT9+vXarVs3bdSokem00mPy5MlGbcqECRO0QoUKGhsbq6q3C4LBwcF2rUG9syC7bds2HT16tFavXl3r16+vH330kfbr10+9vLzsluZ/oeyQMWWHiRMnavXq1XXHjh02gf3y5cu1aNGidm8KfPToUfX399fr16/rwYMHNXfu3EZZJCoqSrt162a33/R+OMdu+/jjj7VIkSKpHhrNmTNHLRaLli9fXhctWmS39K5cuWLzoPLs2bNaq1Yt7datm93SUP334cn48eO1devWmpSUpCVKlNApU6YY20ydOlVbtmx51/vNo2zu3Llao0YNXbZsGTXV6WFttnfhwgWbAm5CQoJu2bJFAwIC1MnJSVu0aKFFihSxeSrvKF9++aW6u7urs7OzvvXWW3ctCKZ3QAxrULhmzRpt1KiRenp6aqVKldTDw8NmEIyFCxdq7ty5bQYySg/rRXL69OmaPXv2VM0+NmzYoO3btzeedjpq0KQ7tWrVSgsVKqQVKlTQFi1a6Ny5c411sbGx+ssvvxjfgZkT7s73pLzpJiUl6e+//64dO3bUbNmyaceOHR12wYqPj9eAgACtWrWqVq9eXRs3bmwUiD75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ddUCBQrY1JD/8MMPmiNHDj116pSqpv1BTocOHfS1116zWXbs2DFjRpyiRYvatETI6BmPHmePVVC9d+9enTBhgs0BkpCQoC+88II+88wz6urqaoxMq6r60ksvaZ06dTI0jydPntQOHTpogwYNdMCAATp//nydOHGi5s2b16a5VVql7J8TGxurK1eu1GLFiulTTz2l8+fPd9jFOT4+XmvUqGHTxPr7779Xf39/rVatmmbLlk27dOliNBVz9KiC1u9h+PDhWqNGDd2xY4deunRJP/vsM+3WrZsWK1ZMX3jhhVRNRtNyUTl//rz27NlTly1bZhRuYmJitHLlysbowxnVFLh9+/Y2I2euXLlSixYtquXLl9ecOXPq008/bXOxNqNRo0b6yiuvGOn8+eefOnLkSD19+rQmJCQYU2C0b99ef/vtt3Sl9bCLjY1VPz8/Xbt2rR46dEhz585tXFOuXbumPXr0MJpzOVrKY3b37t0263bu3KlZs2bVpUuX6qVLl7Rp06batWvXNKeRmJho3NhVVceMGaNFixbV0NBQDQ8PN5rtDR06NF03Zut5u3fvXmMEdetNf8SIEWqxWNTDw0OvXbumMTEx+ttvv2nRokVTjcqbXr/++qs2aNDAaH5dqlQpffXVV+2ahhnW6+aWLVvU3d3d1Aiwj6Jr165pv3791GKxaOfOnW36NV68eNF4iJme+4r12Lt586a+9NJL2q5dO61cubLmzJlTq1atavPQPS4uzmiWm9Ej5FJ2sN/3bb1WfffddxoWFqYhISE2XZb27t2r48eP14oVK2qvXr3smubd/o6Li9MbN27ookWLdN68edqxY8d037cf1JN4jm3cuFE7duyYquvn119/rV5eXurj46PTp09P98CuVtu2bdMyZcpoYGCgTp482ab2f+rUqVq4cGGtW7euLl68WAcMGKBVqlTRMWPGqGravgPrMfXDDz8YlRwpK5Ju3ryp27dv15deeknz58+vbdq0sUv3KfzrsQqqp06dqiVKlNCgoCCbaX127NihlStXVovFou+//77+73//M+ZsdVRz3JRPls6fP68//fSTHj16VK9cuaIxMTE6adIkbdq0qRYsWFCbNm1qt9qP1q1ba7Vq1VT1dmDXt29f42K5Y8cOu406bT15jx49qh4eHmqxWLRXr17GiRwfH6/79+/XU6dO2VwUHPVELOV+Y2NjtUqVKqmaEKVstuzr66uffPKJqbR++uknrVq1qjZo0EBHjRplBJJNmjQx0rxx44YeOHBAFy5cqN27d3fI4GQXLlzQoKAgzZIli3bt2tW4QSQlJel3332nv/76q0ZHR5v6zq3H7zvvvKPlypWzqeEMCgrSHDlyaJMmTfTjjz9W1dtBXK5cudI9qvTDyHr8RkdHa1xcnA4ZMkQnTpyoderUselnt3XrVi1QoIDdbsQPmq/33ntPAwICjPljrYYNG2YEo5UrVzY1qNDbb7+tQUFBunz5cr148aK2aNHCGCRM9XZN8scff6zly5c3BkJL6/Fm3T46Olq9vb21SpUq6uXlZTOdyvvvv6/58+fX4sWLa/Xq1bVSpUrarVu3NH+e+0lKStLr16/r0KFDtW7dutqnTx8tV66cXrly5aF6kj9lyhSj5uxxlvIe+ssvv2iFChW0UKFCOnv2bI2OjrZbOtbftkePHhoUFKSRkZF69epVPXDggLZr106zZMmiISEhxiCQjm6FQtnBsWWHlF22cuXKpbVr19YqVaqkGt0/JiZGv/jiC7s1+7a+/5dfftF3331XX3zxRQ0PD3foaP4Pmidrvp6Uc+znn382Wpvt3LlTV69ebayLiYnRF198UYsUKaJdunTR5cuXm27hldKhQ4f0ueee0ypVqmjXrl11yZIlRpnNOtVlyZIltXXr1sZgZarmjvs+ffroJ598orGxserk5KSVK1e2qVCMiorSZcuWaZ06dTR37txPRCvDjPJYBNXWg+6vv/7SxYsXa4cOHbRChQr68ssvG01IEhMT9aWXXlIPDw/18vLSnj17puvp7n9JWeCtUqWKOjk5aZEiRbRVq1ZGDUxMTIwmJCSku6mkNa3Y2Fjt27dvqr6Mmzdv1nLlymn+/Pl1woQJ6b6IW2thf/75Z23UqJH26NFDO3furCVLltS8efPaXBAyw40bN7R+/fravXv3VOu+/fZbbdWqlQ4cOFDr1Kmjhw4dMpVGdHS0vvbaa1qjRg1t2bKlLlq0SAcNGqR+fn7apUsXLVmypD711FNaq1Yt0/1iHsTly5d1yZIlWqFCBc2dO7fOmTPHWJfeQoi1X27KUaPnzZunBQsW1NWrV2uPHj20Ro0a2q5du0wZFTgjpBzwo379+rpt2zZdtWqV5s2bVy0Wi65Zs0ZPnTqlGzdu1KpVq2bY9B/WQseff/6pOXLk0K+//toYMMV6Pbh69aru2rVLv/nmG9NPoxctWqQBAQFap04dffPNN7Vly5apuhLEx8drq1attFWrVuk65gICArRTp0567do1PXjwoFaqVMl4GHDjxg2NjIzUWbNm6bvvvquHDh1y6Ai51hGPrQ/eHoYxAx73uUOt33FERIRNIdZ6TF27dk2rVatmzHFrzwcd0dHRWqZMGZtrnertLg3du3dXi8WiJUuWtHlY7yiUHTJG27ZtNSwsTOPi4vT8+fM6c+ZMdXNz07Jly9p9+izr9xwREaElS5bUqlWrart27TR//vypZolw5LWGc8xWYmKiBgYGap06dXTq1Kk2Ncjr16/XevXqqaura7pmBkpOTrY5bzZv3qyNGzfWOnXq6MiRI21aBtwZ3Jo5FqwzNXh4eOicOXN027Zt2qVLF7VYLDpgwAAjkE9MTNS9e/fajLqO9HssguoLFy7YNFH87bff9O2339batWtrzZo1bWosr1y54tCRiTds2GAMiHX+/HnNlSuXzpgxQyMjI/W7777TXr16qa+vr37wwQd2T/vVV1/VOnXq6KpVq1RVjekprIYNG6bBwcF2S69UqVI6btw4TUpK0sTERD169Ki+/PLLarFYtG3btjYXKEfW9PTv319v3rxp81nnzp2r1atX12XLltlcqFauXKlt27bVP/74Q/Pnz2/Mi5kWKdNZt26dtmnTRuvVq6flypXTPHny6Pjx43XFihUOHwHb+p0mJSXp0aNH9ZVXXlGLxWK3Jj3btm3TypUra0REhJHW8uXL9dNPPzW2mTp1qhYvXtwojD1MNXr2NGXKFJt+i6dOndKnn35ac+TIoWXKlNHSpUvb9dx6UEOGDNHWrVurqqbq/2ivQdMuXbqkI0eO1Fq1amm2bNm0ffv2qeYrnjdvnlavXj3NteHWPC9btkxz5Mhhc261b99es2XLpv3799c2bdpojRo1dNiwYfr0009rZGSkQ441a3727dun1atXN2aNyCx3FqoehuDekWJjYzVXrlxauXLlu9bGjx49WqdPn27Uupg9Bu4MDuPi4rROnTo286xbv+svvvhChwwZoi+++KLmzZvXYa0EKDs4vuyQcl8ffPCBTaubxMREPXDggPbq1UstFou+8MILdkvXqkqVKvr6669rQkKCJiYm6rlz57Rfv36aLVs2/e6771Ll0RGe5HPMKuVn+u2337Rv375avXp1ffbZZ3XZsmU2zcJTVlSkV+XKlfX06dN66dIlDQ0NNSpl5syZo1FRUXZL59SpU/rss89qrVq1jO/y008/1RIlSuhTTz31WLYofFg8FkH18OHD1WKx2PQzu379uq5cuVL79eunFStW1M6dO+u+ffscmo/IyEi1WCzq7++vERER+sMPP6SqLb1y5YoOHTpU8+bNa9c54Q4cOGA8VevWrZtN4ctezbZSOnLkiJYvXz7VE7wrV64YAz5Y5/tzJOtTOFXbAmd0dLS2bdtWCxYsqEOHDtUFCxbo3LlztWTJkvr666+rqmrv3r11+PDhaUrPmkbKwZESEhJ0+vTpWqtWLW3atKmGh4cbzZjsyZr2zz//fNeRlWNjY/W5554zBjm5M/BJq4MHD6rFYrnrcWotcEVGRmqjRo3sNk/qw8T6fUdHR+tnn32m48aNU1XbG/KGDRt05cqVevDgwQybmi9lHoYPH65t2rRJtTwhIUEnTJigH330kV36Oqve7m/cpUsXLVasmAYHBxs11vv371dfX1+bwlJa+fv7a8WKFY0pg/bs2aPOzs46bNgw3bBhg86ZM0c/+OAD7dq1qz733HOm00mL1atXa65cuXT48OEOGyPh4MGD+sknn+i7776bak5z63dvvb44YhTeh9GJEye0Y8eO6uTkpC+88IJGRkYa655//nmdPHlyuvZ/5coVHTBgQKoHQHPmzNH8+fPrW2+9ZbNu4cKFGhgYqJGRkVqmTBljWjN7ouzg+LKD9Z51+fJlXbFihdatW1dffPHFVNftf/75RxcvXmwMKmWvIPfo0aNaqVKlVPfuGzduaOvWrTP0oeyTeI7dac+ePTYVBAsXLtRGjRpp3bp1dfTo0bpz506b7c0+0LQeP0uXLtXSpUvblMt+/vlnfeaZZ9TPz0/79OmTasq89Pjrr7+0QYMG6ubmZjwgiYyM1MGDB2uWLFm0bt26Djm/n3SPRVC9f/9+nTBhghYtWlSrVatmc2CeOHFCZ82apYGBgVqtWjWbPjOO8Mcff2jLli01W7Zs2qFDB/X19TUCLOtFPS4uTitUqGDXeR5Vb/fpHDVqlBYrVkzr1q1r008kISHBrk9AL126ZAz6dadPP/1Ux44dqxMmTNAyZcqkGkTJnm7dumWMWBkSEqIVKlSweXgye/ZsrVKlivr4+GipUqX0xRdfVNXb30fRokVNT93w4osv6ksvvaR//vmnsez333/X4OBg9fX11VatWukvv/ySjk/2rzsL9Na+bkOHDk3VJHTFihX6yiuv6O+//57udGNiYrRMmTLas2dPm1rPlDeXsLAwrVy5crrTephZR4L18vKy+b0z2t3Oozlz5miZMmV0//79Nud3UlKS+vv7230gr8TERJ0xY4bWqVNHixUrpqVLl9aAgAB95ZVXTO8zOTlZV6xYoW3atNG6devqmDFjtHTp0jYjfaeUkX0QR44cqX369HHIvqOjo7VatWpasWJF9fHx0aCgoLv2Y9ywYYN6enqm66HFw8x6DTt16pTN1D7Lli3TEiVKqIeHhw4ePFi7deumuXLlMh4umB0rYuvWrcbgU9euXTNaFN24cUNHjRql/v7+2qRJEw0PD9c333xT8+bNqx999JGq3h5Vd8SIEen6vPdC2SFjyg4NGzY0mmBbm8RmxHX98uXLWrRoUWMAKtV/j+H33ntPn376aYdNycg5ltqUKVPUYrHYtPz466+/dPjw4ern56dPP/20TT9kM6xlpcuXL+sHH3xgjMidMphNTEzUmTNnaoUKFUxVTljTiIqKMgbKTVlGe+aZZ7R06dJGq4z4+HhdvXq1Tpw40cxHwn94LIJq1dsn7o8//qjPPPOM5smTR5977jmbA3fz5s368ssvq7+/v8Mml095IH/zzTfq5eWlFotFp0yZYlOzefPmTS1RooS+//77ds/D1atXdenSpdqlSxetUKGCDho0yK43jJQX2cWLF2ulSpV09OjRNn2T+/fvr/3799czZ86oh4eHLlq0yG7p30tiYqIuX75cmzVrpvny5dOQkBBj3Y0bN/T48ePG1A2HDh3Szp07p3nkd+uN6fPPP9ciRYrojz/+aBxjKft3fvrpp1q/fn2bp79mnT17Vv39/W2e6lsfFJUvX149PT31yy+/NNZNnz5dW7Zsme50U9aEZsmSRd988009deqUMY9hYmKiRkREaO7cuU1N1/UosF4nLl26pK+99po6OTlp69atU83fmhGio6O1YsWKqdI+dOiQlipVSqtXr67r16/X6OhoPX78uIaGhmqRIkVMp2c91s+fP69r1qzRRYsW6datW431Bw8e1EGDBmmRIkW0RYsWdrnGxMTE6IQJE7RGjRqaN2/eVM3uMmNAn6SkJJv57e0p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26wrXLhwqtYAq1ev1oIFCxqj/2bENIGUHexfdkiZ95T36S1btmj58uU1f/78GhYWZvfp+ZKTk/Wbb74xBl4MDQ21mQ3E+pBs+/btmjVrVpvA2944x1Lv+9SpU9qgQQOtWrWqHj9+XNeuXav9+vXTtm3bqsViSfeo89YHJwcPHtQhQ4Zo48aNtUWLFjaDC16+fFm/+OILbdOmjU3LlLR+pr179+qpU6f05s2bxm+QmJiobdq00YCAAJtxUJAxHougOuV8vatWrdKKFStqwYIFbYbLz4j0586dq56enpo1a1Z97bXXUtUk2mtwgKSkJF2+fLl27dpVExMTdf369VqsWDE9ceKEqqoOHDhQAwMD7dp0cNeuXVqhQgWdMGGCqt6eFiNr1qy6fft2Vb39BNJaW+boQoj1hnDixAmtX7++TSEkIiJCq1Spovnz59eJEyemu3VCjx491MvLS6tVq6be3t7q6empFotFQ0NDjW3OnDmjkydPVjc3N2MwNLOs3521GXKfPn0e2mbIj5s7p3XavXu35smTR3fs2GFsM3bsWPX09NRz585leP42btxojKhqdfPmTV29erUOGDBA3dzcjPPTDOt59eWXX+pTTz1lFLBbtWp111GpmY7DflavXq1PP/207tq1S/fs2aNz585VV1fXdF9PHjY//PCD/vPPPzb3iAEDBqiPj0+qWqpdu3ZpaGiobt++XZ2dndM1zc+ePXvUYrHot99+ayx77bXXtHr16kagai0Mb9u2zdjG0QP6UHZwfNnho48+0nbt2ul3331n04ps3Lhx6uzsrFWrVrXL+BN3sg68WLduXW3RooXNQ8+bN28awZa9cY7Zsn4P27dvN7oJJiUl6ZAhQ/Sll14yyo9nzpyx6Vph5lhM+R5vb2/t1KmThoWFGVPFBQYG2pzb1vyYPe6bNWumFotFmzdvrmPHjtU1a9ao6u0WXq+++qqOHDnSuHc/Tt2nHmaPZFBtLfylbPKY8qD8888/NSAgQC0Wi/r6+mbogEJXr17VF154QQsXLqzdunXTVatW2bWpbMon1db5DsPCwrRr167Gxem9997T4cOHp3uABSvrfufNm6eNGjXSCxcuqL+/v/bt2/euaWTEk/24uDh95513tF27dkb/qJQX53feeUctFoup2jvrfiZNmqRly5bViIgIVb193G3dulVfe+01dXZ21saN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" | |
| }, | |
| "metadata" : { }, | |
| "output_type" : "display_data", | |
| "jetTransient" : { | |
| "display_id" : null | |
| } | |
| } ], | |
| "execution_count" : 60 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:38:03.892640Z", | |
| "start_time" : "2025-12-04T15:38:01.520122Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "expl1 = [r[0] for r in sorted(explanations.iloc[0].to_dict().items(), key=operator.itemgetter(1), reverse=True)]\n", "token_perturb_for_target_label(beers_row, expl1, predict_fn, label=int(prediction.values), k=5)" ], | |
| "id" : "2af6f53ef7514183", | |
| "outputs" : [ { | |
| "name" : "stderr", | |
| "output_type" : "stream", | |
| "text" : [ "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/2637309926.py:2: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " token_perturb_for_target_label(beers_row, expl1, predict_fn, label=int(prediction.values), k=5)\n", " 0%| | 0/1 [00:00<?, ?it/s]/Users/tteofili/dev/ellmer/ellmer/selfexplainer.py:80: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n", " answer = self.llm(messages)\n", "100%|██████████| 1/1 [00:02<00:00, 2.36s/it]\n" ] | |
| }, { | |
| "data" : { | |
| "text/plain" : [ "( ltable_Beer_Name \\\n", " 0 0 0 Bulleit Bourbon Barrel Aged 0 0 ... \n", " \n", " ltable_Brew_Factory_Name ltable_Style ltable_ABV \\\n", " 0 Oskar Blues Grill & Brew American Amber / Red Ale 8.70 % \n", " \n", " rtable_Beer_Name rtable_Brew_Factory_Name \\\n", " 0 0 0 0 0 Bulleit Bourbon Barrel Age... Figure Eight Brewing \n", " \n", " rtable_Style rtable_ABV \n", " 0 Barley Wine - ,\n", " 0)" ] | |
| }, | |
| "execution_count" : 55, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 55 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:38:58.474991Z", | |
| "start_time" : "2025-12-04T15:38:16.737600Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : [ "k_range = 6\n", "res = []\n", "\n", "for i in range(len(explanations)):\n", " expl = explanations.iloc[i]\n", " explainer = expl.name[0]\n", " salient_features = [r[0] for r in sorted(expl.to_dict().items(), key=operator.itemgetter(1), reverse=True)]\n", " for k in range(k_range):\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", " cr = {'prediction': pred, 'perturbed': pert, 'explainer': explainer}\n", " res.append(cr)\n", "\n", "consistency = pd.DataFrame(res)\n" ], | |
| "id" : "3afed76d80884a44", | |
| "outputs" : [ { | |
| "name" : "stderr", | |
| "output_type" : "stream", | |
| "text" : [ "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:02<00:00, 2.11s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:04<00:00, 4.02s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:02<00:00, 2.20s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:02<00:00, 2.67s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:03<00:00, 3.72s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:02<00:00, 2.18s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:01<00:00, 1.35s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:02<00:00, 2.94s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:04<00:00, 4.62s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:07<00:00, 7.05s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:05<00:00, 5.73s/it]\n", "/var/folders/mr/6xnd0hrs6257283btx8ff88r0000gn/T/ipykernel_9919/1240791563.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", " pert, pred = token_perturb_for_target_label(beers_row, salient_features, predict_fn, label=int(prediction.values), k=k)\n", "100%|██████████| 1/1 [00:03<00:00, 3.10s/it]\n" ] | |
| } ], | |
| "execution_count" : 56 | |
| }, { | |
| "metadata" : { | |
| "ExecuteTime" : { | |
| "end_time" : "2025-12-04T15:38:58.513983Z", | |
| "start_time" : "2025-12-04T15:38:58.503571Z" | |
| } | |
| }, | |
| "cell_type" : "code", | |
| "source" : "consistency[['explainer','prediction']].groupby(['explainer']).sum()/k_range", | |
| "id" : "98f451ed7e6bee27", | |
| "outputs" : [ { | |
| "data" : { | |
| "text/plain" : [ " prediction\n", "explainer \n", "post_hoc 0.333333\n", "self 0.000000" ], | |
| "text/html" : [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>prediction</th>\n", " </tr>\n", " <tr>\n", " <th>explainer</th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>post_hoc</th>\n", " <td>0.333333</td>\n", " </tr>\n", " <tr>\n", " <th>self</th>\n", " <td>0.000000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ] | |
| }, | |
| "execution_count" : 57, | |
| "metadata" : { }, | |
| "output_type" : "execute_result" | |
| } ], | |
| "execution_count" : 57 | |
| } ], | |
| "metadata" : { | |
| "kernelspec" : { | |
| "display_name" : "Python 3", | |
| "language" : "python", | |
| "name" : "python3" | |
| }, | |
| "language_info" : { | |
| "codemirror_mode" : { | |
| "name" : "ipython", | |
| "version" : 2 | |
| }, | |
| "file_extension" : ".py", | |
| "mimetype" : "text/x-python", | |
| "name" : "python", | |
| "nbconvert_exporter" : "python", | |
| "pygments_lexer" : "ipython2", | |
| "version" : "2.7.6" | |
| } | |
| }, | |
| "nbformat" : 4, | |
| "nbformat_minor" : 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment