Aparté
Notre tâche est une régression grâce à un apprentissage supervisé (prédiction d’un prix). On choisit comme mesure de performance la racine de l’erreur quadratique moyenne (root mean square error, RMSE) qui est classique :
$$ RMSE(X, h) = \sqrt{\frac{1}{m}\sum^m_{i=1}(h(x^{(i)})-y^{(i)})²} $$
avec :
Il existe aussi la l’erreur absolue moyenne (mean absolute error, MAE) qui est la suivante :
$$ MAE(X, h) = \frac{1}{m} \sum^m_{i=1}|h(x^{(i)})-y^{(i)}| $$
Petit point mathématiques ;D
L’erreur MAE donne moins d’importance aux valeurs extrêmes que la RMSE. De manière générale, plus la norme utilisé est d’indice élevé (norme 1 pour MAE et norme 2 pour RMSE), plus les grandes valeurs auront de l’importance.
Même si la RMSE convient à quasiment toutes les situations voici un rappel de la formule générale des normes :
$$ l_k : ||v||_k = (|v_0|^k+|v_1|^k+\cdots+|v_n|^k)^{\frac{1}{k}} $$
Tout projet commence par une exploration rapide des données. Avec un DataFrame de pandas nous avons les méthodes suivantes :
Durant cette exploration rapide, on peut remarquer quelques problèmes du jeu de données. Des valeurs manquantes, des variables plafonnées (ce qui peut être un frein à l’apprentissage).
Il faut le faire AVANT d’explorer plus les données car notre réflexion pourrait induire un biais d’espionnage (snopping).
La méthode classique est l’utilisation de la fonction train_test_split() de sklearn. Fixer le paramètre random_state permettra de garder le même jeu de test sur un nouvel entraînement ce qui isole réellement ce jeu de test de tout apprentissage. Cependant, il est important d’ajouter que cette méthode applique par défaut un échantillonage aléatoire ce qui brise la représentativité du jeu de test et d’entraînement s’il n’y a pas beaucoup de données.
Dans ce cas là, on choisit une variable fortement représentative et on la divise en catégorie. En stratifiant ainsi notre jeu de données on peu voir que l’échantillon possède 30% de type A, 15% de type B et 55% de type C (ce sont les 3 modalités de la variable que l’on considère représentative). Alors, le paramètre stratify de train_test_split() on aura des jeux d’entraînement et de test qui respecteront les proportions de ces strates.
Bonus : Si jamais notre variable représentative était quantitative, on peut utiliser pd.cut() pour créer une nouvelle variable qui sera qualitative et qui permettra une utilisation des strates (cette variable peut être supprimée après la création du jeu de test).
On n’explore que les données d’entraînement. Si ces dernières sont trop importantes on peut échantilloner (correctement bien sûr) pour constituer un jeu temporaire d’exploration et gagner en temps de calcul.
Pour certains les nuages de points (notamment géographiques), il faut penser à régler le paramètre alpha pour observer les différents niveaux de densité. On n’hésite pas à comparer plusieurs nuage de points de différentes variables à la recherche d’une corrélation.