Aller au contenu
English

L'apprentissage supervisé

  • Leçon 2
  • 55 min
  • Module 1 : Comprendre l'apprentissage automatique
Leçon 2 sur 27 · Apprentissage automatique : du problème à un modèle fiableL'apprentissage supervisé

Ce que vous saurez faire

Comprenez comment un programme apprend avec des exemples accompagnés de la bonne réponse, et pourquoi on appelle cela l’apprentissage supervisé. Pour toute prédiction, vous pourrez ensuite nommer ce que le modèle observe (les caractéristiques) et apprend à fournir (l’étiquette). Vous pourrez aussi dire si la réponse est une classe ou un nombre.

Carnet JupyterFaites cette leçon dans un carnet JupyterColab · Kaggle · GitHub · en anglais

Le carnet (notebook) Jupyter enseigne les noms des couleurs à un modèle avec 15 échantillons colorés. Il prédit aussi le prix d’un appartement à partir de sa superficie. Ensuite, il sépare les billets de soutien de Larkfield en caractéristiques et en étiquette. Ses cellules de préparation installent pandas et scikit-learn et téléchargent les données d’exercice. Aucune configuration locale n’est donc nécessaire. Environ 25 minutes.

Le carnet est en anglais. Colab et Kaggle ouvrent votre propre copie. Il faut un compte Google ou Kaggle gratuit. Vous êtes bloqué ? Consultez le carnet de solution.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 55 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur (seulement pour le parcours local; le carnet ne nécessite rien de tout cela)

Le carnet a été testé dans Jupyter sur macOS. Il utilisait Python 3.14.6, pandas 3.0.6, scikit-learn 1.9.1 et matplotlib 3.11.2.

Pensez à la façon dont une petite fille apprend les noms des couleurs. Vous lui montrez une balle rouge et dites « rouge ». Plus tard, vous lui montrez une voiture rouge et dites encore « rouge », puis une tasse bleue : « bleu ». Un jour, elle pointe une orange et dit « rouge ». Vous dites : « Non, c’est orange. » Après de nombreux exemples et de petites corrections, quelque chose change. Elle voit un jouet qu’elle n’a jamais vu et dit « vert ». Elle a raison.

Regardez ce qu’elle a appris et ce que personne ne lui a dit. Vous n’avez jamais expliqué que la forme ne compte pas, ni qu’une voiture et une balle peuvent avoir la même couleur. Elle a découvert, grâce aux exemples, que seule la couleur détermine le mot. Vous ne lui avez pas non plus donné une règle comme « le vert se situe entre le jaune et le bleu ». Elle a appris la règle avec des exemples accompagnés de la bonne réponse. Elle peut maintenant l’appliquer à des objets qu’elle n’a jamais vus.

Un ordinateur peut apprendre de la même façon. Cette leçon montre comment et donne un nom technique à chaque partie de l’histoire.

Chaque partie de l’histoire des couleurs porte un nom en apprentissage automatique :

  • Chaque objet que vous montrez à l’enfant est un exemple. Dans les données, un exemple correspond à une ligne.
  • Ce que l’enfant observe, la couleur, est une caractéristique. Une caractéristique est un fait sur un exemple que le modèle utilise comme entrée. Un exemple a généralement plusieurs caractéristiques.
  • Le mot que vous dites, « rouge », est l’étiquette : la bonne réponse pour cet exemple.
  • Vos corrections (« non, c’est orange ») sont la supervision. Pendant l’apprentissage, quelqu’un fournit la bonne réponse pour chaque exemple afin que l’apprenant puisse corriger ses erreurs.
  • Quand l’enfant nomme un nouveau jouet, c’est une prédiction.
  • Quand elle nomme correctement de nouveaux jouets, elle généralise. La généralisation signifie qu’un modèle réussit sur de nouveaux exemples, pas seulement sur ceux utilisés pour apprendre. C’est la seule chose qui compte en pratique.

On appelle donc ce type d’apprentissage apprentissage supervisé : un superviseur fournit la bonne réponse pour chaque exemple pendant l’apprentissage. En apprentissage automatique, le superviseur est rarement une personne assise à côté de l’ordinateur. C’est la colonne d’étiquettes dans les données : quelqu’un ou quelque chose a écrit les bonnes réponses auparavant. Le programme apprend à partir de ces réponses.

L’image présente l’histoire des couleurs sous forme de données. Chaque échantillon est un exemple. Sa couleur est la caractéristique, et sa carte avec le nom est l’étiquette.

Quinze carrés colorés, chacun avec une carte portant son nom en dessous : trois rouges, trois orange, trois jaunes, trois verts et trois bleus, dans un ordre mélangé. Une flèche mène à un nouveau carré orange dont la carte porte un point d'interrogation. Une deuxième flèche mène au même carré avec une carte en pointillés qui indique orange.
Apprentissage supervisé : 15 exemples, chacun avec son étiquette (la carte portant le nom). Le modèle apprend à partir de ces exemples, puis prédit l'étiquette d'un nouvel échantillon qu'il n'a jamais vu.
Description textuelle du diagramme

À gauche, 15 échantillons de couleur apparaissent dans un ordre mélangé, comme un enfant les rencontre. Chacun a une carte portant son nom en dessous : rouge, vert, bleu, orange ou jaune. Chaque nom correspond à trois échantillons de nuances différentes, par exemple un rouge foncé et un rouge pâle.

Une flèche mène à un nouvel échantillon orange avec une carte portant un point d’interrogation : personne n’a donné son nom. Une deuxième flèche mène au même échantillon avec une carte en pointillés qui indique « orange ». C’est la prédiction : le nom que le modèle donne après avoir appris à partir des 15 exemples étiquetés.

Un ordinateur voit une couleur comme trois nombres : les quantités de lumière rouge, verte et bleue, chacune de 0 à 255. Le rouge pur correspond à (255, 0, 0), et le blanc à (255, 255, 255). Dans les données, un échantillon est donc une ligne avec trois caractéristiques et une étiquette. Le carnet crée les 15 échantillons de l’image sous forme de DataFrame :

swatches = pd.DataFrame(
[("red", 220, 40, 40), ("red", 190, 25, 35), ("red", 235, 70, 60),
("orange", 245, 135, 35), ("orange", 235, 115, 25), ("orange", 250, 155, 60),
("yellow", 250, 220, 50), ("yellow", 240, 205, 40), ("yellow", 255, 235, 100),
("green", 50, 165, 70), ("green", 90, 190, 80), ("green", 30, 130, 55),
("blue", 40, 100, 200), ("blue", 80, 140, 225), ("blue", 30, 70, 170)],
columns=["name", "red", "green", "blue"],
)
X = swatches[["red", "green", "blue"]] # the features
y = swatches["name"] # the label
print(X.shape, y.shape)
swatches.head(4)

Le résultat :

(15, 3) (15,)
name red green blue
0 red 220 40 40
1 red 190 25 35
2 red 235 70 60
3 orange 245 135 35

Par convention, les caractéristiques se trouvent dans un tableau nommé X, avec une ligne par exemple. Les étiquettes se trouvent dans une colonne nommée y, avec une valeur par exemple. X contient 15 lignes et 3 colonnes; y contient 15 valeurs.

Priya entraîne un classificateur par plus proches voisins. Son principe est simple : pour un nouvel échantillon, il cherche les 3 exemples les plus semblables et donne leur nom le plus fréquent. « Les plus semblables » signifie que les trois nombres sont les plus proches. L’entraînement tient en une ligne et reçoit à la fois X et y : les caractéristiques et les bonnes réponses. La dernière ligne utilise show_swatches(), une petite fonction du carnet qui dessine les échantillons avec un nom sous chacun.

from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X, y) # training: learn from examples with labels
new = pd.DataFrame([(200, 60, 50), (110, 170, 220), (240, 125, 40)], columns=["red", "green", "blue"])
predictions = model.predict(new) # prediction: no labels here
print(list(predictions))
show_swatches(new, predictions, "Three new swatches and the predicted names")

Le résultat (le carnet dessine aussi les trois échantillons avec leurs noms) :

['red', 'blue', 'orange']

Le modèle n’a jamais vu ces trois échantillons, et il les a tous nommés comme une personne le ferait. Pourquoi « orange » pour le troisième? Priya demande au modèle les 3 exemples utilisés et la distance de chacun :

distances, rows = model.kneighbors(new.iloc[[2]])
nearest = swatches.iloc[rows[0]].assign(distance=distances[0].round(0))
nearest

