- Dans son cours en ligne ‘Machine Learning’ (Stanford), le professeur NG Andrew utilise les langages Octave et Matlab pour les travaux pratiques. J’ai refait le premier TP en Python (Pandas et Numpy) et cet article est à prendre comme un retour d’expérience.
Le TP numero 1 se divise en deux parties :
Les problèmes de régression linéaire par la descente de gradient
· A une seule variable
· A plusieurs variables
Avec une comparaison par rapport à une résolution par l’équation
normale.
Partie 1
Le problème est de trouver les coefficients de la droite qui
s’ajuste le mieux à ce nuage de point :
Pour cela on utilisa le méthode de la descende de gradient qui consiste trouver par petites touches le
point le plus base de cette figure : Elle représente la courbe du ‘coût’
(fonction d’erreur)
Le résultat est le point situé au coordonnées : 1.1664
(<->) et -3.630 (|)
Utilisation de Python
Les librairies utilisées sont :
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
Axe3D permettra de réaliser la courbe 3D de la fonction coût.
La difficulté du codage réside dans le partage de rôle entre
pandas et numpy. Les calculs de matrices sont à faire avec numpy mais pandas
propose aussi ses propres fonctions de calcul.
Je n’ai pas chercher à refactoriser mon code qui demeure
très laid.
L’effort portera sur la 2eme partie de l’exercice.
Ci-dessous la comparaison entre Python et Octave.
Octave est plus concis et proche de la formule mathématique.
La confusion du code Python vient du mélange des fonctions
Numpy et Pandas.
Une autre difficulté vient de l’affichage des courbes.
Pandas encapsule des fonctions graphiques de matplot mais elles sont trop restrictives. Il faut
passer directement par matplot. Ce dernier possède un mode qui évite de bloquer
le programme après affichage (voir le source).
Donc à l’issu de cette première partie, je conseille :
- Utiliser pandas pour charger et préparer les données.
- De convertir les dataframes de pandas en arrray numpy pour faire les calculs
- Utiliser matplot directement
Mise en application dans la deuxième partie de l’exercice
Partie 2
C’est un problème de régression linéaire avec plusieurs
facteurs : à partir de la superficie d’un logement et du nombre de chambre
déduire le prix du bien.
Avec une première difficulté : les variables n’ont pas
la même échelle de valeur. Pour les corréler efficacement il convient de les normaliser.
La formule de normalisation fait
intervenir l’écart type (std) de la série. Pour l’écart type, il faudra à un
moment du calcul diviser par le nombre d’élément de la série : ‘n’ ou ‘n-1’ . Ce choix doit etre indiqué par le paramètre
ddof (Delta Degrees of Freedom) qui prend généralement la valeur 0 ou 1.
Avec octave : sigma(1,col) = std(X(:,col),1); le parametre ddof vaut 1
Ce qui veut dire : normalize with N, this provides the
square root of the second moment around the mean
Alors
que Pandas et Numpy ne gèrent pas de la même manière ce parametre y compris
pour la valeur par défaut..
Par
exemple avec Pandas, le DDOF sera mis à zéro pour le même résultat : sigma[i] = dataf.iloc[:,i].std( ddof=0)
Soit (n – valeur_de_ddof)
Le code de la fonction
gradientdescent est plus propre :
La décomposition du calcul en plusieurs étape facilite la
mise au point et de vérifier la bonne dimension des tableaux.
La courbe suivante visualise l’approche du minima de la fonction
de coût.
Le dernier exercice propose de résoudre l’équation
normale afin d’arriver à une solution exacte en une seule itération.
Cette méthode à l’inconvénient de passer par une inversion
de matrice : cette opération n’est pas toujours possible. Et quand le
nombre de mesure augmente, la complexité du calcul progresse plus fortement qu’avec
la méthode itérative.
En résumé : 3 conseils :
- Utilisation de Pandas pour charger les données et bien les identifier pour faciliter les exports
- Exporter vers une structure Numpy pour réaliser les calculs
- Utiliser directement matplot sans passer par Pandas
Aucun commentaire:
Enregistrer un commentaire