16 KiB
Introduction à la classification
Dans ces quatre leçons, vous allez explorer un aspect fondamental de l'apprentissage automatique classique : la classification. Nous allons examiner l'utilisation de divers algorithmes de classification avec un ensemble de données sur les cuisines brillantes d'Asie et d'Inde. Préparez-vous à avoir l'eau à la bouche !
Célébrez les cuisines pan-asiatiques dans ces leçons ! Image par Jen Looper
La classification est une forme d'apprentissage supervisé qui partage de nombreux points communs avec les techniques de régression. Si l'apprentissage automatique consiste à prédire des valeurs ou des catégories en utilisant des ensembles de données, alors la classification se divise généralement en deux groupes : classification binaire et classification multiclasses.
🎥 Cliquez sur l'image ci-dessus pour une vidéo : John Guttag du MIT introduit la classification
Rappelons-nous :
- La régression linéaire vous a aidé à prédire les relations entre des variables et à faire des prédictions précises sur la position d'un nouveau point de données par rapport à cette ligne. Par exemple, vous pouviez prédire quel serait le prix d'une citrouille en septembre par rapport à décembre.
- La régression logistique vous a permis de découvrir des "catégories binaires" : à ce prix, cette citrouille est-elle orange ou non-orange ?
La classification utilise divers algorithmes pour déterminer d'autres façons d'attribuer une étiquette ou une classe à un point de données. Travaillons avec ces données sur les cuisines pour voir si, en observant un groupe d'ingrédients, nous pouvons déterminer son origine culinaire.
Quiz pré-lecture
Cette leçon est disponible en R !
Introduction
La classification est l'une des activités fondamentales des chercheurs en apprentissage automatique et des data scientists. De la classification basique d'une valeur binaire ("cet email est-il un spam ou non ?") à la classification et segmentation complexes d'images utilisant la vision par ordinateur, il est toujours utile de pouvoir trier des données en classes et leur poser des questions.
Pour formuler le processus de manière plus scientifique, votre méthode de classification crée un modèle prédictif qui vous permet de cartographier la relation entre les variables d'entrée et les variables de sortie.
Problèmes binaires vs multiclasses pour les algorithmes de classification. Infographie par Jen Looper
Avant de commencer le processus de nettoyage de nos données, de leur visualisation et de leur préparation pour nos tâches d'apprentissage automatique, apprenons un peu plus sur les différentes façons dont l'apprentissage automatique peut être utilisé pour classer des données.
Dérivée des statistiques, la classification utilisant l'apprentissage automatique classique utilise des caractéristiques, telles que smoker
, weight
et age
, pour déterminer la probabilité de développer une maladie X. En tant que technique d'apprentissage supervisé similaire aux exercices de régression que vous avez effectués précédemment, vos données sont étiquetées et les algorithmes d'apprentissage automatique utilisent ces étiquettes pour classer et prédire des classes (ou "caractéristiques") d'un ensemble de données et les assigner à un groupe ou un résultat.
✅ Prenez un moment pour imaginer un ensemble de données sur les cuisines. Quelles questions un modèle multiclasses pourrait-il répondre ? Et un modèle binaire ? Que se passerait-il si vous vouliez déterminer si une cuisine donnée était susceptible d'utiliser du fenugrec ? Ou si, en recevant un sac d'épicerie rempli d'anis étoilé, d'artichauts, de chou-fleur et de raifort, vous pouviez créer un plat typiquement indien ?
🎥 Cliquez sur l'image ci-dessus pour une vidéo. Tout le concept de l'émission 'Chopped' repose sur le "panier mystère" où les chefs doivent préparer un plat à partir d'un choix aléatoire d'ingrédients. Un modèle d'apprentissage automatique aurait sûrement aidé !
Bonjour 'classificateur'
La question que nous voulons poser à cet ensemble de données sur les cuisines est en fait une question multiclasses, car nous avons plusieurs cuisines nationales potentielles à examiner. Étant donné un lot d'ingrédients, à laquelle de ces nombreuses classes les données appartiendront-elles ?
Scikit-learn propose plusieurs algorithmes différents pour classifier les données, selon le type de problème que vous souhaitez résoudre. Dans les deux prochaines leçons, vous apprendrez à utiliser plusieurs de ces algorithmes.
Exercice - nettoyer et équilibrer vos données
La première tâche à accomplir, avant de commencer ce projet, est de nettoyer et d'équilibrer vos données pour obtenir de meilleurs résultats. Commencez avec le fichier vierge notebook.ipynb situé à la racine de ce dossier.
La première chose à installer est imblearn. Il s'agit d'un package Scikit-learn qui vous permettra de mieux équilibrer les données (vous en apprendrez davantage sur cette tâche dans un instant).
-
Pour installer
imblearn
, exécutezpip install
, comme suit :pip install imblearn
-
Importez les packages nécessaires pour importer vos données et les visualiser, et importez également
SMOTE
depuisimblearn
.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Vous êtes maintenant prêt à importer les données.
-
La tâche suivante consiste à importer les données :
df = pd.read_csv('../data/cuisines.csv')
L'utilisation de
read_csv()
lira le contenu du fichier csv cusines.csv et le placera dans la variabledf
. -
Vérifiez la forme des données :
df.head()
Les cinq premières lignes ressemblent à ceci :
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Obtenez des informations sur ces données en appelant
info()
:df.info()
Votre sortie ressemble à :
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB
Exercice - découvrir les cuisines
Maintenant, le travail devient plus intéressant. Découvrons la distribution des données par cuisine.
-
Tracez les données sous forme de barres en appelant
barh()
:df.cuisine.value_counts().plot.barh()
Il existe un nombre fini de cuisines, mais la distribution des données est inégale. Vous pouvez corriger cela ! Avant de le faire, explorez un peu plus.
-
Découvrez combien de données sont disponibles par cuisine et imprimez-les :
thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}')
La sortie ressemble à ceci :
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Découvrir les ingrédients
Vous pouvez maintenant approfondir les données et découvrir quels sont les ingrédients typiques par cuisine. Vous devriez éliminer les données récurrentes qui créent de la confusion entre les cuisines, alors apprenons-en davantage sur ce problème.
-
Créez une fonction
create_ingredient()
en Python pour créer un dataframe d'ingrédients. Cette fonction commencera par supprimer une colonne inutile et triera les ingrédients par leur nombre :def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df
Vous pouvez maintenant utiliser cette fonction pour avoir une idée des dix ingrédients les plus populaires par cuisine.
-
Appelez
create_ingredient()
et tracez les résultats en appelantbarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Faites de même pour les données japonaises :
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Maintenant pour les ingrédients chinois :
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Tracez les ingrédients indiens :
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Enfin, tracez les ingrédients coréens :
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Maintenant, supprimez les ingrédients les plus communs qui créent de la confusion entre les cuisines distinctes, en appelant
drop()
:Tout le monde aime le riz, l'ail et le gingembre !
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Équilibrer l'ensemble de données
Maintenant que vous avez nettoyé les données, utilisez SMOTE - "Synthetic Minority Over-sampling Technique" - pour les équilibrer.
-
Appelez
fit_resample()
, cette stratégie génère de nouveaux échantillons par interpolation.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
En équilibrant vos données, vous obtiendrez de meilleurs résultats lors de leur classification. Pensez à une classification binaire. Si la majorité de vos données appartient à une classe, un modèle d'apprentissage automatique prédira cette classe plus fréquemment, simplement parce qu'il y a plus de données pour elle. L'équilibrage des données corrige ce déséquilibre.
-
Vous pouvez maintenant vérifier le nombre d'étiquettes par ingrédient :
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Votre sortie ressemble à ceci :
new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64
Les données sont propres, équilibrées et très appétissantes !
-
La dernière étape consiste à sauvegarder vos données équilibrées, y compris les étiquettes et les caractéristiques, dans un nouveau dataframe qui peut être exporté dans un fichier :
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Vous pouvez jeter un dernier coup d'œil aux données en utilisant
transformed_df.head()
ettransformed_df.info()
. Sauvegardez une copie de ces données pour les utiliser dans les leçons futures :transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Ce nouveau fichier CSV se trouve maintenant dans le dossier racine des données.
🚀Défi
Ce programme contient plusieurs ensembles de données intéressants. Explorez les dossiers data
et voyez si certains contiennent des ensembles de données appropriés pour une classification binaire ou multiclasses. Quelles questions poseriez-vous à cet ensemble de données ?
Quiz post-lecture
Révision et auto-apprentissage
Explorez l'API de SMOTE. Pour quels cas d'utilisation est-il le mieux adapté ? Quels problèmes résout-il ?
Devoir
Explorez les méthodes de classification
Avertissement :
Ce document a été traduit à l'aide du service de traduction automatique Co-op Translator. Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.