Prédire la qualité d’un vin avec Azure ML – 2nde partie


Ce billet est rédigé par Romain Casteres (@PulsWeb), consultant Décisionnel de la société DCube. Il aborde par l’exemple et de façon didactique le service Azure Machine Learning (Azure ML), service que nous avons précédemment introduit à l’occasion du lancement de ce blog le mois dernier.

Je vous en souhaite une bonne lecture.

--Philippe

_________________________________________________________________________________________

Dans ce billet, je vous propose d’aborder et de présenter le service Azure Machine Learning (Azure ML) au travers d’un exemple concret et d’une problématique bien réelle : Comment prédire la qualité d’un vin en fonction de ses caractéristiques !

La première partie nous a permis de revoir ce qu’est l’apprentissage automatique (Machine Learning), quels en sont les buts et quels sont les différents (types d’) algorithmes utilisés dans ce contexte, etc. Vous pouvez bien entendu en profiter pour parcourir les billets d’introduction de ce blog si ce n’est déjà fait ! J’ai également introduit le service Azure ML et ses principales caractéristiques.

Dans cette seconde partie, nous allons nous concentrerons sur l’utilisation du service Azure ML en tant que tel. Pour cela, nous commencerons par présenter le jeu de donnée que nous utiliserons pour notre analyse et cette découverte de l’environnement, nous testerons et évaluerons différents algorithmes de prédiction dans le but d’obtenir le « meilleur » modèle. Enfin nous publierons notre expérimentation à travers un service Web que nous interrogerons via un ETL (SSIS) afin de simuler une industrialisation, une mise en production de notre algorithme. Voilà pour le programme 🙂

Nos données

Parlons maintenant du jeu de données sélectionné : il a été recueilli par Paulo Cortez (Univ. Minho), Antonio Cerdeira, Fernando Almeida, Telmo Matos et Jose Reis en 2009 pour la rédaction du livre : Modeling wine preferences by data mining from physicochemical properties.

Citation for use: P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis. Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009.

Ils proposent une approche d'exploration de données pour prédire les préférences gustatives et la qualité de différents vins en fonction de leurs caractéristiques : fixed acidity, volatile acidity, citric acid, residual sugar, chlorides, free sulfur dioxide, total sulfur dioxide, density, pH, sulphates, et alcohol.

Les échantillons proviennent de vins blancs et rouges du Portugal : Vinho Verde. Vinho Verde est un produit de la région de Minho, au Nord-Ouest du Portugal. Moyennement alcoolisé, il est particulièrement apprécié en raison de sa fraicheur 😉

Les données sont publiques et téléchargeables ici, Vous avez donc toute latitude pour reproduire mes expérimentations ! 🙂

Voici à quoi ressemblent les données :

image

La variable de sortie (output variable) dans notre exemple sera la qualité. Cette donnée est basée sur des données sensorielles médianes d’au moins 3 évaluations faites par des experts en vin. Chaque expert a classé la qualité du vin entre 0 (très mauvais) et 10 (excellent).

Le nombre de vins testés est de 1599 pour les rouges et de 4898 pour les blancs.

Voici les variables d’entrée (inputs variables), leurs unités, leurs Min, Max et leurs moyennes :

image

Une remarque : il ne manque aucun attribut à un vin.

La classification

Classification Binaire

Avant de commencer mon expérimentation, revenons sur ce que nous souhaitons faire et obtenir :

image

Voici les différentes étapes :

  1. Chargement du jeu de données
  2. Division du jeu de données : une partie pour entrainer le modèle et l’autre permettant de vérifier les résultats du modèle
  3. Vérification des résultats de l’algorithme choisi, sinon itération
  4. Définition des points d’entrée et de sortie du modèle (New Input, Output)
  5. Publication du service Web
  6. Utilisation de l’API
  7. Validation des résultats par une dégustation 😉

Il existe plusieurs types de classification selon le résultat souhaité. Afin d’avoir un résultat binaire sur la qualité du vin, j’ai initié le fichier CSV suivant : Vous pouvez le télécharger ici.

image

Nous allons le corréler avec le fichier des vins rouges afin de prédire si un vin rouge est bon ou mauvais en fonction de sa composition chimique. En premier lieu, nous devons créer depuis le portail de gestion Azure, le service Machine Learning :

image

Remarque : Seul le stockage South Central US est disponible pour le moment.

Une fois le Workspace créé, je m’y connecte avec Azure ML Studio :

image

Je charge les différents fichiers et je crée une nouvelle expérimentation :

image

Le billet Les premiers pas avec Azure ML Studio vous indique la marche à suivre. Il est alors possible de visualiser et d’analyser les données d’un fichier d’entrée :

