{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

TP2: Modèles linéaires
\n", " Perceptron, Adaline, Regression Logistique et SVM

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous allons nous intéresser à l'implémentation des modèles du perceptron ('p'), de l'Adline ('a') , de la regression logistique ('r') et des SVM ('s') dont les pseudo-codes puvent être résumés comme suit:\n", "\n", "`input: Train, eta, m, MaxEp, modele\n", "init : w\n", "epoque=0\n", "while epoque<=MaxEp\n", " err=0\n", " for i in 1:m\n", " choisir un exemple (x,y) de Train de façon aléatoire\n", " h <- w*x\n", " if((modele = 'a') or (modele = 'r'))\n", " w <- w - eta*grad(L(w))\n", " elif((modele = 'p') and (y*h <= 0))\n", " w <- w - eta*grad(L(w))\n", " elif((modele = 's') and (1-y*h >= 0))\n", " w <- w - eta*grad(L(w))\n", " epoque <- epoque+1\n", "output: w`\n", "\n", "Pour une fonction de prédiction $h_\\mathbf{w}(\\mathbf{x})=w_0+\\langle \\mathbf{w},\\mathbf{x}\\rangle$; $\\mathcal{L}(\\mathbf{w})$ est la fonction de coût qui dans le cas de \n", "- Perceptron: $\\mathcal{L}(\\mathbf{w})=(-y*h_\\mathbf{w}(\\mathbf{x}))$,\n", "- Adaline: $\\mathcal{L}(\\mathbf{w})=(y-h_\\mathbf{w}(\\mathbf{x}))^2$,\n", "- Régression logistique: $\\mathcal{L}(\\mathbf{w})=\\log(1+e^{-yh_\\mathbf{w}(\\mathbf{x})})$,\n", "- SVM: $\\mathcal{L}(\\mathbf{w})=\\max(0,1-y*h_\\mathbf{w}(\\mathbf{x}))$\n", "\n", "$grad(\\mathcal{L}(\\mathbf{w}))$ est le gradient de la fonction $\\mathcal{L}(\\mathbf{w})$ dont on a vu les expressions pour ces modèles en TD.\n", "\n", "\n", "Question 1: Créer une liste de 4 éléments correspondant à l'exemple ET logique; chaque élément de la liste est une liste dont la dernière caractéristique est la classe de l'exemple et les premières caractéristiques leurs coordonnées." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 2: Coder le programme du Perceptron (modele = 'p').\n", "\n", "Indication: Vous pouvez écrire une fonction qui calcule le produit scalaire entre un exemple $\\mathbf{x}=(x_1,\\ldots,x_d)$ et le vecteur poids $\\mathbf{w}=(w_0,w_1,\\ldots,w_d)$:\n", "$\\langle \\mathbf{w},\\mathbf{x} \\rangle=w_0+\\sum_{j=1}^d w_j x_j$; et une autre qui pour une matrice de données qui n'ont pas servi à apprendre le vecteur poids $\\mathbf{w}$ (i.e. la base Test), calcule le taux d'erreur sur cette base." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 3: Appliquer le programme du perceptron sur la base du ET logique, calculer le taux d'erreur du modèle sur cette base.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 4: Coder les modèles Adaline ('a'), Régression Logistique ('r') et SVM ('s') et reporter leur erreur sur le problème jouet de ET logique.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 5: Nous allons maintenant nous intéresser au comportement de ces modèles sur la base sonar de la collection UCI (http://archive.ics.uci.edu/ml/index.php). Cette base contient 208 exemples en dimension 60 séparés par `,` et la dernière élément correspond à la classe de l'exemple.\n", "\n", " 1. Télécharger la collection avec la fonction read_table de la librairie pandas (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html). Les options nécessaires sont `sep=','` et `header=None` \n", " 2. Créer une liste de listes correspondant à la collection; pour cela initialiser la première liste et en parcourant chaque ligne de la matrice de données; créer une liste associée en remplaçant le dernier élément par `-1` ou `+1` et insérer la dans la première liste. \n", " Indication: Utiliser la fonction `loc`. \n", " 3. Scinder la liste en deux listes `x_train` (75%) and `x_test` (25%) en la mélangeant aléatoirement au préalable. \n", " Indication: Utiliser les fonctions `shuffle` de la librairie `random` et `train_test_split` de la librairie `sklearn.model_selection` \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 6: Appliquer ces modèles sur cette base en prenant comme $MaxEp=500$, le pas d'apprentissage $\\eta=0.1$ et en choisissant les bases Train et Test de façon aléatoire; Reporter l'erreur moyenne de ces modèles obtenues sur les 20 bases Test? " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " | Collection | Adaline | Perceptron | Régression Logistique | SVM |\n", " |------------|-------------|-------------|-----------------------|-----|\n", " | SONAR | | | | |\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous allons étudier l'impact de la nomralisation sur les prédictions. Pour cela nous considérons deux stratégies de normalisation communément utilisées dans la littérature:\n", "* Stratégie max: consiste à normaliser chaque caractéristique du vecteur réprésentatif d'une observation par la valeur maximale de cette caractéristiques\n", "* Stratégie norme: consiste à normaliser chaque caractéristique du vecteur réprésentatif d'une observation par la norme de ce vecteur.\n", "\n", "Nous considérons ces trois autres collections de la base UCI:\n", "\n", " * https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29\n", " * https://archive.ics.uci.edu/ml/datasets/spambase\n", " * https://archive.ics.uci.edu/ml/datasets/ionosphere\n", "\n", "Question 7: Ecrire une fonction qui prend en entrée la collection des données et qui retourne la collections normalisée suivant les stratégies max et norme. \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Question 8: Compléter les tableaux comparatifs suivants en repertant les erreurs moyennes sur 20 lancements des modèles de Perceptron, de l'Adaline, de la Régression Logistique et des SVM pour les trois cas:\n", "\n", " '*' Les vecteurs ne sont pas normalisés\n", " \n", " | Collection | Adaline | Perceptron | Régression Logistique | SVM |\n", " |------------|-------------|-------------|-----------------------|-----|\n", " | BREAST | | | | |\n", " | IONO | | | | |\n", " | SONAR | | | | |\n", " | SPAM | | | | |\n", "\n", " \n", " $^n$ Normalisation suivant la stratégie norme\n", " \n", " | Collection | Adaline | Perceptron | Régression Logistique | SVM |\n", " |------------|-------------|-------------|-----------------------|-----|\n", " | BREAST | | | | |\n", " | IONO | | | | |\n", " | SONAR | | | | |\n", " | SPAM | | | | |\n", "\n", " \n", " $^m$ Normalisation suivant la stratégie max\n", " \n", " | Collection | Adaline | Perceptron | Régression Logistique | SVM |\n", " |------------|-------------|-------------|-----------------------|-----|\n", " | BREAST | | | | |\n", " | IONO | | | | |\n", " | SONAR | | | | |\n", " | SPAM | | | | |\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.9.0" } }, "nbformat": 4, "nbformat_minor": 1 }