Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !

Spark pour l’apprentissage automatique

Introduction à l’apprentissage automatique

1. L’approche de la boîte noire magique

Le composant MLlib de Spark permet de faire du machine learning. Cette expression nous vient de la langue anglaise. La traduction française officielle  est apprentissage automatique. Il y a trois manières d’approcher ce concept : la boîte noire magique, les mathématiques et l’intuition. La première présente uniquement les impacts d’une application usant d’intelligence artificielle. Seules les possibilités finales sont présentées. Il y a parfois cette idée que l’apprentissage automatique peut tout, va nous sauver de tout ou au contraire nous faire tous périr. Le sujet est souvent envisagé comme de la magie blanche capable de nous faire accéder au meilleur des mondes. D’autres fois, il est décrit comme pure sorcellerie prêt à nous faire plonger dans les abîmes d’un univers affreux et malfaisant. Même si les choses tendent à changer, c’est un domaine qui reste assez peu compris et de fait suscite beaucoup de fantasmes. Présenter uniquement les aboutissants de l’apprentissage automatique n’est pas idéal pour comprendre de quoi il s’agit. C’est là que les incompréhensions naissent. Par exemple, dire qu’un tel concept pourrait demain remplacer les personnes qui produisent des programmes informatiques n’a pas de sens.

À supposer que cela puisse avoir une chance d’être vrai pour les applications web, il restera toujours des data scientists, ingénieurs ou développeuses pour construire les algorithmes d’apprentissage. Même si le monstre de Frankenstein, né sous la plume de Mary Shelley, fait rêver, il relève de la pure fiction.

Les fantasmes naissent parce que les dessous de l’apprentissage automatique ne sont pas toujours expliqués. Cela ne nous aide pas à comprendre ce domaine. C’est pourquoi ce n’est pas l’approche de la boîte noire magique que nous emprunterons.

2. L’approche par les mathématiques et statistiques

Il y a beaucoup de mathématiques et de statistiques derrière l’apprentissage automatique. C’est pourquoi certains abordent le concept sous...

Différentes étapes d’un projet d’apprentissage automatique

Un projet d’apprentissage automatique se découpe en plusieurs étapes. Plusieurs « découpages » sont proposés sur la Toile. Nous allons en voir un qui n’est pas l’absolue vérité, mais un point de vue. Connaître les différentes étapes d’un projet d’apprentissage machine permet de comprendre les options que Spark met à notre disposition.

  • La première étape est le prétraitement des données. Les données vous arrivent rarement dans un état directement exploitable. La plupart du temps, il s’agit de les retravailler pour s’en servir. Cela comprend des phases de nettoyage, de filtrage et d’enrichissement. Nombre d’opérations peuvent d’ailleurs se faire par l’intermédiaire des API que nous avons vues précédemment. Il y a aussi d’autres transformations spécialisées pour l’apprentissage automatique. Vous les trouvez dans le module MLlib de Spark. Ces différentes phases de prétraitement permettent d’extraire des caractéristiques (il est habituel de parler de features, mais nous nous en tiendrons au terme français dans cet ouvrage) ; le concept de "caractéristiques" sera expliqué dans un second temps. Les caractéristiques constituent notre base pour appliquer un algorithme capable de générer une fonction décrivant les structures de données.

  • Ce dernier procédé représente la phase d’entraînement. C’est la deuxième grande étape de l’apprentissage automatique après le prétraitement des données. C’est par celle-ci que vous établissez des connexions entre les informations que vous possédez. Le résultat de l’entraînement est une fonction. C’est le moment où nous donnons à un algorithme des couleurs de diamants, par exemple pour en extraire une fonction.

  • La troisième et dernière phase se nomme l’inférence. Nous y exploitons la fonction générée durant l’entraînement. Nous l’appliquons à de nouvelles données...

Classification

1. Définition

Il est temps à présent de passer au cœur de MLlib : l’entrainement (également appelé apprentissage). Une fois que vous avez préparé vos données, vous alimentez alors un algorithme avec lesdites données pour comprendre les structures au sein de celles-ci. Ces dernières sont enregistrées dans une fonction que vous pouvez alors utiliser pour générer des prédictions. Cette fonction est plus communément appelée modèle. Ainsi, à l’étape d’entraînement, nous construisons un modèle.

Lors de l’inférence, nous nous en servons pour faire des prédictions.

Nous distinguons généralement deux formes d’apprentissages : supervisé et non supervisé. Cette catégorisation dans certains cas peut paraître simpliste par rapport à la réalité des modèles qui sont parfois des formes hybrides de différentes structures (un mélange d’apprentissages supervisé et non supervisé, voire d’autres formes d’apprentissages). Cependant, dans beaucoup de situations, les concepts d’apprentissage supervisé et non supervisé ont encore du sens et de l’avenir devant eux.

Nous laissons de côté tout ce qui est non supervisé pour l’instant. Pour le moment, nous nous penchons sur l’apprentissage supervisé. C’est surtout dans ce cadre qu’il est habituel de parler de prédictions. Nous cherchons à deviner des valeurs à partir de caractéristiques. Pour savoir si un nouveau diamant mis sur le marché aura du succès, nous analysons l’appréciation des diamants déjà existants. Nous avons à notre disposition des données du passé. Il y a d’un côté les caractéristiques du produit, c’est-à-dire la taille ou la couleur par exemple, de l’autre, ce que nous cherchons à prédire, ce qui est appelé la cible. Dans ce contexte, il s’agit de l’appréciation du diamant : le diamant a-t-il été apprécié ou pas ? Nous pourrions imaginer que la réponse est sous forme catégorielle....

Régression

1. Définition

La classification est une technique qui permet de prédire des valeurs discrètes. Or, dans le monde de l’apprentissage automatique, nous avons aussi besoin de prédire des cibles qui sont dites continues. Cela signifie que les valeurs sont infinies. Supposons que nous voulons inférer les prix des diamants. Il n’est plus question de classification. Face à une infinité de prix possibles, cet algorithme est inadapté, à moins de reformuler le problème en tranches de tarifs. Cette fois-ci, nous allons user de la régression. Il s’agit de prédire une valeur quantitative. Il y a différents algorithmes qui permettent de faire cela. Plusieurs sont disponibles dans Spark. Les arbres de décision et les forêts aléatoires que nous avons vus sont utilisables pour faire de la régression. Les classes ont été adaptées. Au lieu de recourir à DecisionTreeClassifier, vous usez de DecisionTreeRegressor par exemple. Il y a aussi des objets Spark dédiés à la régression, en particulier à la régression linéaire (un modèle de régression bien connu dans le domaine).

2. Différents algorithmes

a. L’arbre de décision

Commençons par un exemple d’arbre de décision que nous connaissons un peu. Partons sur des données légèrement différentes. Nous voulons prédire le prix des diamants en fonction de leur taille. Voici les colonnes que nous avons :

prix

taille

51

35

45

20

50

30

55

40

44

15

Nous avons toujours besoin d’une étape de vectorisation pour transformer nos caractéristiques en des données consommables par l’algorithme d’apprentissage.

from pyspark.ml.feature import VectorAssembler 
 
diamants: DataFrame = VectorAssembler(inputCols=["taille"],  
outputCol="features").transform(diamants_pre_features) 

Puis, nous enclenchons l’entraînement. La classe DecisionTreeRegressor nous permet de construire un modèle alors utilisable sur de nouvelles données.

from pyspark.ml.regression import DecisionTreeRegressor,  
DecisionTreeRegressionModel 
 
createur_arbre_de_decision: DecisionTreeRegressor =  
DecisionTreeRegressor(labelCol="prix"...

Apprentissage non supervisé

1. Définition

Dans l’apprentissage supervisé, nous avons des cibles que nous cherchons à prédire. Dans l’apprentissage non supervisé, qui suit un autre raisonnement, nous cherchons toujours à repérer des structures dans les données, mais il n’y a plus vraiment d’idée de prédictions. Vous retrouverez cependant le terme quelquefois, et notamment dans Spark, mais la logique est différente. L’exemple qui est le plus célèbre et qui est une bonne entrée en matière est le partitionnement de données (clustering). Il ne s’agit pas là de mettre au point une action technique pour choisir la meilleure manière de ranger nos données sur les machines. Nous parlons ici de partitionnement au sens fonctionnel du terme. Le but est de réunir les données qui présentent des similarités dans un même groupe. C’est assez utile dans l’étude des populations. Les diamants qui sont présents sur la Toile sont achetés par des personnes que nous pouvons catégoriser par exemple selon la quantité de diamants achetée : il y a les acheteurs occasionnels, qui acquièrent un diamant uniquement pour de grandes occasions, comme un mariage ; il y a les acheteurs compulsifs, très à l’aise financièrement ; et entre les deux, doit se situer une tranche de la population qui aime se faire plaisir de temps en temps avec un objet précieux. Nous dressons ainsi différents types de profils d’acheteurs. Ce que nous imaginons là est peut-être complètement faussé par nos préjugés. C’est pourquoi il est bon de faire de l’analyse de données. Il existe une technique pour regrouper des individus qui présentent des similarités : c’est le partitionnement automatique, qui classe en plusieurs groupes une population. Nous avons toujours des caractéristiques. C’est la cible qui est manquante. Et le but n’est pas le même. Nous extrayons nos partitions des données sans avoir recours à un historique en particulier.

En ce qui concerne l’apprentissage automatique non supervisé, Spark propose essentiellement du partitionnement de données....

Recommandation

1. Définition

La recommandation est un type d’apprentissage automatique encore différent de ce que nous avons pu voir jusqu’ici. Elle s’appuie cependant sur plusieurs principes déjà évoqués. Il n’est pas toujours évident de cerner ce à quoi le concept renvoie exactement. Pourtant, les algorithmes de recommandation sont de plus en plus nombreux dans notre quotidien. Netflix n’est pas la seule compagnie à en user. La recommandation est un concept qui est en train de se démocratiser. Il y a plusieurs manières de le mettre en œuvre.

Vous trouverez souvent des techniques basées sur le contenu. Cela signifie que vous analysez les caractéristiques des objets ou des personnes contenus dans votre base. Supposons que nous sommes sur un site d’e-commerce et que nous voulons vendre des diamants. Nous voulons recommander à nos acheteurs et acheteuses les produits les plus susceptibles de leur plaire. Pour cela, nous pouvons visualiser leur historique d’achat et analyser les pierres précieuses qu’ils ont déjà achetées.

Nous étudions les caractéristiques de celles-ci. Si nous remarquons que la personne n’achète que des diamants rouges, il peut être intéressant de lui en proposer de nouveaux dans cette couleur ou une couleur avoisinante telle que le rose. Nous faisons ici une recommandation à partir d’une approche basée sur le contenu. En l’occurrence, ce sont les produits, mais ce peut aussi être les acheteurs. Si un acheteur a 25 ans, ses goûts sont peut-être comparables à ceux des personnes du même âge et nous pouvons lui recommander ce que les individus de 25 ans ont acheté.

L’approche basée sur le contenu marque des points dans le monde de la recommandation. Elle a cependant aussi des limites. Elle n’est pas capable de capturer des structures plus complexes qui ne se situent pas au niveau de caractéristiques visibles. C’est pourquoi vous trouverez aussi des approches basées sur la collaboration, qui s’attachent davantage à étudier les comportements des utilisateurs pour recommander un produit. Spark se concentre sur ce type de recommandation. Vous pouvez en fait gérer vous-même une approche basée...

Apprentissage profond

1. Définition

Spark n’offre que peu de possibilités en matière d’apprentissage profond. C’est pourquoi les data scientists préfèrent généralement se tourner vers d’autres librairies comme TensorFlow, Keras ou Pytorch. Plusieurs projets pour les utiliser conjointement avec le système distribué de Spark ont vu le jour. Ils existent toujours.

Aujourd’hui, un framework comme TensorFlow intègre ses propres mécanismes de distribution. Toutefois, il serait injuste de dire qu’il est impossible de faire nativement de l’apprentissage profond avec Spark. L’implémentation est simplement très limitée. Nous allons voir la seule classe qui vous permet d’en faire.

Avant cela, expliquons ce qu’est l’apprentissage profond. Tous les algorithmes que nous avons vus précédemment sont des algorithmes d’apprentissage non profond. Ils ne sont peut-être plus sous les feux des projecteurs aujourd’hui, mais ils restent très utiles dans bien des situations. Il n’est pas toujours nécessaire d’avoir un algorithme complexe pour capturer les structures des données. Quand c’est nécessaire, nous pouvons alors nous tourner vers des systèmes plus compliqués, et notamment vers les réseaux de neurones artificiels. Ils s’inspirent dans une faible mesure de la manière dont notre cerveau fonctionne. Il s’agit là d’une métaphore, et en tant que telle, elle a des limites. Comme les arbres de décision, les réseaux...

Opérations statistiques

1. Mesurer la corrélation de plusieurs variables

L’apprentissage automatique a sa place dans le monde des statistiques. C’est la raison pour laquelle au sein de son composant MLlib, Spark propose aussi des outils pour des opérations statistiques plus classiques. Elles servent à comprendre les données que vous traitez et à choisir la meilleure forme d’apprentissage pour celles-ci.

Commençons par le calcul de corrélation entre deux séries de données. C’est important pour évaluer si deux caractéristiques sont en fait redondantes. Nous allons faire un test où nous prédisons le succès d’un diamant selon deux attributs : son prix et sa taille. Nous choisissons exactement les mêmes valeurs pour l’un et pour l’autre. Cela signifie alors qu’il y a parfaite corrélation entre les deux.

from typing import List 
from pyspark.sql import DataFrame 
from pyspark.sql.types import StructType, StructField,  
IntegerType 
 
data: List = [(51, 51, 0), 
              (45, 45, 1), 
              (50, 50, 1), 
              (55, 55, 0), 
              (44, 44, 1) 
  ] 
 
schema: StructType = StructType([ \ 
    StructField("prix", IntegerType(), True), \ 
    StructField("taille", IntegerType(), True), \ 
    StructField("succes", IntegerType(), True) 
  ]) 
 
diamants_pre_features: DataFrame =  
spark.createDataFrame(data=data,schema=schema) 
diamants_pre_features.show() 

prix

taille

succes

51

51

0

45

45

1

50

50

1

55

55

0

44

44

1

Nous rangeons les colonnes...