diff --git a/Alex6022/Scenarios.png b/Alex6022/Scenarios.png index b38ca2a..8368862 100644 Binary files a/Alex6022/Scenarios.png and b/Alex6022/Scenarios.png differ diff --git a/Alex6022/baybe-inhibitor.ipynb b/Alex6022/baybe-inhibitor.ipynb index b4bc81a..028c05c 100644 --- a/Alex6022/baybe-inhibitor.ipynb +++ b/Alex6022/baybe-inhibitor.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -261,7 +261,7 @@ "max 100.000000 " ] }, - "execution_count": 7, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -272,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -354,20 +354,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 39, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/vscode/.local/lib/python3.10/site-packages/baybe/telemetry.py:222: UserWarning: WARNING: BayBE Telemetry endpoint https://public.telemetry.baybe.p.uptimize.merckgroup.com:4317 cannot be reached. Disabling telemetry. The exception encountered was: ConnectionError, HTTPConnectionPool(host='verkehrsnachrichten.merck.de', port=80): Max retries exceeded with url: / (Caused by NameResolutionError(\": Failed to resolve 'verkehrsnachrichten.merck.de' ([Errno -2] Name or service not known)\"))\n", - " warnings.warn(\n", - "/home/vscode/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "from baybe.targets import NumericalTarget\n", "from baybe.objective import Objective\n", @@ -388,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -427,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -450,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -491,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ @@ -528,7 +517,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -553,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 45, "metadata": {}, "outputs": [], "source": [ @@ -575,7 +564,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -586,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -596,50 +585,51 @@ " 0%| | 0/10 [00:00" ] @@ -695,45 +685,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Evalute best results" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index(['Scenario', 'Random_Seed', 'Iteration', 'Num_Experiments',\n", - " 'Efficiency_Measurements', 'Efficiency_IterBest', 'Efficiency_CumBest'],\n", - " dtype='object')\n" - ] - } - ], - "source": [ - "print(results.columns)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use transfer learning on other metals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the training function (i.e. the previously investigated larger data set) and the yet to be optimized data sets." + "# Transfer learning from one metal to another" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -748,16 +705,7 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "unique_SMILES_transfer = df_transfer[\"SMILES\"].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 59, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ @@ -792,7 +740,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 51, "metadata": {}, "outputs": [], "source": [ @@ -803,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -812,14 +760,26 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/1 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count258.000000258.000000258.000000258.000000258.000000
mean161.0910856.5798450.0081030.12740338.761628
std214.5363172.2416080.0143350.177444158.903313
min0.5000000.0000000.0000100.000000-1760.000000
25%24.0000005.4000000.0010000.05000030.000000
50%24.0000007.0000000.0010000.10000057.500000
75%240.0000007.0000000.0100000.10000087.825000
max672.00000010.0000000.1000000.600000100.000000
\n", - "" - ], - "text/plain": [ - " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", - "count 258.000000 258.000000 258.000000 258.000000 \n", - "mean 161.091085 6.579845 0.008103 0.127403 \n", - "std 214.536317 2.241608 0.014335 0.177444 \n", - "min 0.500000 0.000000 0.000010 0.000000 \n", - "25% 24.000000 5.400000 0.001000 0.050000 \n", - "50% 24.000000 7.000000 0.001000 0.100000 \n", - "75% 240.000000 7.000000 0.010000 0.100000 \n", - "max 672.000000 10.000000 0.100000 0.600000 \n", - "\n", - " Efficiency \n", - "count 258.000000 \n", - "mean 38.761628 \n", - "std 158.903313 \n", - "min -1760.000000 \n", - "25% 30.000000 \n", - "50% 57.500000 \n", - "75% 87.825000 \n", - "max 100.000000 " - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fraction_df.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "No objects to concatenate", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[65], line 7\u001b[0m\n\u001b[1;32m 4\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFraction\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m fractions[i]\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# Concatenate the dataframes into a single dataframe\u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m concatenated_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresults_transfer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Print the concatenated dataframe\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(concatenated_df)\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:382\u001b[0m, in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m copy \u001b[38;5;129;01mand\u001b[39;00m using_copy_on_write():\n\u001b[1;32m 380\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 382\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_Concatenator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 386\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 387\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 388\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevels\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevels\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 389\u001b[0m \u001b[43m \u001b[49m\u001b[43mnames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnames\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 390\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify_integrity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify_integrity\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 391\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 392\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 393\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 395\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result()\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:445\u001b[0m, in \u001b[0;36m_Concatenator.__init__\u001b[0;34m(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverify_integrity \u001b[38;5;241m=\u001b[39m verify_integrity\n\u001b[1;32m 443\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;241m=\u001b[39m copy\n\u001b[0;32m--> 445\u001b[0m objs, keys \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_clean_keys_and_objs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;66;03m# figure out what our result ndim is going to be\u001b[39;00m\n\u001b[1;32m 448\u001b[0m ndims \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_ndims(objs)\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:507\u001b[0m, in \u001b[0;36m_Concatenator._clean_keys_and_objs\u001b[0;34m(self, objs, keys)\u001b[0m\n\u001b[1;32m 504\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(objs)\n\u001b[1;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(objs_list) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo objects to concatenate\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 509\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m keys \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 510\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(com\u001b[38;5;241m.\u001b[39mnot_none(\u001b[38;5;241m*\u001b[39mobjs_list))\n", - "\u001b[0;31mValueError\u001b[0m: No objects to concatenate" - ] - } - ], - "source": [ - "# Add an additional column to each dataframe\n", - "fractions = (0.01, 0.2)\n", - "for i, df in enumerate(results_transfer):\n", - " df['Fraction'] = fractions[i]\n", - "\n", - "# Concatenate the dataframes into a single dataframe\n", - "concatenated_df = pd.concat(results_transfer, ignore_index=True)\n", + "results_transfer: list[pd.DataFrame] = []\n", + "fractions = (0.05, 0.1, 0.5, 1)\n", "\n", - "# Print the concatenated dataframe\n", - "print(concatenated_df)" + "for i in fractions:\n", + " fraction_df = df.sample(frac=i)\n", + " training_lookup = [fraction_df for _ in range(N_MC_ITERATIONS)]\n", + " result_transfer_learning = simulate_scenarios(\n", + " {f\"{int(100*i)}\": campaign_transfer},\n", + " df_transfer,\n", + " initial_data=training_lookup,\n", + " batch_size=BATCH_SIZE,\n", + " n_doe_iterations=N_DOE_ITERATIONS,\n", + " impute_mode=\"best\",\n", + " )\n", + " results_transfer.append(result_transfer_learning)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Random_SeedIterationNum_ExperimentsEfficiency_IterBestEfficiency_CumBest
count50.050.0000050.0000050.00000050.000000
mean1337.024.5000025.5000068.42471886.399133
std0.014.5773814.5773823.77539911.036087
min1337.00.000001.000004.39000057.000000
25%1337.012.2500013.2500050.80600078.380000
50%1337.024.5000025.5000079.91000090.000000
75%1337.036.7500037.7500087.32821493.590000
max1337.049.0000050.0000096.20000096.200000
\n", - "
" - ], - "text/plain": [ - " Random_Seed Iteration Num_Experiments Efficiency_IterBest \\\n", - "count 50.0 50.00000 50.00000 50.000000 \n", - "mean 1337.0 24.50000 25.50000 68.424718 \n", - "std 0.0 14.57738 14.57738 23.775399 \n", - "min 1337.0 0.00000 1.00000 4.390000 \n", - "25% 1337.0 12.25000 13.25000 50.806000 \n", - "50% 1337.0 24.50000 25.50000 79.910000 \n", - "75% 1337.0 36.75000 37.75000 87.328214 \n", - "max 1337.0 49.00000 50.00000 96.200000 \n", - "\n", - " Efficiency_CumBest \n", - "count 50.000000 \n", - "mean 86.399133 \n", - "std 11.036087 \n", - "min 57.000000 \n", - "25% 78.380000 \n", - "50% 90.000000 \n", - "75% 93.590000 \n", - "max 96.200000 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "results = " + "results_transfer = pd.concat([result_fresh_start, *results_transfer])" ] }, { @@ -3771,40 +4766,18 @@ } ], "source": [ + "results_transfer.rename(columns={\"Scenario\": \"% of data used\"}, inplace=True)\n", "\n", "ax = sns.lineplot(\n", - " data=result_fraction,\n", - " marker=\"o\",\n", - " markersize=10,\n", - " x=\"Num_Experiments\",\n", - " y=\"Efficiency_CumBest\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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HGYy/awtW7bgvvvug0ajQc+ePfHbb7/hwIED6NGjB7y9vREXF4c///zT4ud/+OGH6NChA9RqNdq3b4/333/ffM503a+//hr9+vWDp6cnunbtir179wIAdu3ahfHjx0On05l7rt566y0AwPvvv4/IyEio1WoEBgbiscces+reEzV0DDNEDYhcLseiRYuwcuVK/P777zZf58cff8SlS5fw888/45133sHcuXPx0EMPwd/fH2lpaZg4cSJeeOGFev2MylasWIHCwkLMmDEDAPDmm28iPz8f7733nkW7119/Ha+99hoOHz6MmJgYDB06FFeuXAEA5Ofno3///ujWrRsOHjyIHTt2IDc3F0888YTFNdavXw+lUok9e/ZgzZo1NdY0d+5czJo1C7/++isUCgVGjx6N6dOn491338V///tfnDlzBnPmzDG337BhA+bMmYOFCxfi1KlTWLRoEWbPno3169dbXPfNN9/EtGnTcOTIEbRt2xajRo1CRUUF7r33XixfvhxardbcczVt2jQcPHgQkyZNwvz583H69Gns2LEDffr0qdf9JmpwnLY/NxE51NixY8Vhw4aJoiiK99xzjxgfHy+Koihu3bpVNP2nPnfuXLFr164W37ds2TIxLCzM4jphYWGiwWAwH2vXrp143333mb+uqKgQvby8xE2bNtWpNgCiWq0Wvby8LD7nz583t/nll19EDw8Pcfbs2aJCoRD/+9//ms9lZWWJAMTFixebj5WXl4t33HGHuGTJElEURXHBggXiwIEDLX7uxYsXRQDi6dOnRVEUxb59+4rdunWrtr6tW7da/KwPP/zQfH7Tpk0iADElJcV8LDExUWzXrp3564iICHHjxo0W112wYIEYExNT43VPnDghAhBPnToliqIoJiUlib6+vhbX+Oqrr0StVivq9foqdRPRdQrJUhQROcySJUvQv39/TJs2zabv79SpE2Symx23gYGB6Ny5s/lruVyOpk2b4vLly3W+5rJlyxAbG2txLCQkxPznmJgYTJs2DQsWLMAbb7yB3r17V7lGTEyM+c8KhQI9evTAqVOnAABHjx7FTz/9BG9v7yrfl5mZibZt2wIAunfvXqd6u3TpYv5zYGAgACAqKsrimOn3LywsRGZmJp599lk8//zz5jYVFRXw9fWt8brBwcEAgMuXL6N9+/bV1vHAAw8gLCwMrVu3xuDBgzF48GA88sgj8PT0rNPvQdQYMMwQNUB9+vTBoEGDMHPmTIwbN858XCaTQRRFi7bl5eVVvt/Dw8Pia0EQqj1mNBrrXFNQUBDatGlT43mj0Yg9e/ZALpfjzJkzdb6uSUFBAYYOHYolS5ZUOWcKDQDg5eVVp+tV/n1Nb4Pdesz0+xcUFAAAPvjgA0RHR1tcRy6X3/a6td1HHx8f/Prrr9i1axe+//57zJkzB2+99RYOHDjAN5+IbuCcGaIGavHixfj222/NE0wBICAgADk5ORaB5siRIxJUV9Xf//53/O9//0Nqaip27NhR7QTjffv2mf9cUVGBQ4cOoUOHDgCAu+66CydOnECrVq3Qpk0bi09dA4ytAgMDERISgrNnz1b52eHh4XW+jlKphMFgqHJcoVAgNjYWS5cuRXp6Os6dO4cff/zRnr8CkVtjzwxRAxUVFYUxY8ZgxYoV5mP3338//vzzTyxduhSPPfYYduzYge3bt0Or1Tq8nvz8fOTk5Fgc8/HxgZeXFw4fPow5c+bgyy+/RK9evfDOO+/g1VdfRd++fdG6dWtz+1WrViEyMhIdOnTAsmXLkJeXh/j4eABAQkICPvjgA4waNQrTp09HkyZNcObMGWzevBkffvhhlR4Se5s3bx4mTZoEX19fDB48GKWlpTh48CDy8vIwderUOl2jVatWKCgoQEpKCrp27QpPT0/8+OOPOHv2LPr06QN/f3/85z//gdFoRLt27Rz6+xC5E/bMEDVg8+fPtxjC6NChA95//32sWrUKXbt2xf79+22eV2Ot8ePHIzg42OKzcuVKlJSU4KmnnsK4ceMwdOhQAMCECRPQr18/PP300xY9FYsXL8bixYvRtWtX7N69G9988w2aNWsG4Pr8mz179sBgMGDgwIGIiorC5MmT4efnZzH/x1Gee+45fPjhh0hKSkJUVBT69u2LdevWWdUzc++992LixIl48sknERAQgKVLl8LPzw9ff/01+vfvjw4dOmDNmjXYtGkTOnXq5MDfhsi9COKtA+hERC7m3LlzCA8Px+HDh6usk0NExJ4ZIiIicmsMM0RUL4sWLYK3t3e1H1fY74iIGj4OMxFRvVy9ehVXr16t9pxGo0GLFi2cXBERNTYMM0REROTWOMxEREREbo1hhoiIiNwawwwRERG5NYYZIiIicmsMM0REROTWGGaIiIjIrTHMEBERkVtjmCEiIiK39v9zIb8V8A0DiwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ax = sns.lineplot(\n", - " data=result_transfer_learning,\n", + " data=results_transfer,\n", " marker=\"o\",\n", " markersize=10,\n", " x=\"Num_Experiments\",\n", " y=\"Efficiency_CumBest\",\n", - ")" + " hue=\"% of data used\"\n", + ")\n", + "\n", + "plt.savefig(\"TransferLearning.png\")" ] } ],