"
]
},
{
"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
}