{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "c:\\Users\\Edouard\\Documents\\Git\\microwave\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Edouard\\Documents\\Git\\microwave\\.venv_microwave\\Lib\\site-packages\\IPython\\core\\magics\\osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n", " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n" ] } ], "source": [ "%cd ..\n", "import microwave.data_analysis.ppscore as pps\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.tree import DecisionTreeRegressor\n", "import seaborn as sns\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "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", " \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", "
ABCDE
002102
110100
220100
301001
410110
500200
600210
701111
820110
922202
1020120
1110120
1221021
1312122
1421001
\n", "
" ], "text/plain": [ " A B C D E\n", "0 0 2 1 0 2\n", "1 1 0 1 0 0\n", "2 2 0 1 0 0\n", "3 0 1 0 0 1\n", "4 1 0 1 1 0\n", "5 0 0 2 0 0\n", "6 0 0 2 1 0\n", "7 0 1 1 1 1\n", "8 2 0 1 1 0\n", "9 2 2 2 0 2\n", "10 2 0 1 2 0\n", "11 1 0 1 2 0\n", "12 2 1 0 2 1\n", "13 1 2 1 2 2\n", "14 2 1 0 0 1" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randint(0,3,size=(15, 4)), columns=list('ABCD'))\n", "df['E'] = df['B']\n", "df" ] }, { "cell_type": "code", "execution_count": 3, "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", "
ppscorecasemetricperfect_scorenaive_scoremodel_scoremodel
00.128681regressionmean_squared_error0.01.0666670.929407DecisionTreeRegressor
\n", "
" ], "text/plain": [ " ppscore case metric perfect_score naive_score \\\n", "0 0.128681 regression mean_squared_error 0.0 1.066667 \n", "\n", " model_score model \n", "0 0.929407 DecisionTreeRegressor " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pps.score(df['A'], df['B'], metric=mean_squared_error, model=DecisionTreeRegressor())" ] }, { "cell_type": "code", "execution_count": 4, "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", "
xppscorecasemetricperfect_scorenaive_scoremodel_scoremodel
0A1.0regressionmean_squared_error0.00.7333330.000000DecisionTreeRegressor
1B0.0regressionmean_squared_error0.00.7333331.211852DecisionTreeRegressor
2C0.0regressionmean_squared_error0.00.7333331.109609DecisionTreeRegressor
3D0.0regressionmean_squared_error0.00.7333330.866667DecisionTreeRegressor
4E0.0regressionmean_squared_error0.00.7333331.211852DecisionTreeRegressor
\n", "
" ], "text/plain": [ " x ppscore case metric perfect_score naive_score \\\n", "0 A 1.0 regression mean_squared_error 0.0 0.733333 \n", "1 B 0.0 regression mean_squared_error 0.0 0.733333 \n", "2 C 0.0 regression mean_squared_error 0.0 0.733333 \n", "3 D 0.0 regression mean_squared_error 0.0 0.733333 \n", "4 E 0.0 regression mean_squared_error 0.0 0.733333 \n", "\n", " model_score model \n", "0 0.000000 DecisionTreeRegressor \n", "1 1.211852 DecisionTreeRegressor \n", "2 1.109609 DecisionTreeRegressor \n", "3 0.866667 DecisionTreeRegressor \n", "4 1.211852 DecisionTreeRegressor " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pps.predictors(df, df['A'], metric=mean_squared_error, model=DecisionTreeRegressor())" ] }, { "cell_type": "code", "execution_count": 5, "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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xyppscorecasemetricperfect_scorenaive_scoremodel_scoremodel
0BE1.000000regressionmean_squared_error0.01.0666670.000000DecisionTreeRegressor
1EB1.000000regressionmean_squared_error0.01.0666670.000000DecisionTreeRegressor
2AB0.197917regressionmean_squared_error0.01.0666670.855556DecisionTreeRegressor
3AE0.197917regressionmean_squared_error0.01.0666670.855556DecisionTreeRegressor
4EC0.197279regressionmean_squared_error0.00.4000000.321088DecisionTreeRegressor
5BC0.197279regressionmean_squared_error0.00.4000000.321088DecisionTreeRegressor
6DB0.154167regressionmean_squared_error0.01.0666670.902222DecisionTreeRegressor
7DE0.154167regressionmean_squared_error0.01.0666670.902222DecisionTreeRegressor
8CB0.134706regressionmean_squared_error0.01.0666670.922980DecisionTreeRegressor
9CE0.134706regressionmean_squared_error0.01.0666670.922980DecisionTreeRegressor
10CA0.000000regressionmean_squared_error0.00.7333331.219813DecisionTreeRegressor
11BA0.000000regressionmean_squared_error0.00.7333331.210204DecisionTreeRegressor
12EA0.000000regressionmean_squared_error0.00.7333331.210204DecisionTreeRegressor
13DA0.000000regressionmean_squared_error0.00.7333331.200963DecisionTreeRegressor
14DC0.000000regressionmean_squared_error0.00.4000000.549704DecisionTreeRegressor
15AC0.000000regressionmean_squared_error0.00.4000000.550000DecisionTreeRegressor
16ED0.000000regressionmean_squared_error0.00.7333331.107861DecisionTreeRegressor
17CD0.000000regressionmean_squared_error0.00.7333331.070089DecisionTreeRegressor
18BD0.000000regressionmean_squared_error0.00.7333331.107861DecisionTreeRegressor
19AD0.000000regressionmean_squared_error0.00.7333331.096296DecisionTreeRegressor
\n", "
" ], "text/plain": [ " x y ppscore case metric perfect_score \\\n", "0 B E 1.000000 regression mean_squared_error 0.0 \n", "1 E B 1.000000 regression mean_squared_error 0.0 \n", "2 A B 0.197917 regression mean_squared_error 0.0 \n", "3 A E 0.197917 regression mean_squared_error 0.0 \n", "4 E C 0.197279 regression mean_squared_error 0.0 \n", "5 B C 0.197279 regression mean_squared_error 0.0 \n", "6 D B 0.154167 regression mean_squared_error 0.0 \n", "7 D E 0.154167 regression mean_squared_error 0.0 \n", "8 C B 0.134706 regression mean_squared_error 0.0 \n", "9 C E 0.134706 regression mean_squared_error 0.0 \n", "10 C A 0.000000 regression mean_squared_error 0.0 \n", "11 B A 0.000000 regression mean_squared_error 0.0 \n", "12 E A 0.000000 regression mean_squared_error 0.0 \n", "13 D A 0.000000 regression mean_squared_error 0.0 \n", "14 D C 0.000000 regression mean_squared_error 0.0 \n", "15 A C 0.000000 regression mean_squared_error 0.0 \n", "16 E D 0.000000 regression mean_squared_error 0.0 \n", "17 C D 0.000000 regression mean_squared_error 0.0 \n", "18 B D 0.000000 regression mean_squared_error 0.0 \n", "19 A D 0.000000 regression mean_squared_error 0.0 \n", "\n", " naive_score model_score model \n", "0 1.066667 0.000000 DecisionTreeRegressor \n", "1 1.066667 0.000000 DecisionTreeRegressor \n", "2 1.066667 0.855556 DecisionTreeRegressor \n", "3 1.066667 0.855556 DecisionTreeRegressor \n", "4 0.400000 0.321088 DecisionTreeRegressor \n", "5 0.400000 0.321088 DecisionTreeRegressor \n", "6 1.066667 0.902222 DecisionTreeRegressor \n", "7 1.066667 0.902222 DecisionTreeRegressor \n", "8 1.066667 0.922980 DecisionTreeRegressor \n", "9 1.066667 0.922980 DecisionTreeRegressor \n", "10 0.733333 1.219813 DecisionTreeRegressor \n", "11 0.733333 1.210204 DecisionTreeRegressor \n", "12 0.733333 1.210204 DecisionTreeRegressor \n", "13 0.733333 1.200963 DecisionTreeRegressor \n", "14 0.400000 0.549704 DecisionTreeRegressor \n", "15 0.400000 0.550000 DecisionTreeRegressor \n", "16 0.733333 1.107861 DecisionTreeRegressor \n", "17 0.733333 1.070089 DecisionTreeRegressor \n", "18 0.733333 1.107861 DecisionTreeRegressor \n", "19 0.733333 1.096296 DecisionTreeRegressor " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pps_mat = pps.matrix(df, metric=mean_squared_error, model=DecisionTreeRegressor())\n", "pps_mat" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mat = pps_mat[[\"x\", \"y\", \"ppscore\"]].pivot(columns='x', index='y', values='ppscore')\n", "_ = sns.heatmap(mat,annot=True,fmt=\".2f\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['B', 'E']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pps.mutual_predictors(pps_mat, threshold=0.9)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv_microwave (3.13.2)", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }