Après avoir chargé le fichier CSV et créé notre variable cible (Client_Category), nous devons supprimer les colonnes inutiles pour éviter les fuites de données (Data Leakage) et encoder le Genre.
# 3. Supprimer la colonne cible ET l'ID (qui ne sert à rien pour prédire)
X = df.drop(['Spending Score (1-100)', 'CustomerID', 'Client_Category'], axis=1)
# 4. Transformer le Genre en 0 et 1
X = pd.get_dummies(X, columns=['Gender'], drop_first=True, dtype=int)
# OPTIONNEL : Vérifier le résultat
print(X.head())
print("Colonnes utilisées par l'IA :", X.columns.tolist())
Age Annual Income (k$) Gender_Male 0 19 15 1 1 21 15 1 2 20 16 0 3 23 16 0 4 31 17 0 Colonnes utilisées par l'IA : ['Age', 'Annual Income (k$)', 'Gender_Male']
Nous séparons les données (80% Train, 20% Test) et entraînons notre algorithme Random Forest avec 100 arbres.
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy :", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
Accuracy : 0.6500
precision recall f1-score support
0 0.67 0.57 0.62 7
1 0.68 0.79 0.73 19
2 0.58 0.50 0.54 14
accuracy 0.65 40
macro avg 0.64 0.62 0.63 40
weighted avg 0.64 0.65 0.64 40
Rendu simulé de `plt.bar(range(len(importances)), importances)`
Rendu simulé de `sns.heatmap(cm, cmap='Blues')`
| Prédit : Petit (0) | Prédit : Moyen (1) | Prédit : Gros (2) | |
|---|---|---|---|
| Vrai : Petit (0) | 4 | 2 | 1 |
| Vrai : Moyen (1) | 2 | 15 | 2 |
| Vrai : Gros (2) | 0 | 7 | 7 |
Le TP démontre avec succès la mise en place d'un pipeline complet de Machine Learning. Malgré la difficulté inhérente à la prédiction d'un comportement d'achat (Spending Score) uniquement basé sur l'âge et les revenus, le modèle Random Forest parvient à extraire les tendances globales de la base de données sans sur-apprendre, et nous indique clairement quelles variables sont utiles pour notre marketing.