{ "cells": [ { "cell_type": "markdown", "source": [ "# Compare SVM Losses with GridSearchCV\n", "\n", "Due to its compatibility with the scikit-learn API, `GridSearchCV` can be used to compare `SVM`, `Smooth SVM`, and `Squared SVM` losses under a unified pipeline, identify the best loss, and select its optimal hyperparameter." ], "metadata": { "id": "LS0oNHbfk_fh" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "WaRThRkBIA5j" }, "outputs": [], "source": [ "## install rehline\n", "%pip install rehline -q" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "O76jxeIHIALp" }, "outputs": [], "source": [ "## set up plotting style\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "custom_palette = ['#FFE4E1', '#3D325C']\n", "sns.set_palette(custom_palette)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "IDityv5qCrQv" }, "outputs": [], "source": [ "## simulate data\n", "from sklearn.datasets import make_classification\n", "import numpy as np\n", "\n", "n, d = 10000, 5\n", "X, y = make_classification(n_samples=n, n_features=d, random_state=42)\n", "y = 2*y - 1" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 188 }, "id": "JKowJ-3KHCrF", "outputId": "7ac2550b-91a4-4fec-e5f8-8bb406882c19" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "GridSearchCV(cv=5,\n", " estimator=Pipeline(steps=[('scaler', StandardScaler()),\n", " ('clf',\n", " plq_Ridge_Classifier(loss={'name': 'svm'}))]),\n", " param_grid={'clf__C': [0.1, 1.0, 10.0],\n", " 'clf__loss': [{'name': 'svm'}, {'name': 'sSVM'},\n", " {'name': 'squared SVM'}]})" ], "text/html": [ "
GridSearchCV(cv=5,\n",
              "             estimator=Pipeline(steps=[('scaler', StandardScaler()),\n",
              "                                       ('clf',\n",
              "                                        plq_Ridge_Classifier(loss={'name': 'svm'}))]),\n",
              "             param_grid={'clf__C': [0.1, 1.0, 10.0],\n",
              "                         'clf__loss': [{'name': 'svm'}, {'name': 'sSVM'},\n",
              "                                       {'name': 'squared SVM'}]})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "## compare SVM losses via GridSearchCV\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import StandardScaler\n", "from rehline import plq_Ridge_Classifier\n", "from sklearn.model_selection import GridSearchCV\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "pipe = Pipeline([\n", " ('scaler', StandardScaler()),\n", " ('clf', plq_Ridge_Classifier(loss={'name': 'svm'}))\n", "])\n", "\n", "# Define the parameter grid to search\n", "param_grid = {\n", " 'clf__C': [0.1, 1.0, 10.0],\n", " 'clf__loss': [{'name': 'svm'}, {'name': 'sSVM'}, {'name': 'squared SVM'}]\n", "}\n", "\n", "# Create the GridSearchCV object\n", "grid_search = GridSearchCV(pipe, param_grid, cv=5)\n", "grid_search.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "C5_7b71QM9XK", "outputId": "5da96c54-c66c-4887-a03c-1ad75c5006e0" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Overall Best Params: {'clf__C': 0.1, 'clf__loss': {'name': 'svm'}}\n", "Overall Best Score: 0.8922\n" ] } ], "source": [ "# Print the best loss function and score\n", "print(f\"Overall Best Params: {grid_search.best_params_}\")\n", "print(f\"Overall Best Score: {grid_search.best_score_:.4f}\")" ] }, { "cell_type": "code", "source": [ "import seaborn as sns\n", "import pandas as pd\n", "import warnings\n", "import matplotlib.pyplot as plt\n", "warnings.filterwarnings(\"ignore\", \"is_categorical_dtype\")\n", "warnings.filterwarnings(\"ignore\", \"use_inf_as_na\")\n", "\n", "score = grid_search.decision_function(X)\n", "df = pd.DataFrame({'score': score, 'y': y})\n", "sns.histplot(data=df, x=\"score\", hue=\"y\").set_title(\"SVM (C=0.1)\")\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 451 }, "id": "w9S0zkTZk6MW", "outputId": "eed0cc38-eeaf-4cb6-91d4-b241560fccb1" }, "execution_count": 6, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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p06dUsuWLcsdV+fDTkhIiHr06KGMjAwNHz5c0k/hJSMjQ5MmTSpzm9DQUIWGhrq0RUZGVvnY4eHhdfpvkupi3vUL865fmHf9YoV5R0REVDimzocdSZo2bZrGjh2rnj176tprr9XixYt15swZ59NZAACg/rJE2Lnzzjv1ww8/6Omnn5bNZlO3bt308ccfl1q0DAAA6h9LhB1JmjRpktvbVp4WGhqqWbNmlboVZnXMm3nXB8ybedcH9W3eAcZU9LwWAABA3RXo6wIAAABqE2EHAABYGmEHAABYGmEHAABYGmGnDM8884z69OmjRo0auX3ZYG5uroYOHapGjRopJiZGTzzxhC5evFjufo8fP67Ro0crPDxckZGRGj9+vE6fPl0LM6i5zMxMBQQElPnZtm2b2+369+9favxDDz3kxco9o3Xr1qXm8dxzz5W7zfnz55Wamqro6Gg1adJEI0eOLPVmb3/23Xffafz48WrTpo0aNmyodu3aadasWSoqKip3u7p4ztPS0tS6dWuFhYWpd+/e+uKLL8od/8477ygpKUlhYWHq0qWL1q1b56VKPWP+/Pnq1auXmjZtqpiYGA0fPlz79+8vd5uVK1eWOq9hYWFeqtgzZs+eXWoOSUlJ5W5T18+1VPa/vwICApSamlrmeCuc64oQdspQVFSk22+/XRMnTiyz3+FwaOjQoSoqKlJWVpZef/11rVy5Uk8//XS5+x09erR2796tDRs2aM2aNdq8ebMefPDB2phCjfXp00d5eXkunwceeEBt2rRRz57uf3xSkiZMmOCy3YIFC7xUtWfNnTvXZR6TJ08ud/yjjz6qDz/8UO+88442bdqko0ePasSIEV6qtub27dunkpISvfzyy9q9e7cWLVqkFStW6L//+78r3LYunfO3335b06ZN06xZs/Tll1+qa9euGjx4sOxufugwKytLd999t8aPH6+vvvpKw4cP1/Dhw7Vr1y4vV159mzZtUmpqqrZs2aINGzaouLhYgwYN0pkzZ8rdLjw83OW8fv/9916q2HM6d+7sMod//vOfbsda4VxL0rZt21zmvGHDBknS7bff7nYbK5zrcnnm5zitKT093URERJRqX7dunQkMDDQ2m83Ztnz5chMeHm4uXLhQ5r727NljJJlt27Y52z766CMTEBBgjhw54vHaPa2oqMi0aNHCzJ07t9xx/fr1M488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55+blJQU07x5c2O3240x1jzXlzgcDpOQkGCmT59eqs+K57oihJ0yjB07tsx1DRs3bnSO+e6778yQIUNMw4YNTfPmzc1jjz1miouLnf0bN240kszBgwedbT/++KO5++67TZMmTUx4eLgZN26cM0D5q7vvvtv06dOnzL6DBw+6/Lnk5uaavn37mqioKBMaGmquuOIK88QTT5iTJ096seKay8nJMb179zYREREmLCzMdOzY0Tz77LMu63V+OXdjjDl37px5+OGHTbNmzUyjRo3Mrbfe6hIU/F16errbNT2XWOWcL1261CQkJJiQkBBz7bXXmi1btjj7+vXrZ8aOHesy/q9//atp3769CQkJMZ07dzZr1671csU14+68pqenO8f8ct5Tp051/hnFxsaam2++2Xz55ZfeL74G7rzzThMfH29CQkLMZZddZu68806XtWRWPNeXrF+/3kgy+/fvL9VnxXNdkQBjjPHihSQAAACv4j07AADA0gg7AADA0gg7AADA0gg7AADA0gg7AADA0gg7AADA0gg7AADA0gg7AADA0gg7AADA0gg7ACCpqKjI1yUAqCWEHQB+7W9/+5u6dOmihg0bKjo6WikpKTpz5owk6bXXXlPnzp0VGhqq+Ph4l18uz83N1bBhw9SkSROFh4frjjvuUH5+vrN/9uzZ6tatm1555RW1adNGYWFhkqSCggI98MADatGihcLDwzVgwAB9/fXX3p00AI8i7ADwW3l5ebr77rt1//33a+/evcrMzNSIESNkjNHy5cuVmpqqBx98UDt37tQHH3ygK664QpJUUlKiYcOG6fjx49q0aZM2bNig//znP7rzzjtd9n/gwAH9/e9/17vvvqsdO3ZIkm6//XbZ7XZ99NFHysnJ0TXXXKOBAwfq+PHj3p4+AA/hh0AB+K0vv/xSPXr00HfffafExESXvssuu0zjxo3TH/7wh1LbbdiwQUOGDNHBgwfVqlUrSdKePXvUuXNnffHFF+rVq5dmz56tZ599VkeOHFGLFi0kSf/85z81dOhQ2e12hYaGOvd3xRVX6Mknn9SDDz5Yi7MFUFsa+LoAAHCna9euGjhwoLp06aLBgwdr0KBBuu2221RcXKyjR49q4MCBZW63d+9etWrVyhl0JKlTp06KjIzU3r171atXL0lSYmKiM+hI0tdff63Tp08rOjraZX/nzp3Tt99+WwszBOANhB0AfisoKEgbNmxQVlaWPvnkEy1dulS///3vlZGR4ZH9N27c2OX76dOnFR8fr8zMzFJjIyMjPXJMAN5H2AHg1wICAnT99dfr+uuv19NPP63ExERt2LBBrVu3VkZGhm644YZS23Ts2FGHDh3SoUOHXG5jFRQUqFOnTm6Pdc0118hms6lBgwZq3bp1bU0JgJcRdgD4ra1btyojI0ODBg1STEyMtm7dqh9++EEdO3bU7Nmz9dBDDykmJkZDhgzRqVOn9Pnnn2vy5MlKSUlRly5dNHr0aC1evFgXL17Uww8/rH79+qlnz55uj5eSkqLk5GQNHz5cCxYsUPv27XX06FGtXbtWt956a7nbAvBfhB0Afis8PFybN2/W4sWLVVhYqMTERP3pT3/SkCFDJEnnz5/XokWL9Pjjj6t58+a67bbbJP10Negf//iHJk+erL59+yowMFA33XSTli5dWu7xAgICtG7dOv3+97/XuHHj9MMPPyguLk59+/ZVbGxsrc8XQO3gaSwAAGBpvGcHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABYGmEHAABY2v8Hr9x4isIWYzMAAAAASUVORK5CYII=\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "metadata": { "id": "TxnC0FjziZvD" }, "source": [ "## Compare SVM & Smooth SVM & Squared SVM" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eiqipAokiYf5", "outputId": "cbbe18de-d2c8-4f41-a50c-c2617af16171" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " Loss Best C CV Score\n", " svm 0.1 0.8922\n", " sSVM 0.1 0.8920\n", "squared SVM 0.1 0.8913\n" ] } ], "source": [ "## print best results per loss\n", "import pandas as pd\n", "df = pd.DataFrame(grid_search.cv_results_)\n", "df['Loss'] = df['param_clf__loss'].apply(lambda x: x['name'])\n", "df = df.sort_values('mean_test_score', ascending=False)\n", "best = df.drop_duplicates(subset=['Loss'])\n", "table = best[['Loss', 'param_clf__C', 'mean_test_score']].rename(\n", " columns={'param_clf__C': 'Best C', 'mean_test_score': 'CV Score'}\n", ")\n", "\n", "print(table.to_string(index=False))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 160 }, "id": "27SVRgNeIp7G", "outputId": "1f58cb0f-400d-4fcf-fc88-ac6da0685ebf" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAGGCAYAAACUkchWAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZjRJREFUeJzt3Xl4FGXW9/FfAlkIIUGyghJwZZNNUIiMigoExAUJgsAoIOOCAWVTQEQWRRhEcUQWx8cBHWFwQFxBIKAID7shOAGREQWDQBICJiGE7PX+4Us/xlSHJHSqt+/nuvq67Dq1nOqWnO7Td93lYxiGIQAAAAAAAAAAUI6vsxMAAAAAAAAAAMBV0UQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAPFDTpk01dOhQZ6cBuD2a6AAAAICH+eyzz3TbbbcpMjJSQUFBuuqqq9S/f3+tW7dOkvTaa6/Jx8dHGzdutLuPt99+Wz4+Pvr0008lSV27dpWPj4+uvfZa0/UTExPl4+MjHx8frVq1yvEnBQAAakxubq6mTp2q66+/XnXr1lVYWJjatWunp59+WidOnJAktWnTRjExMTIMw+5+unTpoqioKBUXF+vo0aO2zwYvvfSS6fqDBw+Wj4+PgoODa+S8AEehiQ4AAAB4kLlz5+ree++Vj4+PJk2apHnz5ik+Pl4//PCDVqxYIUl68MEH5evrq+XLl9vdz/LlyxUWFqZevXrZlgUGBurw4cPavXt3ufWXLVumwMBAx58QAACoUUVFRbr11lv1yiuv6JZbbtFrr72m5557TjfccIOWL1+u//73v5J+a3gfO3ZMW7duNd3P0aNHtWPHDg0YMEC1a9e2LQ8MDNS//vWvcuufO3dOn3zyCZ8f4BZqX3wVAAAAAO6guLhYL774orp3764NGzaUi2dkZEiSGjVqpNtvv12rV6/WokWLFBAQUGa948ePa8uWLXrsscfk5+dnW3711VeruLhY//rXv3TTTTfZlufn5+ujjz5S79699eGHH9bQ2QEA4D3OnTununXrWnKsjz/+WMnJyVq2bJkGDRpUJpafn6/CwkJJ0qBBgzRp0iQtX75ct956a7n9/Otf/5JhGBo8eHCZ5XfddZdWr16tb7/9Vm3btrUt/+STT1RYWKiePXvqyy+/rIEzAxyHkegAyjl79qxGjx6tpk2bKiAgQJGRkerevbv27t2rkSNHKjg4WHl5eeW2GzhwoKKjo1VSUiLpt7nX7r77bm3evFkdO3ZUnTp11Lp1a23evFmStHr1arVu3VqBgYHq0KGDkpOTrTxNAADcUkV1OjMzUzk5OerSpYvptpGRkbb//vOf/6zs7GytWbOm3HorVqxQaWlpuS/B0m/1/oMPPlBpaalt2Weffaa8vDz179/fAWcIAIBjVVQ7f+/vf/+7rr76atWpU0c33XSTtm7dqq5du6pr1662dZYuXSofHx8dPXq0zLabN2+Wj4+P7fuuJG3dulUPPPCAYmJiFBAQoMaNG2vMmDE6f/58mW2HDh2q4OBg/fjjj7rrrrtUr149Ww0uLS3V66+/rlatWikwMFBRUVF6/PHH9euvv5bZh2EYeumll3TFFVcoKChIt99+uw4cOFCp1+fHH3+UJNPPD4GBgQoJCZEkNW7cWLfeeqtWrVqloqKicusuX75cV199tTp16lRmeWxsrK688spyV8AtW7ZMPXv2VIMGDSqVJ+BMNNEBlPPEE09o0aJFio+P18KFCzV+/HjVqVNHBw8e1IABA3Tu3LlyX7jz8vL02WefqV+/fqpVq5Zt+eHDhzVo0CDdc889mjVrln799Vfdc889WrZsmcaMGaM///nPmj59un788Uf179+/zBdyAABQXkV1OjIyUnXq1NFnn32mM2fOVLifvn37KjAw0HRKl+XLl6tJkyamX6YHDRqkkydPlmkSLF++XHfeeWeZJj0AAK6iotp5wTvvvKPHH39c0dHRmjNnjrp06aJ7771Xx44dq/ZxV65cqby8PI0YMULz589XXFyc5s+fr4cffrjcusXFxYqLi1NkZKTmzp2r+Ph4SdLjjz+uZ555Rl26dNHf/vY3DRs2TMuWLVNcXFyZRvYLL7ygKVOmqG3btnrllVd01VVXqUePHjp37txF82zSpIkk6b333qtwvnPptyldTp8+rfXr15dZnpKSov3795v+AC/99iP8ihUrbPvPzMzUhg0byo18B1yWAQB/EBoaaiQkJJjGSktLjcsvv9yIj48vs/zf//63IcnYsmWLbVmTJk0MScb27dtty9avX29IMurUqWP8/PPPtuVvvfWWIcn46quvHHsyAAB4mIrqtGEYxgsvvGBIMurWrWv06tXLmDlzppGUlGS67gMPPGAEBgYa2dnZtmXff/+9IcmYNGlSmXVvu+02o1WrVoZhGEbHjh2N4cOHG4ZhGL/++qvh7+9vvPvuu8ZXX31lSDJWrlx5qacJAIDDXKx2FhYWGpGRkUa7du2MgoIC2/K///3vhiTjtttusy1bsmSJIck4cuRImX1cqIG//06bl5dX7lizZs0yfHx8ynwfHjJkiCHJmDhxYpl1t27dakgyli1bVmb5unXryizPyMgw/P39jd69exulpaW29Z577jlDkjFkyBC7534hz2bNmhmSjCZNmhhDhw413nnnHSM9Pb3cumfOnDECAgKMgQMHllk+ceJEQ5Jx6NAh27IjR44YkoxXXnnF2L9/vyHJ2Lp1q2EYhrFgwQIjODjYOHfunDFkyBCjbt26FeYIOBsj0QGUU79+fe3atct2B+7f8/Hx0QMPPKC1a9cqNzfXtvyDDz7Q5Zdfrj/96U9l1m/ZsqViY2Ntzy9c1nXHHXcoJiam3PKffvrJoecCAICnqahOS9L06dO1fPlytW/fXuvXr9fkyZPVoUMH3XDDDWVG3Em/TemSn5+v1atX25ZdGJlubySZ9Nto9NWrV6uwsFCrVq1SrVq1dP/99zvg7AAAcLyL1c5vvvlGGRkZeuKJJ+Tv729bPnToUIWGhlb7uHXq1LH997lz55SZmambb75ZhmGYTmc6YsSIMs9Xrlyp0NBQde/eXZmZmbZHhw4dFBwcrK+++kqStHHjRhUWFmrUqFHy8fGxbT969OhK57lr1y4988wzkn6bsmb48OFq2LChRo0apYKCAtu6l112me666y59+umntlHuhmFoxYoV6tixo6677jrTY7Rq1Upt2rSx3WB0+fLluu+++xQUFFSpHAFno4kOoJw5c+Zo//79aty4sW666SZNmzatTHN7wIABOn/+vD799FNJUm5urtauXasHHnigTMGWVKZRLsn2AaRx48amy/84rxsAACjrYnVa+u2S6a1bt+rXX3+1XSqdnJyse+65R/n5+bb1evXqpQYNGpSZ0uVf//qX2rZtq1atWtnN4cEHH1R2dra++OILLVu2THfffbfq1avn+JMFAMABLlY7f/75Z0nStddeW2Y7Pz8/XXXVVdU+bmpqqoYOHaoGDRooODhYERERuu222yRJ2dnZZdatXbu2rrjiijLLfvjhB2VnZysyMlIRERFlHrm5ubYbhtvLPyIiQpdddlmlcg0NDdWcOXN09OhRHT16VO+8846aNWumN998Uy+++GKZdQcPHqxz587pk08+kSRt375dR48erfAHeOm3H+FXrlypw4cPa/v27UzlArdCEx1AOf3799dPP/2k+fPnq1GjRnrllVfUqlUrffHFF5Kkzp07q2nTpvr3v/8t6bebiZ0/f14DBgwot6/fz49emeXGReZfAwDA212sTv9eSEiIunfvrmXLlmnIkCH68ccftWvXLlvcz89P/fv315dffqn09HTt2bNHP/zww0W/BDds2FBdu3bVq6++qi1btvAlGADg0qpSOy/mjwPHLigpKSn3vHv37lqzZo0mTJigjz/+WImJiVq6dKkklbsfWEBAgHx9y7bpSktLFRkZqcTERNPHjBkzqpx/ZTRp0kSPPPKItm3bpvr162vZsmVl4nfffbdCQ0NtP8IvX75ctWrV0oMPPljhfgcOHKjMzEw9+uijCgsLU48ePWokf6Am0EQHYKphw4Z68skn9fHHH+vIkSMKCwvTzJkzbfH+/ftr3bp1ysnJ0QcffKCmTZuqc+fOTswYAADvcbE6baZjx46SpJMnT5ZZPnjwYJWUlOiDDz7Q8uXL5ePjo4EDB140h0GDBmnr1q0KCQnRXXfdVf2TAQDAAhXVzgs31vzhhx/KbFNUVKQjR46UWXZhZHdWVlaZ5RdGg1+QkpKi//73v3r11Vc1YcIE3XffferWrZsaNWpU6ZyvvvpqnT59Wl26dFG3bt3KPdq2bVth/qdOnbqkq70vu+wyXX311eU+OwQEBKhfv37asGGD0tPTtXLlSt1xxx2Kjo6ucH8xMTHq0qWLNm/erAceeEC1a9eudm6A1WiiAyijpKSk3GVlkZGRatSoUZl50AYMGKCCggK9++67Wrdunfr37291qgAAeJ2L1em8vDzt2LHDdNsLo+2aNWtWZnmXLl3UtGlTvf/++/rggw902223lbuc3Ey/fv00depULVy4sMz8sQAAuJLKfMft2LGjIiIitHjxYhUWFtrWW7p0ablm+dVXXy1J2rJlS5lj/P3vfy+z3oWrr39/tbVhGPrb3/5W6dz79++vkpKSctOpSFJxcbEtt27dusnPz0/z588vc7zX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o3z37j0WZwN4D2o3AADuhdoNAIDrqFYTvXHjxtq7d682btyo77//XpLUokULdevWzaHJAQAAx6B2AwDgXqjdAAC4jirNif7ll1+qZcuWysnJkY+Pj7p3765Ro0Zp1KhRuvHGG9WqVStt3bq1pnIFAABVRO0GAMC9ULsBAHA9VWqiv/7663r00UcVEhJSLhYaGqrHH39cr732msOSAwAAl4baDQCAe6F2AwDgeqo0ncu3336rv/71r3bjPXr00Ny5cy85KQAA4BjUbgCoeXuTkzVwwCC78fCIcM1/8w0LM4I7o3YDAOB6qtRET09Pl5+fn/2d1a6tU6dOXXJSAADAMajdAKpq7969eirhSdPYf/97ULd07m5xRq6vqKCowtdl685EC7OBu6N2AwDgeqrURL/88su1f/9+XXPNNabx//znP2rYsKFDEgMAAJeO2g2gqnx9fDR7ymTT2O2977M4G8D7ULsBAHA9VZoT/a677tKUKVOUn59fLnb+/HlNnTpVd999t8OSAwAAl4baDQCAe6F2AwDgeqo0Ev3555/X6tWrdd1112nkyJFq1qyZJOn777/XggULVFJSosmTzUetAAAA61G7AQBwL9RuAABcT5Wa6FFRUdq+fbtGjBihSZMmyTAMSZKPj4/i4uK0YMECRUVF1UiiAACg6qjdAAC4F2o3AACup0pNdElq0qSJ1q5dq19//VWHDx+WYRi69tprddlll9VEfgAA4BJRuwEAcC/UbgBVwU3BgZpX5Sb6BZdddpluvPFGR+YCAABqELUbAAD3Qu0GUBncFLzq9iYna+CAQXbj4RHhmv/mGxZmBFdXpRuLAgAA7zZr1izdeOONqlevniIjI9WnTx8dOnSozDr5+flKSEhQWFiYgoODFR8fr/T09DLrpKamqnfv3goKClJkZKSeeeYZFRcXW3kqAAAAALxUUUGRbunc3e4j81Sms1OEi6GJDgAAKu3rr79WQkKCdu7cqcTERBUVFalHjx46d+6cbZ0xY8bos88+08qVK/X111/rxIkT6tu3ry1eUlKi3r17q7CwUNu3b9e7776rpUuX6oUXXnDGKQEAAAAAUCGnNtEZzQYAgHtZt26dhg4dqlatWqlt27ZaunSpUlNTlZSUJEnKzs7WO++8o9dee0133HGHOnTooCVLlmj79u3auXOnJGnDhg367rvv9P7776td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nZ0KcEmoizWHWltzqN01j88D1nPmZwua6L9TWFioBx54QCNGjDCNl5SUqHfv3iosLNT27dv17rvvaunSpXrhhRcq3O/gwYN14MABJSYm6vPPP9eWLVv02GOP1cQpXNTNN9+skydPlnn85S9/0ZVXXqmOHTtWuO2jjz5aZrs5c+ZYlHXlzJgxo0x+o0aNqnD9MWPG6LPPPtPKlSv19ddf68SJE+rbt69F2Vbs+++/V2lpqd566y0dOHBA8+bN0+LFi/Xcc89ddFtXeZ8++OADjR07VlOnTtXevXvVtm1bxcXFKSMjw3T97du3a+DAgRo+fLiSk5PVp08f9enTR/v377c4c3Nff/21EhIStHPnTiUmJqqoqEg9evTQuXPnKtwuJCSkzPvx888/W5Rx5bVq1apMjv/7v/9rd11Xf58kac+ePWXOJzExUZL0wAMP2N3GHd4nONaHH36ohx56SMOGDdO3336rbdu2adCgQc5Oy2U8++yzatSokbPTcLpLqceepKo13RtU93OBN9mzZ4/eeusttWnTxtmpAJeMulhzqLU1g9ptDT4PWMvpny0MlLNkyRIjNDS03PK1a9cavr6+Rlpamm3ZokWLjJCQEKOgoMB0X999950hydizZ49t2RdffGH4+PgYx48fd3juVVVYWGhEREQYM2bMqHC92267zXj66aetSaoamjRpYsybN6/S62dlZRl+fn7GypUrbcsOHjxoSDJ27NhRAxleujlz5hhXXnllheu40vt00003GQkJCbbnJSUlRqNGjYxZs2aZrt+/f3+jd+/eZZZ16tTJePzxx2s0z+rKyMgwJBlff/213XXs/S1xJVOnTjXatm1b6fXd7X0yDMN4+umnjauvvtooLS01jbvD+wTHKioqMi6//HLjf/7nf5ydiktau3at0bx5c+PAgQOGJCM5OdnZKbmUytRjT1PVmu6NKvO5wJucPXvWuPbaa43ExESX+nwKVAd10XreWGsdjdrtHHweqDmu8NmCkehVsGPHDrVu3VpRUVG2ZXFxccrJydGBAwfsblO/fv0yo7y7desmX19f7dq1q8ZzvphPP/1Up0+f1rBhwy667rJlyxQeHq7rr79ekyZNUl5engUZVt7s2bMVFham9u3b65VXXqlwmp2kpCQVFRWpW7dutmXNmzdXTEyMduzYYUW6VZadna0GDRpcdD1XeJ8K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\n" }, "metadata": {} } ], "source": [ "## plot score distributions for best models\n", "import seaborn as sns\n", "import warnings\n", "import matplotlib.pyplot as plt\n", "warnings.filterwarnings(\"ignore\", \"is_categorical_dtype\")\n", "warnings.filterwarnings(\"ignore\", \"use_inf_as_na\")\n", "\n", "fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n", "for i in range(len(best)):\n", " loss = best['Loss'].iloc[i]\n", " c = best['param_clf__C'].iloc[i]\n", "\n", " pipe = Pipeline([\n", " ('scaler', StandardScaler()),\n", " ('clf', plq_Ridge_Classifier(loss={'name': loss}, C=c))\n", " ])\n", " pipe.fit(X, y)\n", "\n", " score = pipe.decision_function(X)\n", " df = pd.DataFrame({'score': score, 'y': y})\n", " sns.histplot(df, x=\"score\", hue=\"y\", ax=axes[i]).set_title(loss)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }