Azure Machine Learning & Python : Plotting avec Matplotlib

Julien Moreau-Mathis
Azure & Machine Learning
4 min readJun 7, 2015

Introduction

Azure Machine Learning permet d’exécuter des scripts Python comme décrit dans cet article. Le Backend utilisé pour exécuter ces scripts Python est basé sur Anaconda 2.1, une plateforme de distribution de Python largement répandue et disposant de 200 paquets différents. Anaconda 2.1 comprend le paquet Matplotlib très utilisé par la communauté scientifique de Python qui permet de générer des graphiques.

Cet article démontre les paramètres pour créer des graphiques dans Azure Machine Learning avec Python et Matplotlib, mais aussi comment tirer bénéfice de l’opérationnalisation et de l’exposition de Web Services avec Azure Machine Learning. En effet, cet article démontre également comment récupérer des graphiques générés avec Matplotlib à travers un Web Service.

Plotting avec Python et Azure Machine Learning

Une seule configuration est nécessaire pour récupérer les graphiques générés par Matplotlib. Il s’agit de modifier le backend (generate images without having a window appear) juste avant d’importer pyplot. Modifier le backend permet à Matplotlib de générer des images plutôt que d’ouvrir une fenêtre contenant le graphique généré.

import matplotlib
matplotlib.use("agg") #Change backend to PNG
import matplotlib.pyplot as plt

Créer un graphique avec des valeurs aléatoires

Créons un graphique dans l’intervalle [0, 1000] en x, avec des valeurs aléatoires contenues dans [-1000, 1000] en y.

ax.scatter(x, y) génère un nuage de points à l’inverse ax.plot(x, y) qui génère une courbe.

fig.savefig(“scatter.png”) sauvegarde la figure dans un fichier (ici “scatter.png”).

import random
x = [i for i in range(0, 1000)]
y = []
for i in range(0, 1000):
y.append(i + random.randint(-1000, 1000))
fig,ax = plt.subplots()
ax.scatter(x, y)
ax.set_xlabel("x")
ax.set_ylabel("y")
fig.savefig("scatter.png")

Une fois l’expérimentation exécutée avec succès (“Run”), le graphique est disponible dans le connecteur “Python Device” puis “Visualize”.

Résultat du plot :

Ajouter le graphique au dataset de sortie du script Python

Pour récupérer le graphique côté client, le graphique est encodé en base64 dans le script Python depuis Azure ML, puis décodé côté client.

Pour encoder le graphique, la méthode est la suivante :

  • Sauvegarder le graphique dans un buffer plutôt que dans un fichier
  • Encoder le buffer en base64
  • Ajouter l’image encodée au dataset

Afin de sauvegarder le graphique dans un buffer, il s’agit d’utiliser StringIO. Si le premier paramètre de fig.savefig() n’est pas une string alors il faut spécifier son format (format=”png”) et le graphique sera enregistré dans le buffer.

import StringIO
fig_data = StringIO.StringIO()
fig.savefig(fig_data, format="png")
fig_data.seek(0)

Une fois le graphique contenu dans le buffer de fig_data (fig_data.buf), il s’agit de l’encoder en base64 :

import base64
image = "data:image/png;base64," + base64.b64encode(fig_data.buf)

Puis de retourner le dataset :

import pandas as pd
return
pd.DataFrame([image], columns=["image"]),

Une fois l’expérimentation exécutée avec succès, le graphique est diponible sous forme d’une string. Le connecteur “Result datasets” nous permet de visualiser le dataset en sortie du script.

Le résultat du dataset :

Script complet :

Transformer l’expérimentation en Web Service

Afin de récupérer le graphique côté client, nous devons configurer l’expérimentation comme étant un Web Service. Il s’agit d’ajouter les éléments “Input” et “Ouput” à l’expérimentation.

Enter Data permet de définir le type d’entrée pour l’Input (ici vide)

Script Python côté client

La première étape consiste à construire la requête que nous voulons envoyer au Web Service puis de retourner son résultat sous forme d’une string.

La deuxième étape consiste à décoder la valeur contenue dans le JSON (resultat de la requête) et d’écrire le résultat dans un fichier “scatter.png”.

image.split(“,”)[1] nous permet de ne garder que le resultat après l’entête (data:image/png;base64)

Conclusion

Nous avons vu dans cet article comment configurer Matplotlib afin de récupérer des graphiques créés depuis Python dans Azure ML. De plus, nous avons vu comment enregistrer un graphique dans un buffer, ce qui nous a permis de le convertir en base64 et de l’inclure dans le dataset en sortie du script Python dans Azure ML.

--

--