Comment savoir si un choix de est bon
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · Les voisins, pour de vrai
Énoncé
Comment savoir si un choix de est bon ? Écrire une évaluation « laisse-un-de-côté » : chaque exemple est prédit par tous les autres, et l'on compte les bonnes réponses. Faire varier .
Corrigé
def evaluer(exemples, k):
"""Laisse-un-de-cote : chaque exemple est predit par TOUS LES AUTRES."""
justes = 0
for i in range(len(exemples)):
autres = exemples[:i] + exemples[i + 1:]
if knn(autres, exemples[i][0], k) == exemples[i][1]:
justes += 1
return justes / len(exemples)
JEU2 = [((1, 1), "A"), ((1, 2), "A"), ((2, 1), "A"), ((2, 2), "A"),
((7, 7), "B"), ((7, 8), "B"), ((8, 7), "B"), ((8, 8), "B")]
assert [evaluer(JEU2, k) for k in [1, 3, 5, 7]] == [1.0, 1.0, 1.0, 0.0]
Le zéro absolu de la dernière colonne mérite qu'on s'y arrête. Avec huit exemples, quatre par classe, et : chaque exemple est prédit par les sept autres, dont trois de sa classe et quatre de l'autre. La majorité désigne donc systématiquement la classe opposée — le taux de bonnes réponses tombe à , pas à . L'algorithme ne devient pas « aléatoire » : il devient systématiquement faux.
Pourquoi l'exemple doit être retiré du jeu. Si on le laissait, il serait son propre plus proche voisin, à distance nulle, et l'évaluation serait beaucoup trop optimiste — parfaite à , toujours. « Laisse-un-de-côté » n'est pas une élégance : c'est ce qui rend la mesure honnête. On n'évalue jamais un prédicteur sur les données qui ont servi à le construire.
Un jeu moins net.
melange = JEU2 + [((4, 4), "A"), ((4.5, 4.5), "B")]
assert evaluer(melange, 1) < 1.0
Deux points ajoutés au milieu, de classes opposées : chacun a l'autre pour plus proche voisin, et les deux sont mal prédits. C'est la situation réelle — les données ne sont jamais parfaitement séparées — et c'est là que le choix de commence à compter.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.