mardi 26 février 2019

Programmer efficacement sous R

Mon attention a été attirée récemment par l'excellent ouvrage "Efficient R Programming" de Gillepsie et Lovelace (2017), accessible en ligne. Les auteurs exposent les tenants et aboutissants de la programmation efficace sous R. Au-delà des trucs et astuces, ils discutent des principes de l'écriture de programmes performants (en occupation mémoire et en temps d'exécution) et présentent – entres autres – les outils de benchmarking et de profiling (profilage en français) de code. Je me suis dit que ce serait une bonne chose d'illustrer leur utilisation dans le cadre de la programmation d'une procédure type de machine learning.

Mon choix s'est porté sur la programmation du leave-one-out, une procédure de rééchantillonnage pour l'évaluation des modèles prédictifs. L'optimisation du code reposera sur une analyse fine des étapes grâce à l'outil de profiling. Nous pourrons gratter du temps d'exécution en jouant sur les spécificités des primitives de calcul utilisées, le choix des structures de données, la parallélisation des calculs. Tout cela en préservant la lisibilité du code source, gage indispensable de pérennité des applications sur le long terme.

Mots-clés : langage R, package microbenchmark, package profvis, package MASS, package parallel, programmation parallèle, leave-one-out
Programmes et données : waveform
Références :
C. Gillepsie, R. Lovelace, ''Efficient R programming'', avril 2017.

samedi 23 février 2019

Importance des variables dans les modèles

En flânant sur le web, j'ai découvert l'excellent ouvrage libre de Christoph Molnar : “Interpretable Machine Learning” (13 fév. 2019). Son propos est de mettre l'accent sur l'interprétation des modèles. J'ai pris beaucoup de plaisir à le lire et surtout j'ai (re)découvert des approches intéressantes notamment dans le chapitre 5 intitulé “Model-Agnostic Methods” où il présente des méthodes génériques qui peuvent s'appliquer à tous types de classifieurs.

Je me suis intéressé en particulier à la “permutation feature importance”, une technique destinée à mesurer l'importance des variables. Dans ce tutoriel, nous l'étudierons en la programmant nous-même sous R sur un jeu de données bien connu (Breast Cancer Wisconsin) pour lequel nous avons rajouté des variables générées aléatoirement pour corser l'affaire. Nous utilisons une régression logistique parce qu'elle propose intrinsèquement un procédé permettant d'évaluer l'influence des variables. Ce sera l'occasion d'étalonner la technique agnostique et étudier sa capacité à identifier la solution adéquate. Dans un deuxième temps, nous utiliserons le package “iml” développé par l'auteur de l'ouvrage et qui fournit des outils clés en main. Nous pourrons ainsi comparer nos résultats.

Mots-clés : logiciel R, package iml, package mlr, influence des variables, régression logistique
Programmes et données : Breast Cancer Wisconsin
Références :
C. Molnar, "Interpretable Machine Learning - A Guide for Making Black Box Models Explainable", février 2019.

mercredi 13 février 2019

Règles d'association sous Python

Ça fait un moment que je n'ai plus écrit de didacticiels sur les règles d'association. Comme je m'investis de plus en plus dans Python dans mes enseignements, je me suis dit qu'il était temps d'en écrire un pour ce langage, en complément d'un ancien document consacré à différents logiciels, notamment R avec le package "arules" (‘'Règles d'association – Comparaison de logiciels'', novembre 2008). J'utilise la librairie ‘'mlxtend'' (machine learning extensions) qui propose une série d'outils pour le machine learning : clustering, classification supervisée, régression, etc., et donc l'extraction des itemsets fréquents et des règles d'association que nous étudierons dans ce didacticiel.

L'organisation de ce document est on ne peut plus classique dans notre contexte : chargement et préparation des données, extraction des itemsets fréquents, recherche des sous-ensembles d'itemsets comportant des items particuliers, déduction des règles d'association à partir des itemsets fréquents, recherche de sous-ensembles de règles au regard de la présence de certains items ou répondant à des critères numériques.

Mots-clés : python, package mlxtend, itemsets fréquents, règles d'association, support, confiance, lift, apriori
Didacticiel : Règles d'association sous Python
Programmes et données : python_market_basket.zip
Références :
Tutoriel Tanagra, "Extraction des règles d'association - Diapos", Juin 2015.

lundi 4 février 2019

R et Python, performances comparées

Lancer un débat sur les mérites des différents langages de programmation est une bonne manière de plomber un repas entre informaticiens. J'en avais fait les frais naguère lorsque j'avais voulu comparer les performances de plusieurs d'entre eux (Java, C++, C#, Delphi - alors que j'en étais arrivé à la conclusion finalement que le meilleur outil était celui dont on maîtrisait le mieux les contours, et que la structuration des données jouait un rôle fondamental).

J'imagine qu'on se heurterait à la même fronde de la part de certains (une moitié vs. l'autre ?) data scientists si l'on se mettait à opposer R et Python. L'année dernière, à la même époque, j'avais essayé de montrer qu'on pouvait enseigner les deux dans les formations en data science, et que le passage d'un outil à l'autre engendrait un surcoût pédagogique négligeable au regard des avantages, notamment en termes de positionnement de nos étudiants sur le marché du travail. Je m'attache à appliquer ce principe dans mes enseignements à l'Université.

Malgré tout, je me risque à un petit comparatif dans ce tutoriel. Parce que j'entends beaucoup d'affirmations ici et là qui ne sont pas vraiment argumentées. J'ai décidé de vérifier par moi-même en observant les performances des outils dans un cadre précis, bien délimité : chargement d'un fichier CSV volumineux (9.796.862 observations et 42 variables – il s'agit de la base KDD CUP 99 dont chaque ligne a été dupliquée), réalisation de calculs de statistique descriptives simples (moyennes, croisements, tris).

Tous les outils testés ont mené à bien les opérations, c'est une information primordiale. Après, nous avons des résultats – spécifiques à l'expérience menée, je souligne encore une fois – qui titillent quand même pas mal notre intellect. Je vous laisse les découvrir.

Bien sûr, les temps de traitement annoncés dans ce tutoriel sont propres à ma machine fixe (Core i7 - 3.1 Ghz). J'ai refait les tests sur mon ordinateur portable (Core i5 - 2.7 Ghz), les valeurs sont différentes dans l'absolu (le contraire eût été étonnant), mais les positions et écarts relatifs restent identiques. J'imagine qu'il en sera de même sur votre ordinateur.

Enfin, à l'attention des ronchons pro-ci ou pro-ça dont j'entends déjà les grognements, je leur dis de monter leurs propres expérimentations, et surtout de bien veiller à mettre en ligne leurs codes et leurs données pour que tout un chacun puisse retracer ce qui est annoncé. S'assurer de la reproductibilité des résultats est la base même de la démarche scientifique.

Mots-clés : logiciel R, fichier CSV, kdd cup 99, package data.table, packager readr, package dplyr, python, package pandas, statistique descriptive
Didacticiel : R et Python, performances
Programmes : Chargement et statistiques (R et Python)
Données : kddcup99twice.7z
Références :
Tutoriel Tanagra, "R ou Python, il faut choisir ?", Janvier 2018.