Le résultat :

name red green blue distance
3 orange 245 135 35 12.0
4 orange 235 115 25 19.0
5 orange 250 155 60 37.0

La distance mesure la différence entre deux couleurs : 0 signifie que les trois nombres sont identiques. Les trois exemples les plus proches sont orange, donc la prédiction est « orange ». Le modèle a fait comme l’enfant : il a comparé la nouvelle couleur aux couleurs connues et utilisé leurs noms.

Deux types de réponses : classification et régression

Section intitulée « Deux types de réponses : classification et régression »

Le nom de la couleur est une classe : une réponse parmi quelques réponses fixes. Quand l’étiquette est une classe, la tâche est la classification. De nombreux systèmes courants font de la classification. Un filtre antipourriel répond « pourriel » ou « pas un pourriel ». Un système de dépistage indique si une image médicale « nécessite l’examen d’un médecin » ou non. Une boutique en ligne place chaque nouveau produit dans une catégorie, comme « jardin » ou « cuisine ». Quand il n’y a que deux classes, comme pour les pourriels, la tâche est la classification binaire.

D’autres questions demandent un nombre comme réponse. Par exemple, le prix d’une maison, les minutes avant l’arrivée d’une livraison ou la température de demain. Quand l’étiquette est un nombre, la tâche est la régression. Le nom est historique : il vient d’une étude du 19e siècle sur la taille des parents et des enfants. Aujourd’hui, il signifie prédire un nombre.

Le principe d’apprentissage est le même dans les deux cas. Voici un petit exemple de régression qui utilise le même principe des plus proches voisins. Huit appartements ont une superficie en mètres carrés (la caractéristique) et un prix en milliers de dollars (l’étiquette). Pour un nouvel appartement de 70 mètres carrés, le modèle trouve les 3 appartements dont la superficie est la plus proche. Il donne la moyenne de leurs prix :

from sklearn.neighbors import KNeighborsRegressor
flats = pd.DataFrame({
"size_m2": [35, 42, 50, 58, 65, 80, 95, 110],
"price_k": [150, 175, 200, 230, 255, 300, 345, 390],
})
price_model = KNeighborsRegressor(n_neighbors=3)
price_model.fit(flats[["size_m2"]], flats["price_k"])
new_flat = pd.DataFrame({"size_m2": [70]})
print(round(price_model.predict(new_flat)[0], 2))

Le résultat :

261.67

Les 3 appartements les plus semblables font 65, 80 et 58 mètres carrés, avec des prix de 255, 300 et 230. Leur moyenne est 785 ÷ 3 = 261,67, donc le modèle prédit environ 262 000 $.

  • Appartements au prix connu (exemples)
  • Prix prédit, 70 m²
Huit appartements avec leur superficie et leur prix (les exemples), et le prix prédit d'un nouvel appartement de 70 mètres carrés.
Description textuelle du graphique

Un nuage de points représentant huit appartements. L’axe horizontal indique la superficie, de 30 à 115 mètres carrés. L’axe vertical indique le prix, de 0 à 400 milliers de dollars. Les points montent de gauche à droite. Les huit appartements sont : 35 mètres carrés pour 150, 42 pour 175, 50 pour 200, 58 pour 230, 65 pour 255, 80 pour 300, 95 pour 345 et 110 pour 390. Un neuvième point, d’une autre couleur, représente la prédiction pour un nouvel appartement de 70 mètres carrés. Il se situe à 261,67, entre les appartements de 65 et 80 mètres carrés.

Les deux types de réponses présentent une différence pratique. Pour un prix, une prédiction de 262 quand la vraie valeur est 265 est presque juste. Vous pouvez mesurer son écart. Pour une couleur, « orange » quand la vraie réponse est « rouge » est faux. Vous ne pouvez pas dire que c’est « presque rouge ». Cette différence détermine comment vous mesurez un modèle, et le module 3 porte précisément sur ce sujet.

Question L’étiquette Type de réponse Tâche
Ce courriel est-il un pourriel? pourriel ou non Une classe (deux) Classification
Quel est ce chiffre écrit à la main? 0 à 9 Une classe (dix) Classification
Dans quelle catégorie se trouve ce nouveau produit? jardin, cuisine, … Une classe Classification
Ce nouveau billet sera-t-il transféré à un agent principal dans les 72 heures? 1 ou 0 Une classe (deux) Classification
À quel prix cette maison se vendra-t-elle? un prix Un nombre Régression
Combien de minutes avant l’arrivée de cette livraison? minutes Un nombre Régression
Quelle sera la température demain? degrés Un nombre Régression
Combien de billets arriveront demain? un compte Un nombre Régression

L’historique de Larkfield a la même structure que les échantillons de couleur, mais à plus grande échelle. Une ligne correspond à un billet. Dix colonnes décrivent le billet au moment de son arrivée. Elles comprennent le canal, l’équipe, la priorité, la valeur de la commande et l’historique du client. Ce sont les caractéristiques. La colonne escalated_72h indique ce qui s’est passé ensuite : 1 si un agent principal a pris en charge le billet dans les 72 heures, sinon 0. C’est l’étiquette. Dans ce cours, on appelle aussi l’étiquette la cible : la colonne que le modèle apprend à prédire. Les deux mots ont ici le même sens.

L’historique de Larkfield se trouve dans trois fichiers. Le plus volumineux, train.csv, contient les billets jusqu’à avril 2026, et les modèles apprennent à partir de celui-ci. Données d’entraînement, de validation et de test explique pourquoi il y a trois fichiers. Priya lit les billets d’entraînement et en examine trois :

train = pd.read_csv("data/train.csv", dtype={"customer_id": "string"},
keep_default_na=False, na_values=[""])
FEATURES = ["channel", "team", "segment", "region", "priority", "order_value", "word_count",
"customer_tenure_days", "prior_tickets_90d", "created_hour"]
TARGET = "escalated_72h"
train[FEATURES + [TARGET]].head(3)

Le résultat, sous forme de tableau :

channel team segment region priority order_value word_count customer_tenure_days prior_tickets_90d created_hour escalated_72h
chat delivery home south 3 53.76 48 738.0 0 6 0
phone warranty home north 1 24.30 85 1496.0 0 7 0
chat returns business east 3 699.55 111 1243.0 0 7 0

Les dix premières colonnes sont les caractéristiques : ce que le modèle observe, comme l’enfant observe la couleur. La dernière colonne est l’étiquette : la bonne réponse, comme la carte portant le nom. Priya sépare ensuite le tableau en X et y, exactement comme pour les échantillons :

X = train[FEATURES]
y = train[TARGET]
print("X:", X.shape, " y:", y.shape)
print(y.value_counts())

Le résultat :

X: (16939, 10) y: (16939,)
escalated_72h
0 14956
1 1983
Name: count, dtype: int64

X contient 16 939 lignes et 10 caractéristiques. y contient une étiquette par billet et seulement deux valeurs : 0 pour 14 956 billets et 1 pour 1 983. L’étiquette est une classe, donc la tâche de Larkfield est la classification binaire.

Une règle compte dès le départ. Le modèle doit connaître chaque caractéristique au moment où il fait la prédiction. Grace veut la prédiction à l’arrivée d’un billet. Une caractéristique ne peut donc pas être un événement ultérieur, comme l’heure de la première réponse. L’étiquette est l’exception : personne ne la connaît avant la suite des événements, et c’est pourquoi le modèle doit la prédire. Traduire un besoin précise exactement quels faits sont connus à ce moment.

L’enfant avait un parent qui disait « rouge ». Un modèle a besoin de la même chose : une bonne réponse pour chaque exemple. Il existe trois sources courantes.

  1. Un événement ultérieur dans l’historique. L’étiquette de Larkfield vient de ce qui s’est passé ensuite : un agent principal a pris le billet, ou non, dans les 72 heures. Personne n’a dû étiqueter les billets à la main. L’étiquette d’une banque, « le prêt a été remboursé », vient aussi de l’historique, mais seulement des années plus tard.
  2. Des personnes qui étiquettent. Les utilisateurs de courriel cliquent sur « signaler comme pourriel ». Les médecins annotent des images médicales. Certaines entreprises paient des personnes pour étiqueter des milliers de photos ou de textes.
  3. Le temps lui-même. La température réelle de demain sera connue demain. La prévision d’aujourd’hui devient un exemple étiqueté le lendemain.

Omar demande : « Si les étiquettes sont si utiles, pourquoi ne pas tout étiqueter? » Parce qu’elles ont un coût. Elles prennent du temps et de l’argent : une heure de travail d’un médecin coûte cher. Elles peuvent tarder : Larkfield attend 72 heures pour chaque étiquette, et une banque attend des années. Elles peuvent aussi être fausses : deux personnes peuvent nommer la même couleur différemment. Une personne fatiguée peut cliquer sur le mauvais bouton en étiquetant. Un modèle apprend ce que disent les étiquettes, comme le montre le cas d’échec ci-dessous.

  1. Ouvrez le carnet à partir de l’encadré Faites cette leçon dans un carnet Jupyter en haut de cette page.
  2. Exécutez les cellules de préparation. La cellule de données se termine par Ready: train 16939 rows (1983 escalated), valid 1179 (183), test 1002 (157). (prêt : entraînement, 16 939 lignes, dont 1 983 transferts; validation, 1 179, dont 183; test, 1 002, dont 157).
  3. Exécutez les sections 1 et 2. Comparez chaque résultat au petit exemple ci-dessus.
  4. Dans la section 3, placez les échantillons (60, 140, 90) et (245, 215, 90) dans un DataFrame practice.
  5. Avant d’exécuter la cellule, notez les noms que vous attendez.
  6. Placez les noms donnés par le modèle dans practice_names, puis exécutez la cellule de vérification.
  7. Dans la section 4, exécutez l’exemple des appartements. Vous devriez voir 261.67.
  8. Placez le prix prédit d’un appartement de 100 mètres carrés, arrondi à 2 décimales, dans price_100. Exécutez la cellule de vérification.
Afficher un exemple de réponse
practice = pd.DataFrame([(60, 140, 90), (245, 215, 90)], columns=["red", "green", "blue"])
practice_names = list(model.predict(practice))
print(practice_names)
['green', 'yellow']
price_100 = round(price_model.predict(pd.DataFrame({"size_m2": [100]}))[0], 2)
print(price_100)
345.0

L’appartement de 100 mètres carrés utilise les appartements de 95, 110 et 80 mètres carrés : (345 + 390 + 300) ÷ 3 = 345.

Changez une chose : l’étiquette. Le fichier data/daily_tickets.csv contient une ligne par jour, de juillet 2024 à juin 2026. Ses caractéristiques sont weekday, is_weekend et month. Son étiquette est tickets, le nombre de billets créés ce jour-là.

Dans la section 6 du carnet, lisez le fichier dans daily, puis créez X_daily et y_daily. Répondez ensuite : prédire y_daily relève-t-il de la classification ou de la régression?

Afficher un exemple de réponse
daily = pd.read_csv("data/daily_tickets.csv")
X_daily = daily[["weekday", "is_weekend", "month"]]
y_daily = daily["tickets"]
print(X_daily.shape, y_daily.shape)
(730, 3) (730,)

L’étiquette est un nombre de billets par jour, donc la prédire relève de la régression. Les données viennent du même service de soutien. Mais l’exemple est maintenant une journée, pas un billet, et l’étiquette est un compte, pas une classe. Vous entraînerez ce modèle au module 4.

Erreur courante

Étiquettes incorrectes

Symptôme : une personne a aidé à étiqueter les échantillons et a nommé « rouge » deux des trois échantillons orange. Priya entraîne le même modèle avec ces étiquettes :

wrong_y = swatches["name"].copy()
wrong_y.iloc[[3, 4]] = "red" # two orange swatches with the wrong label
wrong_model = KNeighborsClassifier(n_neighbors=3).fit(swatches[["red", "green", "blue"]], wrong_y)
print("New orange swatch:", wrong_model.predict(new.iloc[[2]])[0])
agree = (wrong_model.predict(swatches[["red", "green", "blue"]]) == wrong_y).sum()
print("The model agrees with", agree, "of its 15 labels")

Le résultat :

New orange swatch: red
The model agrees with 15 of its 15 labels

Le modèle nomme maintenant « rouge » un échantillon clairement orange. Quand Priya le vérifie avec ses propres étiquettes, il concorde avec les 15, donc rien ne semble incorrect.

Cause : en apprentissage supervisé, les étiquettes sont le superviseur. Le modèle apprend ce qu’elles disent, que ce soit juste ou faux. Une vérification avec les mêmes étiquettes incorrectes ne peut pas détecter le problème.

Solution : avant l’entraînement, examinez manuellement un échantillon des exemples et de leurs étiquettes, et demandez comment chaque étiquette a été créée. Si deux personnes étiquettent les mêmes exemples, comptez la fréquence de leurs désaccords. Corrigez ou retirez les étiquettes incorrectes, puis entraînez de nouveau le modèle.

Conséquence dans le travail en IA : les étiquettes incorrectes sont courantes et passent inaperçues. Un filtre antipourriel entraîné sur des clics négligents de « signaler comme pourriel » apprend à cacher de vrais bulletins d’information. Un modèle médical entraîné sur les étiquettes d’une seule personne fatiguée reproduit ses erreurs. Aucun message d’erreur n’apparaît : le modèle devient simplement une copie fidèle d’un superviseur qui se trompe.

Vérifiez votre compréhension

Pourquoi appelle-t-on l'apprentissage supervisé ainsi? Dans le modèle de billets de Larkfield, qu'est-ce qui joue le rôle du superviseur?

Afficher la réponse

Pendant l’apprentissage, un superviseur donne la bonne réponse pour chaque exemple, comme un parent dit « rouge » ou « non, c’est orange » à un enfant. Le modèle apprend de ces réponses, qui corrigent ses erreurs. Dans le modèle de Larkfield, le superviseur est la colonne d’étiquettes escalated_72h. L’historique de chaque ancien billet indique s’il a été transmis à un niveau supérieur dans les 72 heures.

Vérifiez votre compréhension

Classification ou régression? (a) les minutes avant l'arrivée d'un colis; (b) si un paiement par carte est frauduleux; (c) le nombre de billets demain; (d) laquelle des cinq équipes de Larkfield devrait prendre un nouveau billet.

Afficher la réponse

(a) Régression : la réponse est un nombre de minutes. (b) Classification : deux classes, fraude ou non. (c) Régression : la réponse est un dénombrement. (d) Classification : la réponse est l’une des cinq classes, les équipes. Un nom d’équipe n’a pas de grandeur : « paiement » n’est pas « presque garantie ».

Vérifiez votre compréhension

Un modèle reproduit toutes les étiquettes utilisées pour son entraînement, mais il appelle rouges les nouveaux échantillons orange. Quelle est la cause la plus probable, et comment la trouvez-vous?

Afficher la réponse

Certaines étiquettes d’entraînement sont incorrectes : la personne qui aidait a étiqueté des échantillons orange comme « rouges ». Le modèle a appris ce que son superviseur disait. Il reproduit donc ses propres étiquettes, et la vérification semble parfaite. Pour trouver le problème, examinez manuellement un échantillon d’exemples et leurs étiquettes. Ou demandez à une deuxième personne de les étiqueter, puis comptez les désaccords. Ensuite, corrigez les étiquettes et entraînez le modèle de nouveau.

Récapitulatif

  • L’apprentissage supervisé apprend à partir d’exemples accompagnés de la bonne réponse, comme un enfant apprend les noms des couleurs d’un parent. La colonne d’étiquettes est le superviseur.
  • Une caractéristique est un fait sur un exemple que le modèle utilise comme entrée (X). L’étiquette, aussi appelée cible, est la bonne réponse (y). La généralisation signifie obtenir de bons résultats sur de nouveaux exemples.
  • Quand l’étiquette est une classe, la tâche est une classification (noms de couleurs; pourriel ou non; transmis à un niveau supérieur ou non). Quand c’est un nombre, la tâche est une régression (le prix d’un appartement : 261,67 milliers pour 70 mètres carrés).
  • Billets de Larkfield : X contient 16 939 lignes et 10 variables; y est escalated_72h, qui vaut 1 pour 1 983 billets. La tâche est une classification binaire.
  • Les étiquettes proviennent de l’historique, de personnes ou du passage du temps. Elles demandent du temps, peuvent arriver tard et peuvent être incorrectes. Un modèle apprend les étiquettes incorrectes sans aucun avertissement.

Vous verrez ensuite ce qu’un programme peut apprendre sans aucune étiquette : comment rassembler des choses semblables en groupes.

Leçon suivante : L'apprentissage non supervisé