Auto Machine Learning depuis SQL Server

L’article suivant a été corédigé avec Yassine Khelifi, Ingénieur d’escalade Azure Machine Learning.

L’apprentissage automatique, également appelé AutoML, permet de simplifier la génération de modèles de Machine Learning. En construisant plusieurs versions de modèles et en comparant leurs qualités Azure Machine Learning service permet de choisir celui le plus adéquate pour une mise en production rapide.

automlstep

Dans cet article nous présenterons le service Automated Machine Learning et nous verrons les avantages de son usage au sein des bases de données. Pour cela, nous utiliserons un problème de classification déjà utilisé dans quelques-uns de mes articles sur l’analyse de la qualité de vins :
– Azure Machine Learning Studio & Wine Quality : FR | EN
– SQL Server Machine Learning Services & Wine Quality : FR | EN

AzureMachineLearning

 

1 – Introduction

Prenons un exemple typique de la manière dont nous construisons un modèle ML aujourd’hui : Nous regroupons différentes sources de données, nous les préparons, nous entrainons un modèle et une fois satisfait de la sortie du modèle nous déployons celui-ci.

PrepareBuildDeploy_ML

Ces différentes étapes supposent de multiples prises de décisions interconnectées, la transformation et l’enrichissement des données, l’entrainement du modèle en fonction de métrique d’optimisation sélectionnée, réglage et optimisation des hyperparamètres, autant pour les transformateurs de données que les algorithmes ML, …

FeaturesAutoML

FeaturesAutoML2

Le service Azure Machine Learning et sa fonctionnalité d’AutoML répond exactement à cette problématique et permet d’éviter ces étapes itératives et de maximiser la qualité du modèle finale à partir des objectifs et des contraintes que vous définissez.

AutoML_Azure

Mais quel est le lien avec SQL Server ?
– Dans SQL Server 2016, il est possible d’installer R Services, un module complémentaire à une instance de moteur de base de données utilisé pour l’exécution de code R et des fonctions sur SQL Server.
– Dans SQL Server 2017, le R Services a été renommé en SQL Server Machine Learning Services, reflétant l’ajout du langage Python.
– Dans SQL Server 2019 (actuellement en Preview), le langage Java est ajouté aux langages R et Python ainsi que le support sur Linux et de hautes disponibilités (FCI), le support des données partitionnées…

Cela tombe bien, la fonctionnalité d’AutoML dans le service Azure Machine Learning est accessible en Python ! Nous allons donc pouvoir depuis SQL Server demander l’entrainement de modèle ML et sauvegarder le meilleur d’entre eux en base de données afin de l’utiliser localement.

 

2 – Automated Machine Learning

Dans cette section, on vous présente un aperçu de l’approche proposée par AutoML qui a été publié dans l‘étude « Probabilistic Matrix Factorization for Automated Machine Learning » et que nous vous invitons à étudier pour de plus amples détails.

Comme on a pu l’évoquer précédemment, AutoML a pour vocation d’automatiser la sélection et le réglage du meilleur pipeline ML qui combine prétraitement, sélection d’algorithmes et optimisation, l’objectif à minimiser est donc :

argmin

Voici un résumé intuitif des étapes entreprises par AutoML :

1. AutoML instancie des pipelines en avance et procède à un échantillonnage, ce qui permet une discrétisation de l’espace des hyperparamètres des pipelines, un espace qui forme une combinaison de variables discrètes et continues.

2. Ensuite AutoML procède à l’entrainement de N pipelines sur D jeu de données de référence, constituant ainsi une matrice creuse Y∈R^NxD  qui résume la performance de chaque pipeline échantillonné.

AutoMLPipelines

3. Vous l’aurez donc compris, l’objectif est de compléter la matrice Y, l’idée derrière l’approche, si deux jeux de données produisent un résultat similaire pour quelques pipelines, il est probable que le reste des pipelines produiront des résultats similaires. Tel est le rôle de cette étape, apprendre un modèle latent à base de factorisation de matrices probabilistes (PMF). Le PMF est essentiellement un processus gaussien à base de modèles latents (GP-LVM).

