dimanche 7 juin 2020

Machine learning : d'Octave à Python

  • 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: