Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Train/test split stratifie
C'est LA regle d'or du machine learning : ne jamais evaluer un modele sur les donnees qui ont servi a l'entrainer. Sinon, c'est comme reviser un examen avec les reponses sous les yeux. Tu dois separer tes donnees en deux parties : Le jeu d'entrainement (train set) : le modèle apprend dessus Le jeu de test (test set) : tu evalues les performances du modèle dessus
Si tu evalues sur les memes données que l'entrainement, le modèle peut juste memoriser les réponses. C'est comme reviser un examen avec les questions exactes du sujet : ca ne prouve pas que tu as compris.
sklearn fournit train_test_split pour ca. Le paramètre test_size controle la proportion du test set (0.2 = 20%). random_state fixe le hasard pour des résultats reproductibles.
Pour la classification, on utilise stratify=y pour que la repartition des classes soit la meme dans le train et le test.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
Écris une fonction split_donnees(X, y, test_size=0.2, random_state=42) qui separe X et y en train et test avec stratification, et renvoie un dictionnaire avec : 'X_train', 'X_test', 'y_train', 'y_test' : les quatre parties 'taille_train' : nombre d'echantillons dans le train 'taille_test' : nombre d'echantillons dans le test
Tests (4/4)
Proportions correctes
import numpy as np
X = np.array([[i] for i in range(100)])
y = np.array([0]*70 + [1]*30)
result = split_donnees(X, y, test_size=0.2)
assert result['taille_train'] == 80
assert result['taille_test'] == 20
Stratification respectee
import numpy as np
X = np.array([[i] for i in range(100)])
y = np.array([0]*70 + [1]*30)
result = split_donnees(X, y, test_size=0.2)
y_test = result['y_test']
prop_1 = sum(y_test == 1) / len(y_test)
assert abs(prop_1 - 0.3) < 0.15
Reproductibilite
import numpy as np
X = np.array([[i] for i in range(50)])
y = np.array([0]*25 + [1]*25)
r1 = split_donnees(X, y)
r2 = split_donnees(X, y)
assert np.array_equal(r1['X_train'], r2['X_train'])
Test size different
import numpy as np
X = np.array([[i] for i in range(100)])
y = np.array([0]*50 + [1]*50)
result = split_donnees(X, y, test_size=0.3)
assert result['taille_test'] == 30
Indices (3 disponibles)
Solution officielle
import numpy as np
from sklearn.model_selection import train_test_split
def split_donnees(X, y, test_size=0.2, random_state=42):
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=test_size, stratify=y, random_state=random_state
)
return {
'X_train': X_train, 'X_test': X_test,
'y_train': y_train, 'y_test': y_test,
'taille_train': len(X_train),
'taille_test': len(X_test),
}