Menu
CoddyTech

Choisir k

Fait partie de la section Apprentissage supervisé du Journey Machine Learning de Coddy. Leçon 7 sur 58.

Quelle valeur de k convient aux piments ? Essayez-en plusieurs et évaluez chaque modèle deux fois : sur les lignes qu’il a étudiées, la précision sur l’ensemble d’entraînement, et sur celles qui sont cachées, la précision sur l’ensemble de test.

Précision en fonction de k pour les piments, deux courbes. La précision sur l’ensemble d’entraînement commence à 1.0 pour k = 1 et diminue. La précision sur l’ensemble de test commence à 0.8, atteint un pic de 0.92 pour k = 13, et les deux courbes chutent à environ 0.7 au-delà de k = 80

Pour k = 1, chaque piment est son propre plus proche voisin, le modèle mémorise donc : il est parfait sur ses lignes, mais moins performant sur de nouvelles données. Un k très grand brouille les groupes.

ks = range(1, 120, 6)
train_acc = []
test_acc = []
for k in ks:
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(X_train, y_train)
    train_acc.append(model.score(X_train, y_train))
    test_acc.append(model.score(X_test, y_test))

Choisissez le k où la précision sur l’ensemble de test atteint son maximum, pour l’instant : le chapitre 7 présente un évaluateur plus équitable.

challenge icon

Défi

Facile

Un club de football consigne les tirs dans shots.csv : la distance, l’angle et goal ou miss. Quelle valeur de k prédit le mieux ? Le code de départ sépare les données, liste les ks et intitule le graphique.

  1. Pour chaque valeur de k, ajuste un modèle et conserve sa précision sur les données d’entraînement et de test.
  2. Affiche la meilleure valeur de k selon la précision sur les données de test, comme ci-dessous.
  3. Trace les deux listes en fonction de ks, avec les étiquettes train et test, et une légende.

Pour un autre club :

Best k: 9 (test accuracy 0.783)

Précision des tirs d’un autre club en fonction de k, de 1 à 41. La précision sur les données d’entraînement passe de 0.99 pour k = 1 à environ 0.71. La précision sur les données de test passe de 0.68 à un pic de 0.78 pour k = 9, puis redescend à 0.7

Coddy décrit ensuite ton graphique.

Essayez vous-même

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# Une ligne par tir : distance au but (m), angle par rapport à l'ouverture du but (degrés), but ou tir manqué
shots = pd.read_csv("shots.csv")
X = shots[["distance_m", "angle_deg"]]
y = shots["result"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
ks = range(1, 42, 4)  # k = 1, 5, 9, ..., 41

fig, ax = plt.subplots()
ax.set_title("Shots: Accuracy by k")
ax.set_xlabel("k (neighbors)")
ax.set_ylabel("Accuracy")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne