import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import tensorflow as tf
# --- 1. Chargement et Préparation des Données ---
# Charger le dataset à partir du fichier CSV
try:
df = pd.read_csv('plantes.csv')
print("✅ Fichier 'plantes.csv' chargé avec succès.")
except FileNotFoundError:
print("❌ Erreur : Le fichier 'plantes.csv' est introuvable. Assurez-vous qu'il
est dans le même dossier que le script.")
exit()
# Séparer les caractéristiques (X) de la variable cible (y)
# La colonne 'Nom' est un identifiant et n'est pas utile pour l'entraînement
X = df.drop(['Nom', 'Toxique'], axis=1)
y = df['Toxique']
# Identifier les colonnes numériques et catégorielles pour le prétraitement
numerical_features = X.select_dtypes(include=['int64', 'float64']).columns
categorical_features = X.select_dtypes(include=['object']).columns
print(f"Colonnes numériques : {list(numerical_features)}")
print(f"Colonnes catégorielles : {list(categorical_features)}")
# Créer un 'preprocessor' qui applique les bonnes transformations aux bonnes
colonnes
# - StandardScaler : Met à l'échelle les données numériques (ex: Taille_cm)
# - OneHotEncoder : Transforme les catégories (ex: Couleur_Fleurs) en vecteurs
numériques
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numerical_features),
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])
# Diviser les données : 80% pour l'entraînement, 20% pour le test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=y)
# Appliquer le prétraitement aux données
X_train_processed = preprocessor.fit_transform(X_train).toarray()
X_test_processed = preprocessor.transform(X_test).toarray()
# Le nombre de colonnes après encodage définit la taille de la couche d'entrée
input_shape = X_train_processed.shape[1]
print(f"\nNombre de caractéristiques après prétraitement : {input_shape}")
# --- 2. Construction du Modèle de Réseau de Neurones ---
# Modèle séquentiel (couches empilées les unes après les autres)
model = tf.keras.models.Sequential([
# Couche d'entrée avec la forme déterminée par nos données
tf.keras.layers.Input(shape=(input_shape,)),
# 1ère couche cachée : 128 neurones, activation ReLU
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.3), # Dropout pour éviter le surapprentissage
# 2ème couche cachée : 64 neurones
tf.keras.layers.Dense(64, activation='relu'),
# 3ème couche cachée : 32 neurones
tf.keras.layers.Dense(32, activation='relu'),
# 4ème couche cachée : 16 neurones
tf.keras.layers.Dense(16, activation='relu'),
# 5ème couche cachée : 8 neurones
tf.keras.layers.Dense(8, activation='relu'),
# Couche de sortie : 1 neurone avec activation 'sigmoid'
# 'sigmoid' produit une probabilité (entre 0 et 1), parfait pour la
classification binaire
tf.keras.layers.Dense(1, activation='sigmoid')
])
# --- 3. Compilation du Modèle ---
model.compile(
optimizer='adam', # Un optimiseur efficace et populaire
loss='binary_crossentropy', # La fonction de perte standard pour la
classification binaire
metrics=['accuracy'] # Métrique pour suivre la performance
)
# Afficher un résumé de l'architecture du modèle
print("\n--- Architecture du Modèle ---")
model.summary()
print("----------------------------\n")
# --- 4. Entraînement du Modèle ---
print("🚀 Début de l'entraînement...")
history = model.fit(
X_train_processed,
y_train,
epochs=50, # Le modèle verra les données 50 fois
batch_size=8,
validation_split=0.2, # Garde 20% des données d'entraînement pour
valider à chaque époque
verbose=1 # Affiche la progression
)
print("🏁 Entraînement terminé !")
# --- 5. Évaluation du Modèle ---
print("\n--- Évaluation sur les données de test ---")
loss, accuracy = model.evaluate(X_test_processed, y_test, verbose=0)
print(f"📊 Perte (Loss) sur le jeu de test : {loss:.4f}")
print(f"🎯 Précision (Accuracy) sur le jeu de test : {accuracy*100:.2f}%")