Traveaux Pratiques
TP Pratique : Classification de Fruits avec scikit-learn
Apprenez à construire un classifieur de fruits à partir de leurs caractéristiques physiques
📋 Objectifs du TP
Comprendre le processus complet d'un projet de machine learning
Manipuler des données réelles de caractéristiques de fruits
Implémenter plusieurs algorithmes de classification
Évaluer et comparer les performances des modèles
Visualiser les résultats et les frontières de décision
🍎 Dataset Fruits
Nous utiliserons un jeu de données contenant des mesures de fruits avec leurs étiquettes de classe.
Description des caractéristiques : masse, largeur, hauteur, couleur (valeurs RGB moyennes)
Aperçu des données
Fruit | Masse (g) | Largeur (cm) | Hauteur (cm) | Couleur (R) | Couleur (G) | Couleur (B) |
---|---|---|---|---|---|---|
Pomme | 192 | 8.4 | 7.3 | 215 | 30 | 35 |
Orange | 180 | 7.3 | 7.1 | 255 | 165 | 0 |
Citron | 120 | 5.8 | 6.2 | 255 | 255 | 0 |
Banane | 150 | 3.5 | 8.2 | 255 | 225 | 0 |

🧑💻 Partie Pratique
1. Préparation de l'environnement
Installez les bibliothèques nécessaires :
pip install numpy pandas matplotlib scikit-learn
2. Chargement des données
import pandas as pd
from sklearn.model_selection import train_test_split
# Charger le dataset
url = "https://raw.githubusercontent.com/selva86/datasets/master/fruits.csv"
data = pd.read_csv(url)
# Afficher les premières lignes
print(data.head())
# Séparation features/cible
X = data.drop('fruit_label', axis=1)
y = data['fruit_label']
# Séparation entraînement/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3. Exploration des données
import matplotlib.pyplot as plt
import seaborn as sns
# Statistiques descriptives
print(data.describe())
# Visualisation des distributions
sns.pairplot(data, hue='fruit_name', vars=['mass', 'width', 'height'])
plt.show()
# Matrice de corrélation
plt.figure(figsize=(10, 8))
sns.heatmap(data.corr(), annot=True, cmap='coolwarm')
plt.title('Matrice de Corrélation')
plt.show()
À noter : L'exploration des données est cruciale pour comprendre les relations entre variables et détecter d'éventuels problèmes.
4. Prétraitement des données
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
# Séparation des caractéristiques numériques et catégorielles
numeric_features = ['mass', 'width', 'height', 'color_score']
categorical_features = []
# Création du préprocesseur
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(), categorical_features)
])
# Application aux données
X_train = preprocessor.fit_transform(X_train)
X_test = preprocessor.transform(X_test)
🤖 Implémentation des Modèles
K-Nearest Neighbors (KNN)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# Initialisation du modèle
knn = KNeighborsClassifier(n_neighbors=3)
# Entraînement
knn.fit(X_train, y_train)
# Prédiction et évaluation
y_pred = knn.predict(X_test)
print(f"Accuracy KNN: {accuracy_score(y_test, y_pred):.2f}")
Arbre de Décision
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
# Initialisation et entraînement
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)
# Visualisation de l'arbre
plt.figure(figsize=(15, 10))
tree.plot_tree(dt, feature_names=X.columns,
class_names=data['fruit_name'].unique(), filled=True)
plt.show()
SVM
from sklearn.svm import SVC
# Initialisation et entraînement
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train, y_train)
# Évaluation
y_pred = svm.predict(X_test)
print(f"Accuracy SVM: {accuracy_score(y_test, y_pred):.2f}")
Forêt Aléatoire
from sklearn.ensemble import RandomForestClassifier
# Initialisation et entraînement
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
# Importance des caractéristiques
importances = rf.feature_importances_
plt.barh(X.columns, importances)
plt.title("Importance des Caractéristiques")
plt.show()
📊 Évaluation des Modèles
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
# Fonction pour évaluer un modèle
def evaluate_model(model, X_test, y_test):
y_pred = model.predict(X_test)
# Rapport de classification
print(classification_report(y_test, y_pred))
# Matrice de confusion
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d',
xticklabels=data['fruit_name'].unique(),
yticklabels=data['fruit_name'].unique())
plt.title('Matrice de Confusion')
plt.ylabel('Vérité terrain')
plt.xlabel('Prédictions')
plt.show()
# Évaluation du KNN
print("Évaluation KNN:")
evaluate_model(knn, X_test, y_test)
Bonnes pratiques : Toujours comparer plusieurs métriques (précision, rappel, F1-score) et ne pas se contenter de l'accuracy.
🔍 Amélioration du Modèle
1. Validation Croisée
from sklearn.model_selection import cross_val_score
# Validation croisée pour KNN
scores = cross_val_score(knn, preprocessor.fit_transform(X), y, cv=5)
print(f"Scores de validation croisée: {scores}")
print(f"Moyenne: {scores.mean():.2f} (±{scores.std():.2f})")
2. Optimisation des Hyperparamètres
from sklearn.model_selection import GridSearchCV
# Grille de paramètres pour KNN
param_grid = {
'n_neighbors': range(1, 15),
'weights': ['uniform', 'distance'],
'metric': ['euclidean', 'manhattan']
}
# Recherche par grille
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
# Meilleurs paramètres
print(f"Meilleurs paramètres: {grid_search.best_params_}")
print(f"Meilleur score: {grid_search.best_score_:.2f}")
3. Visualisation des Frontières de Décision
from sklearn.decomposition import PCA
import numpy as np
# Réduction en 2D avec PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_train)
# Création d'une grille pour la visualisation
x_min, x_max = X_pca[:, 0].min() - 1, X_pca[:, 0].max() + 1
y_min, y_max = X_pca[:, 1].min() - 1, X_pca[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
# Entraînement sur les composantes principales
knn.fit(X_pca, y_train)
# Prédiction sur la grille
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Visualisation
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_train, s=20, edgecolor='k')
plt.title("Frontières de Décision (KNN)")
plt.xlabel("Première Composante Principale")
plt.ylabel("Deuxième Composante Principale")
plt.show()
🎯 Conclusion et Aller Plus Loin
Ce que nous avons appris
- Chargement et exploration de données
- Prétraitement des caractéristiques
- Implémentation de plusieurs classifieurs
- Évaluation rigoureuse des performances
- Optimisation des hyperparamètres
Pour aller plus loin
- Essayer d'autres algorithmes (XGBoost, MLP)
- Ajouter des caractéristiques supplémentaires
- Traiter un déséquilibre de classes
- Déployer le modèle avec Flask/FastAPI
Commentaires
Enregistrer un commentaire