image

image

Voici une première expérimentation :

image

Un bref détail des étapes au-delà de la capture d’écran :

  • Join : Jointure entre les deux tables sur la colonne Quality
  • Project Columns : Sélection de toutes les colonnes hormis les colonnes Quality (nous n’en avons plus besoin car nous souhaitons prédire la colonne Result)
  • Split : Split des données en deux échantillons, l’un pour entrainer le modèle et l’autre pour le valider.
  • Train model : J’ai choisi d’entrainer le modèle avec l’algorithme Two-Class Averaged Perceptron, sur la colonne Result.
  • Score Model : Permet de calculer le score du modèle
  • Evaluate Model : Permet d’évaluer le modèle

Après exécution de mon expérimentation, voici le résultat :

image

image

La qualité d'un modèle est mesurée par l'évaluation de la performance du modèle sur une partie des données sources pour mesurer la précision des prédictions en les comparants aux résultats connus.

Receiver Operating Characteristics (ROC) est une technique permettant de visualiser, organiser et sélectionner des classificateurs sur la base de leur performance.

Pour les modèles de classification binaires, il y a quatre résultats possibles :

  1. Vrai positif (TP) : un vin bon est correctement classé comme bon,
  2. Faux positif (FP) : un vin mauvais qui est incorrectement classé comme bon,
  3. Vrai négatif (TN) : un exemple mauvais qui est correctement classé comme mauvais,
  4. Faux négatif (FN) : un exemple bon qui est incorrectement classé comme mauvais.

Il existe trois paramètres importants qui sont utilisés pour mesurer la performance :

  1. Precision : La précision est calculée par TP / (TP + FP)
  2. Recall : Calculé par TP / (TP + FN)
  3. Accuracy : La précision est calculée par TP + TN / (TP + FP + TN + FN)

Au vu des résultats, mon classificateur est moyennement bon. Sur 1819 bons vins, il s’est trompé 410 fois, et sur les 630 mauvais vins, il s’est trompé 218 fois !

Comparons les résultats avec d’autres classificateurs et itérons afin d’avoir le meilleur taux de prédiction :

image

Le classificateur Two-Class Boosted Decision Tree offre de meilleure prédiction :

image

Après avoir testé et gardé le meilleur classificateur - il s’avère que dans mon cas c’est le Two-Class Decision Jungle -, il faut sauvegarder le modèle entrainé pour pouvoir le réutiliser :

image

Remarque : la plupart des algorithmes possèdent des paramètres modifiables comme le nombre de Learning itérations, de Learning rate, etc. influant sur les performances. C’est là que l’expertise des scientifiques des données prend toute sa dimension !

Réutilisation du modèle entrainé :

image

Il nous reste à définir un point d’entrée et de sortie au modèle :

image

Pour publier le service Web :

image

image

Test du service Web :

Il est possible de tester dès à présent l’API en rentrant les différentes caractéristiques d’un vin afin de prédire s’il est bon ou mauvais !

Voici les caractéristiques d’un vin :

  • FIXED ACIDITY : 6.5
  • VOLATILE ACIDITY : 0.36
  • CITRIC ACID : 0.28
  • RESIDUAL SUGAR : 3.2
  • CHLORIDES : 0.037
  • FREE SULFUR DIOXIDE : 29
  • TOTAL SULFUR DIOXIDE : 119
  • DENSITY : 0.9908
  • PH : 3.25
  • SULPHATES : 0.65
  • ALCOHOL : 13

image

Résultat : Le vin devrait être bon à 97 % !

Classification Multi-Class

Dans l’exemple précédent, nous avons classifié la qualité d’un vin avec les attributs « Bon » et « Mauvais ». Dans cet exemple, nous analyserons la qualité d’un vin avec des chiffres entre 0 et 10. Pour ce faire, nous devons utiliser d’autres algorithmes de classification Multi-Class mais le principe reste le même.

Voici l’expérimentation correspondante :

image

Et les résultats après quelques ajustements sur les propriétés des classificateurs :

image

En apprentissage supervisé, le concept d’ajustement consiste à chercher une fonction de prédiction qui, au moyen d’attributs prédictifs, permet d’ajuster au mieux l’attribut à prédire. Ceci conduit à s’intéresser à la distribution de la variable de sortie pour les différentes combinaisons de valeurs des attributs, c’est-à-dire à la représentation sous forme de table de contingence des données.

Les résultats de gauche correspondent au classificateur Multiclass Decision Forest, ceux de droite au classificateur Multiclass Decision Jungle.

Voici comment lire ces résultats :

  • Rappelons que le modèle entrainé (avec une partie des données sources) est évalué à l’aide des données source, une comparaison entre les prédictions et les données réelles est donc effectuée pour mesurer l’efficacité du modèle à prédire de nouveaux jeux de données.
  • Le classificateur Multiclass Decision Forest fournit au global de meilleures prédictions, en effet plus les données situées sur la transversale sont hautes moins le modèle se trompe.
  • Le classificateur Multiclass Decision Forest a trouvé pour des vins de qualités 3 :
    • 20 % des vins analysés en qualité 3 : bonne prédiction
    • 40 % des vins analysés en qualité 4 : mauvaise prédiction
    • 20 % des vins analysés en qualité 5 : mauvaise prédictio
    • 20 % des vins analysés en qualité 6 : mauvaise prédiction
  • Le classificateur Multiclass Decision Jungle a trouvé pour des vins de qualités 7 :
    • 1 % des vins analysés en qualité 4 : mauvaise prédiction
    • 11,5 % des vins analysés en qualité 5 : mauvaise prédiction
    • 44,2 % des vins analysés en qualité 6 : mauvaise prédiction
    • 42,3 % des vins analysés en qualité 7 : bonne prédiction
    • 1 % des vins analysés en qualité 8 : mauvaise prédiction

Il faudrait passer plus de temps à essayer d’autres classificateurs, ajuster leurs paramètres afin d’obtenir de meilleures prédictions. D’autres informations fournies dans la sortie de module Score Model peuvent faciliter des données :

image

Remarque : il est possible d’enregistrer le résultat d’un module dans un jeu de données (dataset) et donc de pouvoir le réutiliser comme entrée lors d’une expérimentation :

image

L’automatisation

Une fois publié le service Web, celui-ci peut être requêté de deux façons différentes en mode requête, réponse ou en mode Batch.

Le mode Batch permet de charger un fichier dans Azure ayant les inputs, le service Web traitera toutes les entrées du fichier et renverra un fichier en sortie.

Dans cet exemple, je vais utiliser le mode Requête à Réponse. Cela va me permettre d’envoyer les caractéristiques d’un vin après l’autre et de sauvegarder le résultat dans une table.

Création de la table AML_Wine

Voici le script T-SQL de la création de la table AML_Wine :

CREATE TABLE [dbo].[AML_Wine](

        [PK_ID] [INT] NOT NULL,

        [Quality] [NVARCHAR](50) NULL,

        [fixed acidity] [FLOAT] NULL,

        [volatile acidity] [FLOAT] NULL,

        [citric acid] [FLOAT] NULL,

        [residual sugar] [FLOAT] NULL,

        [chlorides] [FLOAT] NULL,

        [free sulfur dioxide] [FLOAT] NULL,

        [total sulfur dioxide] [FLOAT] NULL,

        [density] [FLOAT] NULL,

        [pH] [FLOAT] NULL,

        [sulphates] [FLOAT] NULL,

        [alcohol] [FLOAT] NULL,

 CONSTRAINT [PK_WINE] PRIMARY KEY CLUSTERED

([PK_ID] ASC)

WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Insertion de vins pour lesquelles le Web Service devra prédire leurs qualités :

INSERT INTO [dbo].[AML_Wine]([PK_ID],[Quality],[fixed acidity],[volatile acidity],[citric acid],[residual sugar],[chlorides],[free sulfur dioxide],[total sulfur dioxide],[density],[pH],[sulphates],[alcohol]) VALUES

(1,NULL,6.8,0.29,0.16,1.4,0.038,122.5,234.5,0.9922,3.15,0.47,10)

,(2,NULL,6.5,0.33,0.72,1.1,0.061,7,151,0.993,3.09,0.57,9.5)

,(3,NULL,6.4,0.24,0.29,11.4,0.051,32,166,0.9968,3.31,0.45,9.55)

,(4,NULL,7.1,0.26,0.34,14.4,0.067,35,189,0.9986,3.07,0.53,9.1)

,(5,NULL,5.9,0.24,0.26,12.3,0.053,34,134,0.9972,3.34,0.45,9.5)

image

Le package SSIS sera en charge d’actualiser la colonne Quality ; les caractéristiques des vins seront transmises au service Web qui prédira s’ils sont bons ou mauvais.

Accès au service Web

Voici les spécifications d’accès au service Web :

image

image

image

Code C# d’utilisation : N’oubliez pas d’inclure les références nécessaires.

using System;

using System.Collections.Generic;

using System.IO;

using System.Net.Http;

using System.Net.Http.Formatting;

using System.Net.Http.Headers;

using System.Text;

using System.Threading.Tasks;

 

namespace CallRequestResponseService

{

  public class ScoreData

  {

    public Dictionary<string, string> FeatureVector { get; set; }

    public Dictionary<string, string> GlobalParameters { get; set; }

  }

 

  public class ScoreRequest

  {

    public string Id { get; set; }

    public ScoreData Instance { get; set; }

  }

 

  class Program

  {

    static void Main(string[] args)

    {

      InvokeRequestResponseService().Wait();

    }

 

    static async Task InvokeRequestResponseService()

    {

      using (var client = new HttpClient())

      {

        ScoreData scoreData = new ScoreData()

        {

          FeatureVector = new Dictionary<string, string>()

          {

            { "fixed acidity", "0" },

            { "volatile acidity", "0" },

            { "citric acid", "0" },

            { "residual sugar", "0" },

            { "chlorides", "0" },

            { "free sulfur dioxide", "0" },

            { "total sulfur dioxide", "0" },

            { "density", "0" },

            { "pH", "0" },

            { "sulphates", "0" },

            { "alcohol", "0" },

            { "result", "0" },

          },

          GlobalParameters = new Dictionary<string, string>()

          {

          }

       };

 

       ScoreRequest scoreRequest = new ScoreRequest()

       {

         Id = "score00001",

          Instance = scoreData

       };

 

       const string apiKey = "abc123"; // Replace this with the API key for the web service

       client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Bearer", apiKey);

 

       client.BaseAddress = new Uri("https://ussouthcentral.services.azureml.net/workspaces/fe8616914be2449087b593879bd47acf/services/da02eca7897647b09dc909671cd88d1a/score");

       HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest);

       if (response.IsSuccessStatusCode)

       {

         string result = await response.Content.ReadAsStringAsync();

         Console.WriteLine("Result: {0}", result);

       }

       else

       {

         Console.WriteLine("Failed with status code: {0}", response.StatusCode);

       }

           

      }

    }

  }

}

Remarque : Nous avons déjà testé ce mode d’accès pour le modèle de classification binaire.

Création du paquet SSIS

Le paquet SSIS est des plus simples : il lit la table AML_WINE, la qualité des vins n'ayant pas encore été prédite, cette tâche sera transmise au service Web via un script C# qui enverra les caractéristiques des vins au service Web. Celui-ci renverra alors la prédiction faite par le mode. Enfin la dernière tâche sera d’actualiser la colonne Quality (grâce à l’identifiant PK_ID) :

image

La partie la plus complexe se trouve au niveau de la tache de Script ; la colonne Quality doit pouvoir être accessible en écriture afin d’actualiser la table AML_Wine :

image

Les références suivantes doivent être présentes dans la solution :

image

Chez moi, le paquet Microsoft.Bcl.Async ne fonctionnant pas, j’ai dû installer le paquet AsyncBridge ; au passage quelques commandes Nuget bien utiles :

  • Install-Package AsyncBridge
  • Uninstall-Package AsyncBridge

Résultat :

image

Conclusion

Dans ce billet, nous avons pu créer un modèle d’analyse prédictive permettant de prédire la qualité d’un vin en fonction de ses caractéristiques chimiques. Nous avons testé et « évalué les performances » de plusieurs algorithmes permettant d’apporter une répondre de façon binaire (Bon ou Mauvais) et numérique (de 0 à 10). Nous avons défini un point d’entrée et un point de sortie au modèle afin de pouvoir y accéder depuis l’extérieur via une API. Enfin nous avons automatisé l’analyse de nouveaux vins.

Cet exemple d’analyse prédictive laisse entrevoir de multiples nouveaux services, imaginez que je puisse savoir si un vin est bon ou mauvais sans l'avoir testé et donc décider de l'acheter ou non... Je pourrais automatiser l’achat de vin… lors de la prochaine Foire au Vin ; ce qui ne serait tarder 😉

En ayant peu de connaissances en Datamining, j’ai réussi à créer un modèle d’analyse prédictif et à l’utiliser 🙂 Il est toujours possible de consacrer un peu de temps à un cours comme celui-ci : http://eric.univ-lyon2.fr/~ricco/cours/supports_data_mining.html

S’il est aisé de créer un modèle avec Azure ML via des composants graphiques, maitriser toute la complexité des différents algorithmes, savoir lequel utiliser, savoir optimiser un modèle… restent bel et bien un métier, celui de statisticiens, de scientifiques des données, etc.

Pour autant, avec Azure ML Microsoft offre une plateforme d’analyse prédictive dans le Cloud conçue pour les utilisateurs débutants ou expérimentés.

Comments (0)

Skip to main content