Ce n’est pas tous les jours que l’on a la chance d’assister à la naissance d’un nouveau framework chez Microsoft et voir sortir ce framework le jour où Satia Nadella donne sa vision sur l’intégration des innovations technologiques dans le quotidien de tous n’est pas un hasard.

And I'm reminded of this Mark Weiser quote: "The most profound technologies are those that disappear, they weave themselves into the fabric of everyday life until they are indistinguishable from it." This is from his very influential paper early '90s when he was at Xerox PARC.
And that's what's happening, that's the opportunity that we see. The world is becoming a computer.
Satia Nadella – May 7, 2018
Même si cette citation s’applique à l’ensemble des technologies informatiques (données, UX, IoT, …), elle prend à mon avis tout son sens avec l’intelligence artificielle.
Et le programme AI for Accessibility où l’on a notamment pu voir l’entrainement bluffant du service cognitif Speech permettant de comprendre facilement l’expression orale d’une personne sourde me conforte dans cette idée.

ML.NET est un framework de Machine Learning multi-plateforme qui permet aux développeurs .NET de développer leurs propres modèles et de les intégrer dans leurs applications.
Il est intéressant de noter que les équipes Microsoft (Windows, Bing, Azure…) utilisent actuellement une version plus avancée de ce framework, conférant ainsi à cette nouveauté une certaine crédibilité.
Parfait, je suis un dév .NET qui veut bien rendre ses applis moins stupides sans rien n’y connaitre en ML, comment je fais ça ?
Pour commencer, Microsoft nous fournit le tutorial disponible ici :
https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet/get-started/windows
Au cours de l’exercice proposé, nous allons entrainer notre modèle à reconnaître des variétés d’iris (la fleur) en fonction de la taille (comme quoi, oui, ça compte) de leurs sépales et de leurs pétales.
C’est un thème qui semble assez courant en Machine Learning.

Comme souvent, c’est par là où tout commence
Une fois installé et une fois le code de démonstration copié, je dois éclaircir cette ligne de code :
var pipeline = new LearningPipeline();
En version simplifiée, le pipeline est le processus qui va rassembler les morceaux nécessaires à l’élaboration du modèle.
C’est pour le coup très concret en lisant le code : on lui donne les données servant à entrainer notre modèle, on catégorise ces dernières en indiquant celles qui servent à identifier l’iris (forme des pétales et sépales) et celle qui représente la prédiction qui devra être faite par le modèle (l’espèce).
pipeline.Add(new StochasticDualCoordinateAscentClassifier());
Nous avons ensuite la possibilité d’utiliser un algorithme fournit par le framework permettant d’entrainer la classification de nos espèces d’iris.
Ces algos sont au nombre de 20 et sont regroupés dans le namespace Microsoft.ML.Trainers. Ils représentent à mon avis mon prochain apprentissage dans la découverte de ce framework.
Dans cet exemple, on passe l’algo avec les valeurs de paramétrage par défaut. Mais on peut les modifier en le configurant avant de l’enregistrer dans le pipeline, en jouant par exemple sur le nombre d’itérations souhaitées lors de l’entrainement.

Bing translation : « Tu peux aller jouer fiston, mais viens pas pleurer si tu te fais mal »
var model = pipeline.Train<WineData, WinePrediction>();
Avant de pouvoir jouer mon modèle, il me faut l’entrainer. La méthode ne prend aucun paramètre, il lui faudra simplement un pipeline rempli correctement.
var prediction = model.Predict([…])
Au moment d’exécuter mon modèle, nous avons plusieurs logs retournés correspondants aux paramétrages de l’algorithme.

Mon modèle a donc retrouvé mon Iris-virginica, c’est sympa, mais les iris et moi…
Romantisme : +
Ramener sa science lors d’un treck : +++
Développement personnel : +
Reconnaître des iris c’est bien, mais reconnaître du bon vin, c’est mieux ! Prenons une source de données déjà préparée pour du ML (https://archive.ics.uci.edu/ml/datasets/wine+quality) et tentons notre chance :

Le truc avec le Machine Learning, c’est que tu as rapidement le sentiment qu’une personne en blouse blanche se cache derrière la moindre donnée
Nous sommes partis pour tester notre modèle sur la qualité du vin, pour se faire nous allons essayer d’adapter ce code.
public class WineData
{
[…]
[Column("11")]
[ColumnName("Label")]
public int Quality;
}
Pour commencer, nous allons créer notre modèle, qui a comme différence notable que la valeur évaluer par le modèle n’est pas de type string.
public class WinePrediction
{
[ColumnName("PredictedLabel")]
public int PredictedQuality;
}
Du coup, on se passera des lignes pipeline.Add(new Dictionarizer("Label")); et pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" }); qui ont pour fonction de transformer les valeurs de type string en numérique :

Cette cuvée ML.NET est encore un peu jeune
Ok, pas de int, tentons le float pour les propriétés WineData.Quality et WinePrediction.PredictedQuality :

Hum, le vin est peut-être un peu vert
Bon, je trouve dommage de pouvoir passer en attribut de ma propriété « Quality » le mot clé « Label » pour qu’il n’en tienne pas compte. Essayons ceci :
[Column(ordinal: "11", name: "Label")]
public float Quality;

Il a une petite odeur de bouchon
Ok, avec cette notation de l’attribut il retrouve bien ma propriété, mais la tentative de cast d’un type non managé en float n’est pas gérée. En définitive, le type string n’est pas si mal !
Repassons donc les types en string et actualisons les lignes de transformation des données string en numérique et inversement :
pipeline.Add(new Dictionarizer("Label"));
pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" });

Evidemment, j’ai passé le nom de l’attribut à la fonction Dictionarizer et non le nom de la propriété, my bad :
pipeline.Add(new Dictionarizer("Quality"));

Voir même un goût de vinaigre…
Bien, je suis échec et mat : n’ayant pas trouvé le moyen de ne pas utiliser le type string, je dois utiliser la classe Dictionarizer qui ne prend pas en compte les attributs des propriétés de l’objet présentant ma donnée.
Du coup, je j’arrête de vouloir faire propre, je vais surtout faire efficace en changeant le nom de ma propriété Quality en Label :
[Column("11")]
[ColumnName("Label")]
public string Label;
pipeline.Add(new Dictionarizer("Label"));
Et là on est bon, mon code fonctionne !
var prediction = model.Predict(new WineData()
{
FixedAcidity = 11.6f,
VolatileAcidity = 0.32f,
CitricAcidity = 0.55f,
ResidualSugar = 2.8f,
Chlorides = 0.081f,
FreeSulfureDioxide = 35,
TotalSulfureDioxide = 67,
Density = 1.0002f,
pH = 3.32f,
Sulphates = 0.92f,
Alcohol = 10.8f
});

Romantisme : ---
Développement personnel : +++
Ramener sa science en soirée : +
Opinion des convives sur vous lorsque vous parlez composés chimiques là où ils s’attendent aux termes robe, cuisse et nez : hum, j’hésite…
En conclusion, nous avons ici une solution complète qui nous permet de transformer nos données pour le ML, d’entrainer notre modèle avec une vingtaine d’algorithmes fournis puis de l’évaluer, le tout en C#.
Je rappellerai néanmoins une évidence : ce framework est jeune et je suis un peu déçu car comme énoncé en intro, les speakers de la Build affirmaient que les équipes MS utilisent ce framework en version plus avancée.
Il faudra surveiller l’évolution des mises à jour de ce framework pour se rendre compte s’il a été sortit dans l’unique but d’appuyer les annonces sur l’IA de la Build ou si MS lui prévoit un avenir doré.
Commentaires :
Aucun commentaires pour le moment
Laissez un commentaire :