Le GP-LVM est une méthode non-supervisée qui consiste à apprendre un espace latent X à dimension réduite et non-linéaire à partir d’un espace d’observation Y. On pourra aussi le décrire comme étant un ACP intégré dans un processus gaussien (PG).

On suppose donc que les éléments de sont des valeurs d’une fonction bruitée non-linéaire des variables latents avec un bruit additif gaussien et de moyenne nulle.

MoyenneNulle

Ainsi la vraisemblance suivante en découle :
Vraisemblance

Ensuite, un prior gaussien est placé sur f_d (X_n ) ce qui donne :
Vraisemblance2
où K est la matrice covariance exponentielle carrée caractérisant ainsi la non-linéarité dans l’espace latent X :
Vraisemblance3

Enfin, les paramètres X,θ,σ^2 sont estimés par maximation de la vraisemblance via la descente de gradient stochastique :
Vraisemblance4

K étant la fonction de covariance exponentielle du PG et θ le vecteur contenant ses hyperparamètres θ ={α ,γ_1,γ_2…….γ_q}.

Une fois l’apprentissage accompli, l’espace latent capture la structure des pipelines « type de modèle, hyperparamètres… ». Nous pouvons voir celui-ci dans une représentation a 2 dimensions ou 5000 pipelines entrainés sur 576 jeux de données de référence OpenML, avec le coloris représentant la performance du métrique AURC :

EspaceLatent

Muni des paramètres inférés par le GP-LVM, ces derniers sont ensuite utilisés pour estimer la performance y_(m,d)^* d’un pipeline m sur un nouveau jeu de donnée d avec les formules prédictives standard d’une régression par PG, produisant ainsi u_(m,d ),v_(m,d), où u_(m,d ) est l’estimé et v_(m,d) la distribution a posteriori qui caractérise l’incertitude de l’estimé.

4. Enfin, la dernière étape consiste à choisir de façon intelligente le prochain pipeline p_(n+1) à évaluer. Muni de l’estimé u_(m,d ), et l’incertitude produite par le biais de la distribution a posteriori v_(m,d), une fonction utilitaire dite fonction d’acquisition « Expected Improvement » (EI) dirige l’échantillonnage du prochain pipeline vers les zones où une amélioration par rapport à la meilleure performance obtenue jusqu’à présent est probable. Une fois l’EI calculé pour chaque pipeline, le prochain pipeline à évaluer sera donc le point où l’EI atteint son maximum.

argmax

 

3 – Démonstration

Afin de démontrer l’usage de la fonctionnalité d’AutoML dans le service Azure Machine Learning, reprenons le même jeu de données d’un article que j’avais rédigé en 2014 sur le service Azure Machine Learning : « Predict Wine Quality With Azure ML ».

Contrairement à Azure ML qui propose un outil visuel dans le Cloud pour entrainer, créer et déployer un modèle, nous travaillerons dans cet article On Premise dans SQL Server et en mode « Code First » mais simplifié puisque les différents modèles seront entrainés et comparé pour moi.

Rappel du jeu de données :
– Il a été recueilli par Paulo Cortez, 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.
– Les échantillons proviennent de vins blancs et rouges du Portugal : Vinho Verde.
– Les données sont publiques, vous pourriez donc reproduire ces expérimentations : http://www3.dsi.uminho.pt/pcortez/wine/winequality.zip.

WineData

L’output dans notre exemple sera la qualité. Cette dernière 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 mauvaise) et 10 (excellente). Le nombre de vins testés est de 1599 pour les rouges et de 4898 pour les blancs.

Avant de commencer cet expérimentation, revenons sur ce que nous souhaitons obtenir :

WineClassification

SQL Server 2017 et 2019 peuvent appeler l’apprentissage automatique automatisé Azure ML pour créer des modèles à partir de données SQL Server. Pour cela nous utiliserons la procédure stockée sp_execute_external_script permettant d’appeler des scripts Python.

