{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "6HttM9ZponV3" }, "source": [ "# SVM\n", "[![Slides](https://img.shields.io/badge/🦌-ReHLine-blueviolet)](https://rehline-python.readthedocs.io/en/latest/)\n", "\n", "SVMs solve the following optimization problem:\n", "$$\n", " \\min_{\\mathbf{\\beta} \\in \\mathbb{R}^d} \\ C \\sum_{i=1}^n ( 1 - y_i \\mathbf{\\beta}^\\intercal \\mathbf{x}_i )_+ + \\frac{1}{2} \\| \\mathbf{\\beta} \\|_2^2\n", "$$\n", "where $\\mathbf{x}_i \\in \\mathbb{R}^d$ is a feature vector, and $y_i \\in \\{-1, 1\\}$ is a binary label.\n", "\n", "> **Note.** Since the hinge loss is a plq function, we can optimize it using `rehline.plq_Ridge_Classifier`. \n", "> Moreover, this wrapper adapts the `plqERM_Ridge` into a classifier, compatible with the scikit-learn API." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "EeKZkco6pZ6P" }, "outputs": [], "source": [ "## install rehline\n", "%pip install rehline -q" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "OW25uH0Trqxn" }, "outputs": [], "source": [ "## set up plotting style\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "custom_palette = [\"#FFE4E1\", \"#3D325C\"]\n", "sns.set_palette(custom_palette)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "NVVj0auob6c6" }, "outputs": [], "source": [ "## simulate data\n", "import numpy as np\n", "from sklearn.datasets import make_classification\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "scaler = StandardScaler()\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\n", "X = scaler.fit_transform(X)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 80 }, "id": "WpgI_saqFj-r", "outputId": "99ff09a9-0574-477b-ab4f-2f844936fa73" }, "outputs": [ { "data": { "text/html": [ "
plq_Ridge_Classifier(loss={'name': '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.
" ], "text/plain": [ "plq_Ridge_Classifier(loss={'name': 'svm'})" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## solve SVM via `plq_Ridge_Classifier`\n", "import warnings\n", "\n", "from rehline import plq_Ridge_Classifier\n", "\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "clf = plq_Ridge_Classifier(loss={\"name\": \"svm\"}, C=1.0)\n", "clf.fit(X=X, y=y)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 451 }, "id": "x2PIL0esFrQ6", "outputId": "885c1f16-af12-40ac-ae2d-40bd913e7b67" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import warnings\n", "\n", "import pandas as pd\n", "import seaborn as sns\n", "\n", "warnings.filterwarnings(\"ignore\", \"is_categorical_dtype\")\n", "warnings.filterwarnings(\"ignore\", \"use_inf_as_na\")\n", "\n", "score = clf.decision_function(X)\n", "df = pd.DataFrame({\"score\": score, \"y\": y})\n", "sns.histplot(df, x=\"score\", hue=\"y\").set_title(\"SVM\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "CM7MOVXrtBQ2" }, "source": [ "## With Pipeline\n", "`plq_Ridge_Classifier` can be integrated into a scikit-learn Pipeline to streamline preprocessing including scaling." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "_MKFw7E4pF1b" }, "outputs": [], "source": [ "## simulate data\n", "from sklearn.datasets import make_classification\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import StandardScaler\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": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 155 }, "id": "VHj2Y6zOLb1M", "outputId": "e4c560ed-70d0-4dae-e0c4-21f2deb702d5" }, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('scaler', StandardScaler()),\n",
       "                ('clf', plq_Ridge_Classifier(loss={'name': '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.
" ], "text/plain": [ "Pipeline(steps=[('scaler', StandardScaler()),\n", " ('clf', plq_Ridge_Classifier(loss={'name': 'svm'}))])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## solve SVM via `plq_Ridge_Classifier`\n", "from rehline import plq_Ridge_Classifier\n", "\n", "pipe = Pipeline([(\"scaler\", StandardScaler()), (\"clf\", plq_Ridge_Classifier(loss={\"name\": \"svm\"}, C=1.0))])\n", "pipe.fit(X=X, y=y)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 451 }, "id": "ogQFzB34LdvI", "outputId": "8f08ba52-fb13-49e1-c6c6-994e4daddd7a" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import warnings\n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "\n", "warnings.filterwarnings(\"ignore\", \"is_categorical_dtype\")\n", "warnings.filterwarnings(\"ignore\", \"use_inf_as_na\")\n", "\n", "score = pipe.decision_function(X)\n", "df = pd.DataFrame({\"score\": score, \"y\": y})\n", "sns.histplot(df, x=\"score\", hue=\"y\").set_title(\"SVM\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "6D9y1VfwMEL5" }, "source": [ "## Hyperparameter Tuning with GridSearchCV\n", "\n", "Due to its compatibility with the scikit-learn API, `GridSearchCV` can be applied to determine the optimal hyperparameters for the ReHLine model." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ln5yeSHzMALz", "outputId": "9913da34-80df-4dc4-eba2-2ee4c490f76e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best Parameters: {'clf__C': 0.1}\n", "Best CV Accuracy: 0.8922\n" ] } ], "source": [ "from sklearn.exceptions import ConvergenceWarning\n", "from sklearn.model_selection import GridSearchCV\n", "\n", "warnings.filterwarnings(\"ignore\", category=ConvergenceWarning)\n", "\n", "# Define the parameter grid to search\n", "param_grid = {\"clf__C\": [0.1, 1.0, 10.0]}\n", "\n", "# Create the GridSearchCV object\n", "grid_search = GridSearchCV(pipe, param_grid, cv=5)\n", "grid_search.fit(X, y)\n", "\n", "# Print the best parameters and score\n", "print(f\"Best Parameters: {grid_search.best_params_}\")\n", "print(f\"Best CV Accuracy: {grid_search.best_score_:.4f}\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 451 }, "id": "LYkflLvuMcrB", "outputId": "ba2062b4-f12e-46df-d926-57dae46e3ca5" }, "outputs": [ { "data": { "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=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import warnings\n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "\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": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }