{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " ARTIFICIAL INTELLIGENCE (E016350A)
\n", "ALEKSANDRA PIZURICA
\n", "GHENT UNIVERSITY
\n", "AY 2024/2025
\n", "Assistant: Nicolas Vercheval\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Regularization - part II" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from matplotlib import pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sklearn import linear_model" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "np.random.seed(23)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us consider one synthetically made dataset with 100 instances, where the attributes are correlated. We will see how this affects the coefficients of the regression model if we are using different regularizations." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "N = 100\n", "\n", "X1 = np.random.uniform(-1, 1, N)\n", "X2 = np.random.uniform(-1, 1, N)\n", "\n", "# there is a linear dependence between the first and the second attribute\n", "# between the first and the second attribute, there is a small difference given by noise with normal distribution N(0, 1)\n", "X = np.vstack([X1, 4*X1, X1 + np.random.normal(0, 1, N), X2]).transpose()\n", "\n", "# the value of the target variable is a linear combination of X1 and X2\n", "y = (2 + np.random.normal(size=N))*X1 + (3 + np.random.normal(size=N))*X2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we want to see the behaviour of the model's coefficients, we will use the entire set for training. Also, we will not worry about choosing the optimal values of the hyperparameters." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Linear regression" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LinearRegression()
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": [ "LinearRegression()" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = linear_model.LinearRegression()\n", "model.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.909655056851071" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.score(X, y)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.10157081, 0.40628325, 0.07855786, 2.88608866])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.coef_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Ridge regression (Tikhonov regularization)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Ridge(alpha=1)
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": [ "Ridge(alpha=1)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridge_model = linear_model.Ridge(alpha=1)\n", "ridge_model.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9091046881180479" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridge_model.score(X, y)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.1014664 , 0.40586562, 0.08171459, 2.79989083])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridge_model.coef_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Lasso regression (linear regression with $\\ell_1$ regularization)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Lasso(alpha=0.1)
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": [ "Lasso(alpha=0.1)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lasso_model = linear_model.Lasso(alpha=0.1)\n", "lasso_model.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9012938600028955" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lasso_model.score(X, y)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0. , 0.43124743, 0. , 2.58888578])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lasso_model.coef_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. ElasticNet regression (linear regression with $\\ell_1$ and $\\ell_2$ regularization)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ElasticNet(alpha=0.05)
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": [ "ElasticNet(alpha=0.05)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elastic_model = linear_model.ElasticNet(alpha=0.05, l1_ratio = 0.5)\n", "elastic_model.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9038924395832105" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elastic_model.score(X, y)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0. , 0.43089877, 0.06302158, 2.61115069])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elastic_model.coef_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualization of the model coefficients" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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hhEiIiISFcMIERERiYphhIiIiETFMEJERESiYhghIiIiUTGMEBERkagYRoiIiEhUDCNEREQkKoYRIiIiEhXDCBEREYmKYYSIiIhExTBCREREomIYISIiIlExjBAREZGoGEaIiIhIVAwjREREJCqGESIiIhIVwwgRERGJimGEiIiIRMUwQkRERKJiGCEiIiJRMYwQERGRqBhGiIiISFQMI0RERCQqhhEiIiISFcMIERERiYphhIiIiETFMEJERESiYhghIiIiURkcRk6cOIERI0agffv2kEgkiI6Ofuo6cXFx6N27N8zNzdGlSxdERETUoFQiIiJqigwOI0VFRfD09MSXX35ZrfaZmZkYPnw4BgwYgJSUFMyePRtvv/02Dh8+bHCxRERE1PS0MHSFoUOHYujQodVuv3nzZri6umLNmjUAAHd3dyQkJGDdunUICAgwdPdERETUxNT7mJGkpCQMGjRIZ15AQACSkpL0rlNcXIz8/HydiYiIiJqmeg8jCoUC9vb2OvPs7e2Rn5+Phw8fVrpOeHg4ZDKZdpLL5fVdJhEREYmkQV5Ns3DhQiiVSu2UnZ0tdklERERUTwweM2IoBwcH5OXl6czLy8uDlZUVWrduXek65ubmMDc3r+/SiIiIqAGo954Rb29vxMbG6syLiYmBt7d3fe+aiIiIGgGDw0hhYSFSUlKQkpICQHPpbkpKCrKysgBoTrGEhIRo20+dOhUZGRn46KOP8Ntvv+Grr77C7t27MWfOnLr5DoiIiKhRMziMnD59Gr169UKvXr0AAHPnzkWvXr2wZMkSAEBubq42mACAq6sr/v3vfyMmJgaenp5Ys2YNtmzZwst6iYiICAAgEQRBELuIp8nPz4dMJoNSqYSVlZXY5RAREVE1VPfzu0FeTUNERETNB8MIERERiYphhIiIiETFMEJERESiYhghIiIiUTGMEBERkagYRoiIiEhUDCNEREQkKoYRIiIiEhXDCBEREYmKYYSIiIhExTBCREREomIYISIiIlExjBAREZGoGEaIiIhIVAwjREREJCqGESIiIhIVwwgRERGJimGEiIiIRMUwQkRERKJiGCEiIiJRMYwQERGRqBhGiIiISFQMI0RERCQqhhEiIiISFcMIERERiYphhIiIiETFMEJERESiYhghIiIiUTGMEBERkagYRoiIiEhUDCNEREQkKoYRIiIi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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "number_of_features = X.shape[1]\n", "plt.xticks(np.arange(0, number_of_features), ['A1', 'A2', 'A3', 'A4'])\n", "plt.scatter(np.arange(0, number_of_features), model.coef_, color='red', marker='o', label='no regularization' )\n", "plt.scatter(np.arange(0, number_of_features), ridge_model.coef_, color='blue', marker='x', label='l2 regularization')\n", "plt.scatter(np.arange(0, number_of_features), lasso_model.coef_, color='orange', marker='v', label='l1 regularization')\n", "plt.scatter(np.arange(0, number_of_features), elastic_model.coef_, color='green', marker='^', label='l1 + l2 regularization')\n", "plt.legend(loc='best')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the presense of the $\\ell_1$ regularization brings the coefficients the attribute $A_1$ to zero." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.9" } }, "nbformat": 4, "nbformat_minor": 4 }