Le Machine Learning, tendance lourde de l’industrie 4.0 avec des applications en croissance (analyse de données, traitement d’images, Analytics, …), utilise aujourd’hui majoritairement le langage Python. Nous avons déjà traité de l’IA (Intelligence Artificielle) dans de précédents articles sur MetalBlog en passant en revue les différentes technologies (système expert, jumeau numérique, Deep Learning) et en donnant des cas d’application. Dans le présent article, nous détaillerons les différentes méthodes de Machine Learning (ML) et l’apport du langage Python en illustrant certains points sur la base d’un fichier de données issu d’un projet de R&D de CTIF sur l’aluminium.
L’importance des données
En Machine Learning, la qualité et la complétude des données est capitale pour faire de l’apprentissage. Les professionnels de l’informatique illustrent cela par la formule « Garbage in, Garbage Out » qui signifie que si les données d’entrées sont corrompues, fausses, … incomplètes, le résultat du calcul sera entaché lui aussi d’une erreur pouvant être importante. C’est encore plus vraie dans le domaine du ML ou l’apprentissage du modèle est réalisé entièrement à partir de données et non plus à partir de lois physiques comme en simulation numérique conventionnelle (thermique, fluidique, …).
La préparation et le nettoyage des données dit « data-cleaning » (suppression des cases vides, des données non valides, …) et leur visualisation devient ainsi une étape en soit avant le traitement des données proprement dit. Cette étape peut occuper près de 80 % du temps de travail. Sur les gros fichiers, de nombreuses cases sont vides (non renseignées). Plusieurs stratégies peuvent être appliquées ; supprimer la ligne de données, imputer la valeur manquante par la moyenne des valeurs de la variable ou bien encore, pour des séries chronologiques, imputer la valeur manquante par interpolation linéaire (entre la valeur précédente et la valeur suivante). Ainsi, le fichier aluminium de CTIF qui contenait initialement 2837 lignes (données brutes) a été réduit à 2416 données (après nettoyage et suppression des données non renseignées), soit 15 % de perte environ.
La régression linéaire, outil le plus simple en Machine Learning
La régression linéaire entre variables est l’outil le plus simple. Il s’agit bien de Machine Learning, puisque à partir de données existantes, on va modéliser un comportement qui servira à prédire des données non encore connues sur cette droite de régression. La figure ci-contre illustre les nuages de points Rp0.2 versus dureté et les droites de régression (plus ou moins corrélées) selon la teneur en magnésium.
Les données labellisées et non labellisées
En ML, il existe deux grands types de données ; les données labellisées et celles non labellisées. Elles diffèrent par le fait qu’une donnée labellisée est taguée (« label ») par une valeur ou une grandeur significative, en général, le résultat à prédire. Des données labélisées vont permettre de faire de l’apprentissage supervisé (régression et classification) et des données non labellisées de l’apprentissage non supervisé comme le Clustering (identification de population aux caractéristiques similaires). Une éprouvette ayant reçu un traitement thermique sera ainsi labellisée par 4 valeurs continues (dureté, Rm, Rp0.2 et allongement) et des algorithmes de régression seront applicables (régression linéaire, KNN, …). Dans les sciences de l’ingénieur, où de nombreuses données numériques sont disponibles, on utilise majoritairement le Machine Learning Supervisé et les algorithmes de régression.
Les différents algorithmes de Machine Learning
L’apprentissage supervisé est de loin le plus populaire et le plus répandu. Il nécessite de disposer de données labélisées. Les algorithmes de ML supervisés sont essentiellement au nombre de six grandes familles : la régression linéaire, la méthode des k-plus proches voisins (ou KNN pour K-Nearest-Neighbors), la méthode de Naïves Bayes, les arbres de décisions (Decision Tree), les machines à vecteur de support (ou SVM pour Support Vector Machines) et enfin les réseaux de neurones. Ces méthodes ont chacune leurs avantages et leurs limitations. Si les réseaux de neurones sont les plus puissants en terme de prédiction, ils sont aussi les plus complexes à utiliser et nécessite une puissance de calcul beauccoup plus grande en phase d’entraînement nécessitant des cartes graphiques ou une exécution sur le Cloud dans certains cas. Nous reviendrons sur les réseaux de neurones dans un prochain article.
Train Set et Test Set issus du Data Set
En ML, on divise toujours le jeu de données initial (le Data Set) en 2 parties : le Train Set (base d’apprentissage pour réaliser la phase d’entraînement) et le Test Set réservé au test ou évaluation du modèle. Le Data Set est mélangé de manière aléatoire pour extraire les données pour le Train Set et le Test Set. En général, on positionne 80 % des données dans le Train Set les 20 % restant dans le Test Set.
Scikit-Learn pour faire de l’apprentissage
La librairie Python Scikit-Learn est très utilisée pour faire de l’apprentissage. On constitue tout d’abord un Data Set de données, puis on spécifie quel type de modèle (régression linéaire, KNN classification, KNN régression, SVM, …) la machine soit apprendre en précisant si besoin les hyperparamètres du modèle. Sinon, grâce à un algorithme d’optimisation, la machine trouvera les meilleurs hyperparamètres. Une fois le modèle mis au point et valisé, l’utilisateur fournira les données d’entrées (X) et l’algorithme calculera les données de sortie (Y). Les données d’entrées sont souvent appelées « Feature » (ou variables caractéristiques) et les données de sorties « label » (ou Target).
Le langage Python pour le Machine Learning
Deux langages se sont progressivement imposés en data science, le code R et le Python. Créé en 1989, le code open-source Python domine aujourd’hui largement l’informatique car tout en étant simple, il est relativement puissant et dispose de plus de très nombreuses librairies qui permettent d’appeler des fonctions préprogrammées. La communauté des développeurs en Python est très active. On peut de plus trouver de très nombreux codes (ou parties de code) en open-source, des tutoriels en français, des vidéos explicatives (YouTube) et de très nombreuses aides en ligne sur ce langage.
Python comme langage pour piloter des codes du commerce
Il existe, de plus, des interfaces Python pour pour certains codes commerciaux non open-source. C’est ainsi que le logiciel ThermoCalc (prédiction thermodynamique pour les alliages) dispose d’une interface TC-Python qui permet de développer des commandes beaucoup plus élaborées que le mode « Console » standard et va rechercher les informations directement dans les bases de données d’alliages de ThermoCalc, amenant plus de souplesse dans l’utilisation de ThermoCalc. Le logiciel Matlab permet lui aussi, par exemple, d’intégrer des programmes développés en Python.
L’enseignement du Python en France
Le Python est enseigné depuis 2013 par l’Education National (Classes préparatoires scientifiques – CPGE) à la place du Pascal car sa syntaxe permet une initiation aisée aux concepts de base de la programmation. L’éducation nationale préconise la calculette graphique programmable en Python NumWorks (produit Made in France).
Importer les librairies dans un IDE Python
Ce qui explique aussi le succès du Python, c’est la disponibilité de plusieurs dizaines de librairies de fonctions. Les plus utilisées en data-science sont Pandas, Numpy (tableaux multi-dimensionnels), Scipy (calcul scientifique), Matplotlib (tracé graphique) et Seaborn (représentation graphique multifenêtrage), Scikit-Learn (pour faire de l’apprentissage proprement dit) et Keras qui permet d’attaquer la bibliothèque TensorFlow (réseau de neurones et CNN pour Convolutional Neural Network pour le traitement d’images). Ces librairies, pour pouvoir être utilisées, doivent être importées dans un environnement de développement intégré (IDE pour Integrated Development Environment). Les IDE Python les plus utilisés sont Jupyter (travail en mode collaboratif), Spyder ou PyCharm. Le langage Python est devenu aujourd’hui le langage de développement le plus utilisé (35 %) en particulier pour le Machine Learning.
La visualisation des données avec Matplotlib et Seaborn
Avant même de réaliser des modèles, il est important de pouvoir visualiser les données brutes pour repérer leur répartition (continue, par classes, …), les variables peu utiles ou les corrélations possibles entre variables. Deux librairies sont particulièrement utilisées en data-science : Matplotlib et Seaborn. Matplotlib est la librairie de référence et s’avère incontournable pour tracé des graphiques (2D ou 3D), des histogrammes simples et visualiser ainsi comment les donnée se répartissent ou pour superposer en fin de traitement les points et le modèle. Le graphique ci-contre illustre l’allongement fonction du traitement thermique (température et durée) pour une partie du Data Set avec une coloration des points fonction de la teneur en fer de l’alliage.
La librairie Seaborn – construite à partir de Pandas et Matplotlib – est plus limité en contenu (quelques dizaines de fonctions seulement), mais est extrêmement puissante et permet avec une commande unique (par exemple « heatmap ») de visualiser l’ensemble des données d’un Data Set (sous forme d’une matrice de corrélation avec code couleur très parlant, ….). Ces 2 librairies couvrent 90 % des besoins de tracé graphique et de visualisation.
L’optimisation des hyperparamètres d’un modèle
Les modèles de régression (ou de classification) sont des fonctions mathématiques qui dépendent d’hyperparamètres (paramètres internes du modèle). Le réglage (ou « tuning ») de ces hyperparamètres va impacter fortement le score final de ce modèle. On dispose dans Python d’un outil – GridSearchCV (pour recherche en grille) – qui va réaliser automatiquement la recherche des meilleurs hyperparamètres. L’utilisateur aura juste à préciser quels hyperparamètres il souhaite faire varier et leurs niveaux de variation et GridSearchCV déterminera automatiquement le meilleur réglage.
La Learning Curve
En ML, on doit souvent disposer de plusieurs centaines ou milliers de données pour avoir un apprentissage avec un score de confiance suffisant. Cependant, la récolte de données peut être couteuse et nécessiter de réaliser de multiples essais. Il est donc intéressant de connaître la performance d’un modèle en fonction du nombre de données d’apprentissage afin de les limiter au strict nécessaire. On trace pour cela la Learning Curve qui montre l’évolution du score du modèle en fonction du nombre de données. La Learning Curve, sur l’exemple ci-dessus, évolue fortement au début puis présente un caractère asymptotique (vers 700 données). Cette courbe permet de connaitre le nombre suffisant de données pour avoir un modèle avec une bonne prédictibilité. La Learning Curve est évidement grandement fonction des données et de la complexité du problème à résoudre.
L’entrainement d’un modèle sur une base aluminium
Le développement d’un modèle se réalise sur la base d’instruction simples qui mises bout à bout vont permettre l’entrainement et l’optimisation de ce modèle. L’exemple de « code » ci-dessus est donné pour une base d’éprouvettes en aluminium de plus de 2800 données comprenant la composition des alliages (Si, Cu, Zn, Mg, Fe), la modification (Oui/Non) et le dégazage (Oui/Non), le type de moulage (coquille/sable), un vieillissement de l’alliage (Oui/Non). Les données de sorties (Target) sont la dureté (HB) et les performances mécaniques (Rm, Rp0.2 et allongement). Il faut tout d’abord importer la librairie de Machine Learning que l’on souhaite utiliser – ici KNeighborsRegressor – puis uploader le fichier Excel qui contient les données et le transformer en DataFrame.
On affectera ensuite les colonnes de données aux X (variables) et à Y (grandeur à prédire ou Target), soit pour nous la dureté et les caractéristiques mécaniques. Ce Data Set devra être ensuite nettoyé des données aberrantes, puis il sera découpé en deux parties (Train Set et Test Set). Ensuite, on pourra passer à la déclaration du modèle (model =), à son entrainement (model.fit) sur le Train Set, au calcul du score (model.score) et enfin à la prédiction (model.predict) sur le Test Set. Ces trois dernières instructions en particulier sont les bases du ML.
Le preprocessing des données
Le data preprocessing (ou préparation en amont des données avant l’apprentissage) est une étape importante en ML. On utilise pour cela des opérateurs dits « transformer » qui vont progressivement modifier les données initiales. On peut tout d’abord remplacer (par un transformer de type KNNimputer) les valeurs manquantes. Puis, l’opération d’encodage (par le transformer OrdinalEncoder) va consister à transformer les données alphanumériques (modification de l’alliage « Oui/Non » ou type de moulage « coquille/sable ») en données numériques, les seules manipulables par les algorithmes. Cela peut se faire manuellement (sous Excel) pour un petit jeu de données. Sur plus de 2800 données réparties en 15 colonnes, il vaut mieux s’appuyer sur les outils intégrés à Scikit-Learn.
Ensuite, sans que cela soit obligatoire, il est très fortement conseillé de normaliser les données pour accroitre les performances des codes. La normalisation MinMaxScaler consiste par exemple à ramener toutes les données entre 0 et 1 alors que la standardisation ramène chaque variable avec une moyenne égale à zéro et un écart type égal à un. En ML, les spécialistes répètent souvent que la qualité des données et leur nombre (suffisant) est fondamental et le preprocessing est la clef de la réussite. Ainsi, le score d’un modèle peut souvent être amélioré de 0.85 sans preprocessing à plus de 0.95 après preprocessing.
L’utilisation de pipeline
Un pipeline est composé de plusieurs Transformers (fonction de transformation) qui vont transformer et traiter les données dans une séquence logique toujours identique. L’intérêt du Pipeline est multiple : il est simple à utiliser, il évite d’avoir des fuites de données ou des données mal-transformées et enfin, il permet d’utiliser GridSearchCV sur toute la chaine de traitement (pour optimiser le traitement). Le pipeline s’applique très facilement à partir de la fonction « make-pipeline » qui aura été préalablement importé de Scikit-Learn. Dans un tel pipeline (figure ci-dessus), on pourra par exemple appliquer successivement une fonction d’encodage (OrdinalEncoder) , une fonction de normalisation (MinMaxScaler) et enfin l’algorithme de ML (KneighborsRegressor) proprement dit.
Comparatif des modèles de Machine Learning
Il existe un grand nombre de modèles, aussi bien de régression que de classification, utilisables dans la librairie Scikit-Learn. Ces modèles donnent de plus ou moins bons score, en termes de prédiction, en fonction des problèmes à résoudre mais aussi du Data Set. Il est donc important de comparer la performance des modèles sur le même Data Set. Nous avons fait tourner ces modèles (tableau ci-dessus) une centaine de fois pour chaque valeur à prédire (dureté, Rm, Rp0.2 et allongement). On s’aperçoit que les 3 modèles linéaires (Ridge, BayesianRidge et SDGRegressor pour Stochastic Gradient Descent) donnent de mauvais résultats (score moyen < 0.65). A l’opposé, les 3 meilleurs modèles (score > 0.85) sont les K-plus proches voisins (KNeighborsRegressor) et 2 modèles à base d’arbre de décisions (DecisionTreeRegressor et RandomForestRegressor). Les scores de prédiction sont différents d’une Target à prédire à l’autre avec les meilleurs résultats dans l’ordre décroissant pour la dureté (> 0.93), le Rp0.2 (0.91), l’allongement (0.89) et enfin le Rm (0.85).
Prédiction sur un Data Set réduit
Lorsque l’on réduit le Data Set, on obtient de meilleurs scores. Ainsi, par exemple, pour le Rp0.2, en ne conservant que les éprouvettes non vieillies (1396 données contre plus de 2300 pour la base entière), le score augmente à plus de 0.95 pour les 3 modèles les plus performants vus précédemment. Enfin, en ne retenant que l’alliage AlSi7Mg -avec différentes conditions de traitements thermique (durée et température), de composition (Cu et Mg), de conditions de dégazage (« oui/non ») et de moulage (coquille/sable), le score est de 0.99, soit une très bonne prédiction. Cela s’explique par le fait qu’en réduisant le data set, les données deviennent plus cohérentes et homogènes avec un comportement physique plus proche, donc plus facile à interpréter et à prédire par les modèles. Plus on réduira le Data Set et meilleures seront les prévisions. Evidemment, une telle base assez réduite peut comporter en pratique beaucoup moins d’intérêt pour son utilisateur.
Validation du modèle
Il convient en dernier lieu de valider le modèle sur des données non connues par l’algorithme d’apprentissage et non contenues dans le Data Set initial. A cet effet, on aura pris soin d’extraire au tout début du processus un petit jeu de données (pour nous 100 points aléatoirement réparties). On pourra alors calculer le score final sur ce jeu de données et tracer les points « dureté prédit » versus « dureté mesurée (et donc réelle) ». Ici, le score est de 94 % pour la prédiction de la dureté.
Les limites du Machine Learning
L’algorithme ne pourra apprendre qu’à partir de données d’apprentissage disponibles et connues. Ainsi, comme dans notre Data Set, les valeurs en silicium vont de 5 % à 8.5 %, le modèle ne saura donc pas prédire le comportement d’alliages hypersiliciés (Si à 17-25 %). De la même manière, des alliages d’aluminium inconnus (par exemple dopés en scandium, en nickel ou en zirconium), non présents dans la base d’apprentissage seront hors périmètres du modèle.
Conclusions
Nous avons décrit, en nous appuyant sur un Data Set aluminium disponible au CTIF, la manière de réaliser du Machine Learning sous Python avec les librairies standards relativement puissantes de Scikit-Learn. Au delà de l’utilisation de librairies, la préparation (preprocessing) des données est très importante avec différentes étapes (nettoyage, encodage, normalisation). Nous avons volontairement omis de parler de réseau de neurones, car ce type d’algorithme de ML sera traité dans un autre article.
Merci pour votre excellent blog,
Exist-il un Data Set Fontes GS/GL disponible au CTIF ou dans le Cloud en open source comme celle citée dans le blog « Data Set aluminium disponible au CTIF ».
Exist-il un blog exploitant le Deep learning sur le theme Defauts de fondries en Python
Bonjour Taleb et merci de votre intérêt pour notre article De MetalBlog sur le machine learning avec le langage Python. Non, désolé, il n’y a pas, à notre connaissance, de DataSet existant en open-source sur Les fontes GL ou GS.
Bonjour merci pour ce blog c’été très intéressants, ce qui n’est pas claire pour moi c’est comment montrer les valeurs prédites. et comment prédire plusieurs valeurs du faite que nous avons un seul Y.
Bonjour Fatima et merci tout d’abord de votre intérêt pour notre article de MetalBlog sur le machine learning. Les valeurs predites s’affichent sous la forme que l’on souhaite (tableau, graphique, …). Par contre, s’il y a plusieurs variables Y a prédire, il faut, en général, développer plusieurs modèles differents et les entraîner séparément.