{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Régularisation : réduction des coefficients et parcimonie\n",
        "\n",
        "Un complément à la présentation 14\n",
        "\n",
        "Marcel Turcotte  \n",
        "2026-10-31\n",
        "\n",
        "Ce carnet isole l’effet des pénalités L1 et L2 au carré en régression\n",
        "linéaire. Les vrais coefficients des données synthétiques sont connus;\n",
        "nous pouvons donc les comparer à ceux des moindres carrés ordinaires\n",
        "(OLS), de Ridge et de Lasso. OLS sert de référence sans régularisation;\n",
        "Ridge et Lasso appliquent respectivement L2 et L1. La présentation 14\n",
        "applique les mêmes idées de pénalité aux poids des réseaux de neurones.\n",
        "\n",
        "L’objectif est de distinguer la **réduction des coefficients**\n",
        "(*shrinkage*) de la **parcimonie** (*sparsity*). Cette expérience ne\n",
        "détermine pas quel estimateur prédit le mieux sur de nouvelles données.\n",
        "\n",
        "## Données et modèles\n",
        "\n",
        "Quinze **attributs** (*features*) sont générés, mais seuls trois ont un\n",
        "vrai coefficient non nul. Avant l’ajustement, la **standardisation**\n",
        "(*standardization*) donne à chaque attribut une moyenne empirique nulle\n",
        "et une variance empirique unitaire. Les attributs générés ont déjà des\n",
        "échelles comparables : la standardisation change donc peu les résultats\n",
        "numériques ici, mais elle explicite l’hypothèse de prétraitement."
      ],
      "id": "ea1b1680-2224-4538-87dc-eafada4d9951"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.datasets import make_regression\n",
        "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "X, y, true_coef = make_regression(n_samples=200, n_features=15, n_informative=3,\n",
        "                                 noise=10.0, coef=True, random_state=42)\n",
        "scaler = StandardScaler()\n",
        "X_scaled = scaler.fit_transform(X)\n",
        "\n",
        "# Exprimer les coefficients connus dans les mêmes coordonnées que les modèles ajustés.\n",
        "true_coef_scaled = true_coef * scaler.scale_\n",
        "coefficient_models = {\n",
        "    'OLS': LinearRegression().fit(X_scaled, y),\n",
        "    'Ridge (L2)': Ridge(alpha=10.0).fit(X_scaled, y),\n",
        "    'Lasso (L1)': Lasso(alpha=10.0).fit(X_scaled, y)\n",
        "}"
      ],
      "id": "4d90a8f3"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Pourquoi standardiser?\n",
        "\n",
        "Les unités des attributs influencent les pénalités des coefficients.\n",
        "Multiplier les valeurs d’un attribut par 100 permet de diviser son\n",
        "coefficient par 100 en préservant les prédictions, mais change la\n",
        "pénalité de ce coefficient. La standardisation place les pénalités sur\n",
        "une échelle commune entre les attributs. Elle ne crée pas elle-même la\n",
        "parcimonie associée à L1. Voir la <a\n",
        "href=\"https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html\"\n",
        "class=\"external\" data-icon=\"true\">documentation de StandardScaler</a>.\n",
        "\n",
        "Pour un attribut transformé par $x'_j=(x_j-\\mu_j)/s_j$, le coefficient\n",
        "en coordonnées standardisées est $w'_j=s_jw_j$. Le centrage est absorbé\n",
        "par l’ordonnée à l’origine ajustée. Le graphique et le tableau comparent\n",
        "les **vrais coefficients et les estimations dans ces mêmes coordonnées\n",
        "standardisées** : chaque coefficient décrit la variation prédite de la\n",
        "cible pour une augmentation d’un écart-type de son attribut, tous les\n",
        "autres attributs étant maintenus fixes.\n",
        "\n",
        "Toutes les observations générées servent à l’entraînement dans cette\n",
        "démonstration sur les coefficients. Pour évaluer les prédictions sur des\n",
        "données réservées, ajuster le standardiseur uniquement sur\n",
        "l’entraînement, puis l’utiliser pour transformer la validation et le\n",
        "test; un pipeline scikit-learn conserve ce prétraitement avec le modèle.\n",
        "\n",
        "## Comparer les coefficients\n",
        "\n",
        "Les attributs informatifs et non pertinents utilisent des **échelles\n",
        "verticales distinctes**. L’échelle agrandie du panneau inférieur rend\n",
        "visibles les petits coefficients non nuls. Les cercles ouverts indiquent\n",
        "les coefficients exactement nuls, mesurés avant l’arrondi d’affichage."
      ],
      "id": "82f708f7-12d6-4ebc-9cb9-a3812d507f15"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "image/png": "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\n7pXJ1bImxrvvviuFCxeWF198UUaOHCnh4eGSluzevTvWIMF7770nffr0cTy+e/eutGjRQmrUqCHD\nhg2TyZMnJ3NJAQCIG4EFAACSyffffy/58uUzPRdmzJgRY/0ff/xhGthXr151aXl8cufOLQ0bNpTA\nwEDxBHfKZHVZNaihwYQxY8bImjVrTKAjW7Zskpa89dZb0r9//xjLS5cuLdWqVXM8Xrp0qQlM/fPP\nP/L333/Ll19+mcwlBQAgbv7xrAMAABa5du2a/Prrr/L888+bbvtTp06V//73v471p06dMt3flTYe\n7Q3kYsWKxbq8QYMGptfA/v37pX79+mbZzp07xc/PTypWrCjly5c3je7MmTPH2iDfsWOHBAcHS5ky\nZaKsO3r0qJw8eVLq1asXZfm+ffvMe6hevXqcZdUypUuXTmw2m+myrz0QtPwhISHx1k30suqwDef3\ntX37dhN0KFu2rHl/6tixY2ZIib6XK1eumKBCaGioVKhQwfG6t2/fll27dpnhH+XKlZOMGTNG2W/0\n/TjXn97X165SpYoJnuh20d+LlkF7nlSqVEkyZMgQ5bX1/R8/ftzc17IXKlRIChQo4Ci/0s9Ah4Fc\nv37dlF9lz55dKleuLB06dJAbN26YZVu2bDG9Ouyve+bMGSlRooR5PXXr1i05ePCg6dWgAYmgoKB4\n6xsAAMvZAACAx02ZMsWmf3a3bNli++KLL8z9bdu2Odb/8ssvtlKlSpnlderUsTVs2NDcZs2aFevy\n27dvO15n06ZNtooVK9pq1Khhe+WVV8zr/fjjj2bdmTNnzGP7ths2bLCVLVvWVrlyZVtwcLCtZs2a\ntrNnzzrK8eabb9qyZcsWo/zPPPOMrVy5cvGWVcu0a9cus13u3LnNa+v/nTt3tl28eDHOuomrrNu3\nb7dVqVLF3DJmzGirVauW7erVq2abqVOnmse6nb4f3f9rr70Wpb71fRQpUsRWvHhx8/xx48ZF2W98\n9de+fXtb3bp1Tf2XKFHC7ENfQ997ZGSkrWfPno73WaBAAdv+/fujvPaXX37pqBctZ44cOUydO3/m\nWt5cuXLZMmfO7Nj2+eefN+v09StVqmTuDxo0yFayZElT1nr16pnttBxqxowZttDQUFPGqlWrmvv6\nGQIAkJwILAAAkAy0QaiNQxUWFmbz9/e3vfjii1G2+fbbb03jUde7stzeMNaGu71RnlBjvWPHjo5l\n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\nOR77+flJlixZJF06S0dWAAAAAACAVM6tSID2TsiePbvcvn1b1qxZI8uXL5ejR49Kcrh//75Ht/c2\nd+7ckcuXL5v/04rbd+9I2M3L5v/kQj1RVxxTKXPucf55d11xTFFXHFOcf6kd31PUlbccU2myx4Ia\nP368DBkyRDJnzmwCDefOnTPDIyZMmCCe8O6778pHH30kV65ckerVq8uUKVOkfPnylm3vbS5duiSz\nZs2S1atXmx+g+hnVq1dPunbtKiEhIZIanb9xUSb9O0v+2L9abt29I0H+gdKqZD15tsZjkiuzZ8pM\nPVFXHFMpc+5x/nl3XXFMUVccU5x/fE95x/e54js9dddTauFns9lsiX3S7t27pUaNGvLLL79IixYt\nzLKdO3dK69at5cMPPzQnhpWmTZsmzz33nCxcuNBMZTl06FBZsGCB7Nu3TzJkyJDk7aMnpsyYMaOE\nh4dLcHCwpEX6hfX666+boSk6DWiRIkVMjxKtD+3B8c4771jyxWVljgU9EZ+e87qk90sn3Su1k5K5\nisj+sKMyfdtvcs92X77r/I7kzhwqabGerJQS9aQ4plJXPVnJ248pX6urWm8udns/c4O6W/KdTj25\nVk9ppa5Sg7RST+6ef1ade2mprlIa9URdecsxlRxcbR+7FViYPn26zJs3z0TbovcS0C6a48aNEys1\naNBAqlWrZnogqBs3bkju3Lll5syZ8vDDDyd5e28LLEyaNMkEesaMGWNyX9hdv37dBFm058Z//vOf\nVBVYeOuvL2TDyZ0yrct7kj34f2W+EnFdnpr9mlQvWF7eaPJsmqwnK6VEPSmOqdRVT1by9mPK1+oq\nNQQWqCfX6imt1FVqkFbqKTUEFtJKXaU06om68pZjKjm42j52K8fCgw8+KGfPno2x/PTp02ad1bZv\n3y5Vq1Z1PNbhFyVLljTLk7p9ZGSkqSznm9J4S1q8ad4L7Vql0WLnL3alj3W5rtftkrw/8XP/5vQ6\ntyJvy6L9q010z/lEVPpYl+t63S5N1pNFt5SoJ46pVFpPHFPUVRzHlYj7Nyu+09PK91RK11NaqquU\nvqWleuKY4pjypnMvrZ1/vlhPtmS8WZZj4eLFi3LixAnHY41U6JggnVryiSeeMGODlixZIvPnzzdD\nEKym0c6sWbNGWZYtWzazPKnbjx49WkaNGhVjef78+c1sF2mNfhYNGzY0XdBiU7hwYfPZFSpUyPx/\n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\nsWjcuLFkz57d3Fq3bk0dxSEsLExeffVVKVeunBQtWlQef/xxOXjwIPUVi927d5v6KVy4sKmv119/\nXW7fvk1dxeP777835+CoUaOop1g8+uijju8p+23hwoXUVSxu3rxpvqtKliwpJUqUkHHjxonNZqOu\nnNy7dy/G8aS30NBQuXHjBnUVzezZs6VWrVqSN29eqV+/vqxevZo6EpHnnnvOcewULFgwRp3cv39f\nRo4cKcWKFTPr+/btK9euXfO5urt06VKU8+yDDz5I1HpfMnTo0Ch1Ed22bdvkiSeekCJFipjfV6+9\n9pqEh4enSFnTMgILSJR///1XHnvsMRkwYICsW7dOypYta4ILvviFnpAFCxbI0aNHzR+869evp3Rx\nUi1tHOuPKv2BtWTJErlz5445piIjI1O6aKnO8OHDpWvXrrJmzRqZMmWKzJo1y/zxQ+xOnDghb731\nlhQoUEAiIiKoplhoY+/ll18231X2W4sWLairWBrMbdu2lc2bN8v06dNl+fLlcvnyZfN3EP+TPn36\nKMeS/XiqXbu2ZM6cmapy8scff8iTTz4p//3vf2XTpk3SpUsXadmypRw+fNjn62ns2LHm2Bk/frxc\nuXIlRn2899575m+gBo7//PNPc4Hr6aef9rl6y5Ejh+M80wszt27dStR6X/LGG2+Yevj666/l6tWr\nMdY/++yz0qFDB1m5cqU5tubOnWsCXEgc5gpEonzxxRfmD98zzzxjHn/44Yfy448/mkahfRn+j/1H\nVIYMGaiSeHz55ZdRHr///vtSvHhx02uhTJky1J0T/UNnp43lp556SubNm0cdxUKvJOt3kgYW9EcC\n4hYUFBTrFRz8zy+//CLbt2+XI0eOSLZs2cyyd999lyqKhfOxpFdMNciuvxEQlQaoOnbsaC7WKG3E\n/PDDDzJ58mTTcPZlwcHB5pYxY8ZY10+YMEFGjBgh9erVM48/+eQTE7w6efJkrD0cvJWfn5/jfNOg\nXmLX++IxlSlTpljX6wUbO+0Vquej/h5F4tBjAYmiV2v0y9t5/tdq1arJli1bqElYQq8A6o8J/WJH\n3M6dO2e6rGvvDsQeBNUGc/fu3ameBGiAWIe26RC3jz76SO7evUudRaO9qWrWrGmuemlQr1KlSqau\nGAoRv++++05y5colbdq04ZiKRnvnRb/woN9ZGzdupK7icebMGTl79myU36I1atSQdOnSydatW6k7\n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\n"
          }
        }
      ],
      "source": [
        "series = [('Vrai', true_coef_scaled)] + [\n",
        "    (name, fitted.coef_) for name, fitted in coefficient_models.items()\n",
        "]\n",
        "colors = ['#555555', '#377eb8', '#e68613', '#319354']\n",
        "groups = [\n",
        "    (true_coef != 0, 'Attributs informatifs'),\n",
        "    (true_coef == 0, 'Attributs non pertinents : échelle agrandie')\n",
        "]\n",
        "fig, axes = plt.subplots(2, 1, figsize=(11, 7.5))\n",
        "for ax, (mask, title) in zip(axes, groups):\n",
        "    feature_indices = np.flatnonzero(mask)\n",
        "    positions = np.arange(len(feature_indices))\n",
        "    for offset, ((name, values), color) in enumerate(zip(series, colors)):\n",
        "        x_positions = positions + (offset-1.5)*0.2\n",
        "        nonzero = np.count_nonzero(values)\n",
        "        ax.bar(x_positions, values[mask], width=0.2, color=color,\n",
        "               label=f'{name} : {nonzero}/15 non nuls')\n",
        "        zeros = values[mask] == 0\n",
        "        ax.scatter(x_positions[zeros], values[mask][zeros], s=35,\n",
        "                   facecolors='white', edgecolors=color, zorder=4)\n",
        "    ax.set(xticks=positions, xticklabels=feature_indices, xlabel=\"Indice d'attribut\",\n",
        "           ylabel=\"Coefficient d'attribut standardisé\", title=title)\n",
        "    ax.axhline(0, color='black', linewidth=0.7)\n",
        "    ax.grid(axis='y', alpha=0.2)\n",
        "handles, labels = axes[0].get_legend_handles_labels()\n",
        "fig.legend(handles, labels, loc='upper center', ncol=2)\n",
        "fig.text(0.5, 0.01, 'Les cercles ouverts marquent les zéros exacts; les panneaux ont des échelles verticales distinctes.',\n",
        "         ha='center')\n",
        "fig.tight_layout(rect=(0, 0.035, 1, 0.91))\n",
        "plt.show()"
      ],
      "id": "3ef1cf36"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Attribut        Vrai        OLS      Ridge      Lasso\n",
            "0               0.00     -0.35      0.09      0.00\n",
            "1               0.00     -0.62     -0.75     -0.00\n",
            "2               0.00     -0.07      0.33      0.00\n",
            "3               0.00     -0.53     -1.06     -0.00\n",
            "4               0.00     -1.31     -1.52     -0.00\n",
            "5               0.00      0.66      0.71      0.00\n",
            "6               0.00      0.50      1.07      0.00\n",
            "7               0.00     -0.91     -0.98     -0.00\n",
            "8              23.71     24.13     23.25     15.02\n",
            "9               0.00      0.98      1.27      0.00\n",
            "10              0.00     -0.70     -1.36     -0.00\n",
            "11              0.00     -0.19     -0.55     -0.00\n",
            "12              0.00     -0.72     -1.13     -0.00\n",
            "13            106.95    105.85    100.34     95.86\n",
            "14             79.06     79.87     75.69     69.79\n",
            "\n",
            "Décomptes et parcimonie, avant arrondi : \n",
            "Estimateur    Non nuls    Nuls exacts  Parcimonie\n",
            "OLS                 15              0        0.0%\n",
            "Ridge (L2)          15              0        0.0%\n",
            "Lasso (L1)           3             12       80.0%\n",
            "Vrais indices informatifs : [ 8 13 14]\n",
            "Indices non nuls de Lasso :  [ 8 13 14]"
          ]
        }
      ],
      "source": [
        "print(f\"{'Attribut':<9} {'Vrai':>10} {'OLS':>10} {'Ridge':>10} {'Lasso':>10}\")\n",
        "for index, value in enumerate(true_coef_scaled):\n",
        "    estimates = [fitted.coef_[index] for fitted in coefficient_models.values()]\n",
        "    print(f\"{index:<9} {value:>10.2f}\" + ''.join(f'{estimate:>10.2f}' for estimate in estimates))\n",
        "\n",
        "print('\\nDécomptes et parcimonie, avant arrondi : ')\n",
        "print(f\"{'Estimateur':<12} {'Non nuls':>9} {'Nuls exacts':>14} {'Parcimonie':>11}\")\n",
        "for name, fitted in coefficient_models.items():\n",
        "    nonzero = np.count_nonzero(fitted.coef_)\n",
        "    zeros = len(fitted.coef_) - nonzero\n",
        "    sparsity = 100*zeros/len(fitted.coef_)\n",
        "    print(f'{name:<12} {nonzero:>9} {zeros:>14} {sparsity:>10.1f}%')\n",
        "print('Vrais indices informatifs :', np.flatnonzero(true_coef))\n",
        "print('Indices non nuls de Lasso : ', np.flatnonzero(coefficient_models['Lasso (L1)'].coef_))"
      ],
      "id": "165fa4a6"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Avec ces réglages fixes, OLS et Ridge conservent quinze coefficients non\n",
        "nuls et Lasso en conserve trois, soit 80 % de zéros exacts. Ici, Lasso\n",
        "choisit les trois attributs informatifs. Cet exemple de **sélection\n",
        "d’attributs** (*feature selection*) ne garantit pas la récupération des\n",
        "vrais attributs dans d’autres jeux de données, notamment lorsque les\n",
        "prédicteurs sont corrélés.\n",
        "\n",
        "L2 favorise collectivement de plus petits poids et conserve généralement\n",
        "une solution dense. Elle pénalise la somme des carrés des coefficients;\n",
        "un coefficient individuel n’est pas nécessairement plus petit que son\n",
        "estimation OLS lorsque les prédicteurs sont corrélés. Même des attributs\n",
        "générés indépendamment présentent certaines corrélations dans un\n",
        "échantillon fini.\n",
        "\n",
        "L1 favorise la parcimonie : le point anguleux de la pénalité de valeur\n",
        "absolue à zéro permet à l’optimum de comporter des coefficients\n",
        "exactement nuls, et le solveur de Lasso par descente de coordonnées peut\n",
        "trouver ces solutions parcimonieuses. Ces zéros proviennent du problème\n",
        "d’optimisation. L’arrondi d’affichage ne sert pas à décider si un\n",
        "coefficient est nul. Voir le <a\n",
        "href=\"https://scikit-learn.org/stable/modules/linear_model.html#lasso\"\n",
        "class=\"external\" data-icon=\"true\">guide de Lasso</a>.\n",
        "\n",
        "## Que signifient les coefficients de pénalité?\n",
        "\n",
        "Les deux valeurs `alpha=10` ont été choisies pour une démonstration\n",
        "qualitative. Elles ne représentent pas des pénalités de même intensité.\n",
        "<a\n",
        "href=\"https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html\"\n",
        "class=\"external\" data-icon=\"true\">Ridge</a> minimise\n",
        "\n",
        "$$\n",
        "\\|y-Xw\\|_2^2+\\alpha\\|w\\|_2^2,\n",
        "$$\n",
        "\n",
        "tandis que <a\n",
        "href=\"https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html\"\n",
        "class=\"external\" data-icon=\"true\">Lasso</a> minimise\n",
        "\n",
        "$$\n",
        "\\frac{1}{2N}\\|y-Xw\\|_2^2+\\alpha\\|w\\|_1.\n",
        "$$\n",
        "\n",
        "Ici, $X$ désigne la matrice des attributs standardisés et $w$ leurs\n",
        "coefficients. L’ordonnée à l’origine ajustée est omise de ces\n",
        "expressions compactes et n’est pas pénalisée. Les normalisations de\n",
        "perte et les définitions de pénalité diffèrent; il faut donc interpréter\n",
        "les coefficients de différentes API avant de les comparer.\n",
        "\n",
        "## Lien avec les réseaux de neurones\n",
        "\n",
        "La même idée s’applique aux entrées des matrices de poids d’un réseau.\n",
        "Dans `SimpleMLP`, la fonction objectif est la BCE moyenne plus\n",
        "$\\lambda/2$ fois la somme des carrés des poids, et le gradient ajouté\n",
        "est $\\lambda W$. Les biais ne sont pas pénalisés.\n",
        "\n",
        "L1 favorise des connexions parcimonieuses dans un réseau, mais les mises\n",
        "à jour ordinaires par gradient ne donnent pas nécessairement des zéros\n",
        "exacts. Un attribut d’entrée n’est entièrement déconnecté que si tous\n",
        "ses poids sortants sont nuls; une connexion nulle isolée ne démontre pas\n",
        "sa suppression.\n",
        "\n",
        "## Ce que cette expérience établit\n",
        "\n",
        "Les figures illustrent la réduction des coefficients et la parcimonie.\n",
        "Les trois estimateurs conservent des nombres différents d’attributs; des\n",
        "coefficients visuellement proches sur les attributs informatifs\n",
        "n’établissent pas des performances prédictives égales. Un modèle plus\n",
        "parcimonieux ne prédit pas automatiquement mieux.\n",
        "\n",
        "Pour comparer les prédictions sur de nouveaux exemples, utiliser des\n",
        "jeux d’entraînement, de validation et de test distincts, choisir la\n",
        "pénalité de chaque estimateur avec la validation et rapporter les\n",
        "erreurs finales au test. Une régularisation trop forte peut causer du\n",
        "sous-apprentissage. Ici, les valeurs fixes de pénalité servent la\n",
        "démonstration des coefficients et n’ont pas été choisies pour\n",
        "l’exactitude prédictive.\n",
        "\n",
        "[Retour à la présentation 14](index.qmd)."
      ],
      "id": "ce764c4d-24ec-4de9-9c4e-f4b27e0df8f4"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "path": "/Users/turcotte/.virtualenvs/csi4106/share/jupyter/kernels/python3"
    },
    "language_info": {
      "name": "python",
      "codemirror_mode": {
        "name": "ipython",
        "version": "3"
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.12.12"
    }
  }
}