Un algorithme de machine learning peut à terme sortir des résultats paraissant magiques. Mais la première étape sera toujours d’explorer les données. Sinon, on risque de tomber dans l’approche inverse : "garbage in, garbage out". Pour faciliter cette exploration, on souhaite posséder un outil qui permette de projeter, agréger, visualiser les données mais également de partager ses découvertes. Sur ce point, le Notebook d’IPython est un outil à connaître. C’est un croisement entre un éditeur interactif (repl) et un EDI web mais il s’agit avant tout d’une plate-forme à ne pas sous-estimer.
Note : cet article vise un public ne connaissant pas Python.
Python, pourquoi ?
Python est un langage multi-plate-forme, créé en 1990 (avant Java) par Guido van Rossum, désormais désigné comme "bienveillant dictateur à vie".
Tout comme java, la mémoire est gérée de façon automatique par un "ramasse-miette" (garbage-collector). Cependant, en comparaison à Java, il s’agirait à priori d’un langage peu performant car dynamique et interprété. Il serait d’autant plus lent que son implémentation la plus utilisée, CPython, possède un "Global Interpreter Lock" (GIL). C’est à dire un verrou global empêchant l’exécution simultanée de bytecode python par plusieurs threads. Autrement dit, l’implémentation est peu favorable à un parallélisme léger, sans utiliser de processus distincts.
Mais ces deux limites ne sont en pratique pas de véritables contraintes. Python possède en effet une grande communauté scientifique et ces problèmes sont généralement contournés en faisant appel à des librairies écrites dans des langages plus bas niveaux, par exemple C, C++ ou Fortran. Numpy est une librairie connue, entre autres, pour permettre de manipuler directement depuis Python des tableaux multidimensionnels implémentés en C et sert de base à de nombreuses autres libraires.
La forte présence d’une communauté scientifique est ce qui nous intéresse ici. De nombreuses librairies existent pour manipuler les données (numpy, panda), construire des modèles (scipy, scikit-learn) mais également visualiser les résultats (matplotlib). Et il ne s’agit bien entendu que des librairies les plus connues, cet article ne peut prétendre construire un panorama exhaustif.
Python et vous
En 2008, Python 3 est sortie, une version majeure avec des changements non rétrocompatibles. A l’heure actuelle, les librairies les plus connues supportent cette version mais ce n’est pas forcement le cas de toutes. Certains contextes peuvent donc nécessiter l’utilisation d’une version 2.7. C’est un point à considérer pendant l’installation.
Si vous souhaitez utiliser Python, le plus simple est de partir sur une distribution. La majorité des distributions est gratuite, bien qu’elles peuvent proposer des versions professionnelles payantes. Si vous ne comptez pas quitter le monde de Windows, vous pouvez tenter WinPython. Si vous souhaitez naviguez entre Windows, Linux et MacOS, Anaconda est à essayer. Et enfin, il faut mentionner Enthought Canopy, dont l’entreprise est connue pour leur implication dans la communauté, même si cette distribution ne semble pas supporter Python 3.
Et IPython dans tout cela?
Python est livré avec un shell interactif, ce qui est peu surprenant pour un langage dynamique et interprété.
$ python Python 3.3.2 |Anaconda 1.8.0 (x86_64)| (default, Aug 5 2013, 15:07:24) [GCC 4.0.1 (Apple Inc. build 5493)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 6 * 9 54
IPython a pour mission de fournir une architecture pour améliorer l’interactivité. Cela passe notamment par un shell amélioré. Celui-ci propose de l’auto-complétion basée sur de l’introspection, des commandes magiques permettant d’unifier l’utilisation de Python avec le shell de votre OS, mais aussi la possibilité de partager facilement votre code et vos graphiques. Le but de cet article est de vous présenter Notebook, l’interface web permettant d’utiliser IPython, et de vous montrer son intérêt dans le cadre de l’exploration de données.
Si vous avez installé une distribution alors il y a de fortes chances qu’IPython soit déjà présent dans votre système.
$ ipython Python 3.3.2 |Anaconda 1.8.0 (x86_64)| (default, Aug 5 2013, 15:07:24) Type "copyright", "credits" or "license" for more information. IPython 1.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: 6*9 Out[1]: 54
A première vue, c’est très similaire au shell Python. Mais on peut déjà voir une des commandes magiques (préfixées par % ou %%) : %quickref, qu’il est possible de récupérer des informations au sujet d’une variable existante et que l’utilisation de la tabulation permet d’afficher les possibilités.
In [2]: tuto = ['Hello','World'] In [3]: tuto? Type: list String Form:['Hello', 'World'] Length: 2 Docstring: list() -> new empty list list(iterable) -> new list initialized from iterable's items In [4]: tuto.(tabulation) tuto.append tuto.extend tuto.insert tuto.remove tuto.sort tuto.count tuto.index tuto.pop tuto.reverse
Lancer Notebook se fait en une seule commande.
$ ipython notebook ... 2014-01-21 07:26:39.065 [NotebookApp] Using existing profile dir: '/Users/bdechoux/.ipython/profile_default' 2014-01-21 07:26:39.069 [NotebookApp] Using MathJax from CDN: http://cdn.mathjax.org/mathjax/latest/MathJax.js 2014-01-21 07:26:39.081 [NotebookApp] Serving notebooks from local directory: /Users/bdechoux/notebook 2014-01-21 07:26:39.081 [NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888/ 2014-01-21 07:26:39.081 [NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
Tout comme les shells classiques, il existe un fichier de configuration (profile_default) qui est lu durant l’initialisation. Le répertoire à partir duquel est lancé le serveur, est considéré comme le répertoire courant. Et enfin Notebook écoute uniquement en local sur le port 8888 au démarrage.
Une simple analyse
Afin de démontrer l’utilité de Notebook, je vous propose de suivre une courte analyse. Comme l’objectif final est de partager celle-ci, vous pouvez consultez directement la page web de l’analyse. Le détail pour obtenir cette page html est dans la suite de l’article.
Et le partage?
Par défaut, il n’existe aucune sécurité, si ce n’est que le serveur n’écoute qu’en local sur un port précis. Il est cependant possible de changer l’IP de binding et ainsi de créer un serveur public. Il est également possible de sécuriser ce serveur en utilisant SSL et un mot de passe dont le hash sera stocké dans un fichier de configuration. Tout est cela est bien documenté.
Néanmoins, il faut avoir conscience des fonctionnalités offertes par ce serveur. Il s’agit, ni plus ni moins, d’un shell contrôlable à distance. L’utilisateur utilisant l’application web possède les mêmes droits que l’utilisateur ayant lancé le processus. Si la configuration ne permet de préciser qu’un seul mot de passe, c’est bien qu’actuellement Notebook n’est pas conçu pour être accédé par plusieurs utilisateurs. Il n’y a pas non plus d’accès en lecture seule, à un détail près.
En effet, il est possible d’exporter les feuilles de travail (appelées comme l’application ‘notebook’) dans différents formats. Ces sessions de travail sont en fait par défaut stockées dans un fichier json *.ipynb au sein du répertoire courant. Ce fichier contient tout ce qui est nécessaire pour ré-afficher la feuille sans relancer les traitements : le type de chaque cellule, leur contenu et les résultats obtenus. Les images matplotlib inline sont stockées directement en binaire. A partir de ce fichier, il est possible notamment de générer une version pure html.
$ ipython nbconvert mynotebook.ipynb [NbConvertApp] Using existing profile dir: u'/Users/bdechoux/.ipython/profile_default' [NbConvertApp] Converting notebook mynotebook.ipynb to html [NbConvertApp] Support files will be in mynotebook_files/ [NbConvertApp] Loaded template html_full.tpl [NbConvertApp] Writing 263586 bytes to mynotebook.html
Il s’agit désormais d’une simple page web qui peut être ouverte depuis n’importe quel navigateur en local ou même servie par un serveur web en tant que ressource statique.
A noter que dans la version 2.0 d’IPython (à venir), les exports pourront être faits directement depuis l’interface web sans avoir à se connecter au shell.
Si vous voulez vous simplifier la vie dès à présent, il existe cependant une solution : Notebook viewer. Il s’agit d’une application web capable de prendre en paramètre, dans l’url, l’adresse d’un document notebook et le transformer à la volée en une page html. Il existe bien sur un cache pour optimiser un peu les performances. Une instance publique est hébergée gratuitement par Rackspace que vous pouvez utiliser pour montrer ou voir n’importe quel document public dans le monde entier. Mais il est également possible d’installer cette application au sein de votre réseau pour ne pas avoir à sortir les documents de votre entreprise. Cependant, cette application ne s’authentifie pas et ne peut voir que les documents ‘publics’, c’est à dire accessibles sans authentification.
Alléger le cycle : processing + Tableur + Slides
Avant toute mise en place d’un système prédictif, il est important de comprendre l’existant, quelles données peuvent être utiles et quel est le gain que l’on peut espérer au final après mise en place de ce système. Le cycle d’étude est classique : récupérer les données, les nettoyer et faire un préprocessing, générer un fichier csv qui pourra être chargé par un tableur, puis créer les graphiques et les exporter afin de pouvoir les inclure dans les slides.
Nous avons vu qu’avec IPython toutes ces étapes peuvent être faites au sein d’un même outil : Notebook. Cet article était une très courte introduction et il n’était pas possible de montrer toutes les fonctionnalités offertes par les librairies Python. Panda est probablement la première librairie à maîtriser afin de pouvoir charger, manipuler et afficher un jeu de données hétérogène. Mais cela n’impacte pas la conclusion : Notebook est définitivement un outil à considérer pour alléger ce cycle et donc l’accélérer. Certes, il ne remplacera pas un tableur mais peut permettre d’éviter des aller-retours inutiles.
En décembre 2012, IPython a reçu une donation de 1.15 million dollars de la fondation Alfred P. Sloan. Et en été 2013, 100 000 dollars de la part de Microsoft. La version 1.0 est sortie début août 2013 et la dernière version stable 1.1.0, en septembre 2013. De nombreuses améliorations sont à venir. Pour suivre le progrès, le site officiel IPython est la meilleure ressource.