Remarque : SQL Server 2017 et SQL Server 2019 peuvent être exécutés sous Windows ou Linux. Toutefois, cette intégration n’est pas disponible pour SQL Server 2017 sous Linux.

1. Après avoir installé SQL Server 2017 dans notre cas nous avons exécuté les scripts :
sp_configure 'external scripts enabled',1
reconfigure with override

2. La prochaine étape consiste à installer les bibliothèques d’apprentissage automatique en utilisant les commandes suivantes à partir de l’invite de commande en tant qu’administrateur après avoir arrêté le service SQL Server :
cd "C:\Program Files\Microsoft SQL Server"
cd "MSSQL14.ROMAINCA\PYTHON_SERVICES"
python.exe -m pip install azureml-sdk[automl]
python.exe -m pip install --upgrade numpy
python.exe -m pip install --upgrade sklearn

Remarque : Du fait des dépendances et des versions installées sur votre machine, des erreurs peuvent se produire lors de l’installation, pour corriger la plupart d’entre elles exécuter en tant qu’administrateur la commande suivante depuis le répertoire « PYTHON_SERVICES » : “python.exe -m pip install azureml-sdk[automl] –ignore-installed”. Cela va installer le SDK AzureML dont le module AutoML fait partie. Nous en profitons pour mettre à jour les module numpy et scikit-learn.

3. Pour vérifier l’installation, exécuter en tant qu’administrateur la commande suivante depuis le répertoire « PYTHON_SERVICES » : “python -m pip freeze”

PythonAutoML

4. Démarrez SQL Server et le service « Service SQL Server Launchpad ».

5. Dans le Pare-feu Windows, cliquez sur Paramètres avancés et dans Règles sortantes, désactivez « Bloquer l’accès réseau pour les comptes d’utilisateur locaux R dans l’instance SQL Server xxxx ».

SQLServerFirewall

6. Créez un espace de travail le service Azure Machine Learning. Vous pouvez utiliser les instructions à l’adresse suivante : https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-workspace

7. Créez un fichier de fichier config.json à l’aide de l’ID d’abonnement, du nom du groupe de ressources et du nom de l’espace de travail utilisé pour créer l’espace de travail. Le fichier est décrit à l’adresse suivante: https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-configure-environment#workspace
{
"appId": "63fa98a3-1dfb-###-981c-5279f18df087",
"displayName": "principlename",
"name": "http://principlename",
"password": "###",
"tenant": "72f988bf-####-41af-91ab-2d7cd011db47"
}

8. Créez un principal de service Azure. Depuis Azure CLI (outil en ligne de commande pour la gestion des ressources Azure). Vous pouvez le faire avec les commandes:
az login
az account set --subscription subscriptionid
az ad sp create-for-rbac --name principlename --password password

AzLogin

9. Créer la base de données de test « automl », et exécutez les script TSQL « aml_model.sql », « aml_connection.sql », « AutoMLGetMetrics.sql », « AutoMLPredict.sql » et « AutoMLTrain.sql » disponible à l’adresse suivante : Github automated-machine-learning

10. Insérez les valeurs , et ci-dessus dans la table aml_connection et renseignez le chemin absolu de votre fichier config.json. Définissez le nom sur «Default» :

AutoML_SQLConfig

Le jeu de données que nous souhaitons prédire est disponible dans le backup de la base de donnés « WineQuality ».

Nous allons entrainer le modèle ML à partir de la table « White_Train » de la base de données « WineQuality ». Sur les 4898 lignes « white », la table « White_Train » en a 3675 (environ 75%) et la table « White_Test » en a 1223 (environ 25%) :

White_Train

La requête suivante va insérer dans la table « aml_model », le modèle maximisant la métrique AUC_weighted :

INSERT INTO dbo.aml_model(RunId, ExperimentName, Model, LogFileText, WorkspaceName)
EXEC dbo.AutoMLTrain @input_query='
SELECT citric_acid, total_sulfur_dioxide, density, pH, sulphates, alcohol, quality FROM [WineQuality].[dbo].[White_Train] ',
@label_column = 'quality',
@iterations=20,
@experiment_name='automl-sql-wine',
@iteration_timeout_minutes=10

Remarque : AUC_weighted ou l’AUC pondéré en Français est ici utilisé compte-tenu de la modalité de la variable prédictive non équilibrée, on surmonte alors cet écueil en choisissant l’AUC pondéré. Contrairement à l’AUC qui somme l’aire sous la courbe avec des poids égaux, nous voulons donner plus d’importance à l’aire située près du haut du graphique. L’AUC pondéré crée donc un vecteur de pondération asymétrique en répartissant d’avantage le poids vers le haut de la courbe ROC. Mais voici la liste des métriques supportés : https://docs.microsoft.com/en-us/azure/machine-learning/service/concept-automated-ml#training-metric-output

Le nombre maximum de pipelines d’entrainement est ici configuré a 20 et chacune d’entre elles ne doit pas excéder 10 minutes.

AutoML_Result

La requête suivante permet d’avoir les métriques sur les modèles :

DECLARE @RunId NVARCHAR(43);
DECLARE @ExperimentName NVARCHAR(255);
SELECT TOP 1
@ExperimentName=ExperimentName,
@RunId=SUBSTRING(RunId, 1, 43)
FROM dbo.aml_model
ORDER BY CreatedDate DESC
EXEC dbo.AutoMLGetMetrics @RunId, @ExperimentName

Les modèles les plus pertinents ont été pour chaque exécution sauvegardés dans la table « aml_model » :

AutoML_SQLModel

Du côté du service Azure Machine Learning, il est possible de suivre l’exécution des entrainements, le détail des exécutions, une liste complète des modèles créés et des informations sur leurs pertinences :

Azure_AutoML

Azure_AutoML2

Azure_AutoML3

Azure_AutoML4

Plus d’information sur les graphiques disponibles : https://docs.microsoft.com/fr-fr/azure/machine-learning/service/how-to-track-experiments#understanding-automated-ml-charts

Pour effectuer des prédictions à partir de mon modèle, rien de plus simple :
DECLARE @Model NVARCHAR(MAX) = (
SELECT TOP 1 Model FROM dbo.aml_model
WHERE ExperimentName = 'automl-sql-wine'
ORDER BY CreatedDate DESC
)
EXEC dbo.AutoMLPredict @input_query='
SELECT citric_acid, total_sulfur_dioxide, density, pH, sulphates, alcohol, quality FROM [WineQuality].[dbo].[White_Test]',
@label_column='quality',
@model=@model
WITH RESULT SETS ((citric_acid FLOAT, total_sulfur_dioxide FLOAT, density FLOAT, pH FLOAT, sulphates FLOAT, alcohol FLOAT, quality INT, predicted_quality INT))

AutoML_SQL_Prediction

 

4 – Conclusion

Dans la démonstration précédente, nous avons vu la simplicité d’accès au service Automated Machine Learning depuis des scripts Python afin d’entrainer et sauvegarder un modèle dans une table le tout sans quitter SSMS !

La fonctionnalité d’AutoML dans le service Azure Machine Learning facilite grandement la création et l’optimisation de modèle ML. De plus il s’intègre complètement dans la démarche DevOps :

AzureML_DevOps

Le service ne cesse d’évoluer (nouvelle interface en Preview, Time series forecasting, , export de modèle en format ONNX , …) : https://azure.microsoft.com/fr-fr/blog/a-look-at-azure-automated-machine-learning-capabilities/

Nous prévoyons de rédiger une deuxième partie à cet article qui portera sur l’interprétabilité et l’opérationnalisation de ce même modèle. Un troisième article concernera l’AutoML dans Power BI à partir du même jeu de données, en attendant, voici une petite comparaison :

AutoML_PowerBI_Azure

Leave a comment