Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
KNN : trouver le k optimal
KNN est l'algorithme le plus intuitif qui existe : pour classer un nouveau point, tu regardes ses k voisins les plus proches et tu votes. Si tu veux savoir si un email est un spam, tu regardes les 5 emails les plus similaires dans ton historique. Mais le choix de k est crucial, et c'est l'occasion d'apprendre a tuner un hyperparametre.
Le choix de k est crucial : k trop petit (1-3) : le modèle est sensible au bruit, overfitting k trop grand (50+) : le modèle est trop lisse, underfitting
Pour trouver le meilleur k, on teste plusieurs valeurs et on garde celle qui donne la meilleure accuracy en cross-validation.
Attention : KNN est sensible a l'echelle des features. Il faut TOUJOURS normaliser avant d'utiliser KNN.
Écris une fonction trouver_meilleur_k(X, y, k_range=range(1, 21), cv=5) qui teste chaque valeur de k en cross-validation et renvoie : 'meilleur_k' : la valeur de k avec le meilleur score moyen 'meilleur_score' : le score moyen du meilleur k 'tous_scores' : dictionnaire k -> score moyen
Tests (4/4)
Meilleur k dans la range
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=5, random_state=42)
result = trouver_meilleur_k(X, y, k_range=range(1, 11))
assert 1 <= result['meilleur_k'] <= 10
Score entre 0 et 1
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=5, random_state=42)
result = trouver_meilleur_k(X, y, k_range=range(1, 6))
assert 0 <= result['meilleur_score'] <= 1
Tous les k testes
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=5, random_state=42)
result = trouver_meilleur_k(X, y, k_range=range(3, 8))
assert set(result['tous_scores'].keys()) == {3, 4, 5, 6, 7}
Meilleur score correspond au meilleur k
import numpy as np
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=5, random_state=42)
result = trouver_meilleur_k(X, y, k_range=range(1, 11))
assert result['meilleur_score'] == result['tous_scores'][result['meilleur_k']]
Indices (3 disponibles)
Solution officielle
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
def trouver_meilleur_k(X, y, k_range=range(1, 21), cv=5):
tous_scores = {}
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=cv, scoring='accuracy')
tous_scores[k] = float(scores.mean())
meilleur_k = max(tous_scores, key=tous_scores.get)
return {
'meilleur_k': meilleur_k,
'meilleur_score': tous_scores[meilleur_k],
'tous_scores': tous_scores,
}