Menu
CoddyTech

Escolhendo k

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 7 de 58.

Qual valor de k é mais adequado para as pimentas? Experimente vários valores e avalie cada modelo duas vezes: nas linhas com as quais ele foi treinado, a acurácia de treino, e nas linhas ocultas, a acurácia de teste.

Acurácia por valor de k para as pimentas, duas linhas. A acurácia de treino começa em 1.0 para k = 1 e cai. A acurácia de teste começa em 0.8, atinge o pico de 0.92 para k = 13, e ambas as linhas caem para cerca de 0.7 quando k passa de 80

Em k = 1, cada pimenta é sua própria vizinha mais próxima, então o modelo memoriza: desempenho perfeito nos seus dados, pior nos novos. Um k enorme embaralha os grupos.

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))

Escolha o k em que a acurácia de teste atinge o pico, por enquanto: o capítulo 7 apresenta um avaliador mais justo.

challenge icon

Desafio

Fácil

Um clube de futebol registra chutes em shots.csv: distância, ângulo e goal ou miss. Qual valor de k faz a melhor previsão? O código inicial divide os dados, lista os ks e rotula o gráfico.

  1. Para cada k, ajuste um modelo e mantenha as acurácias de treino e de teste.
  2. Imprima o melhor k pela acurácia de teste, como abaixo.
  3. Desenhe as duas listas em relação a ks, rotuladas como train e test, com uma legenda.

Para outro clube:

Best k: 9 (test accuracy 0.783)

Chutes de outro clube: acurácia por k de 1 a 41. A acurácia de treino cai de 0.99 em k = 1 para cerca de 0.71. A acurácia de teste sobe de 0.68 até um pico de 0.78 em k = 9 e, depois, cai para 0.7

Em seguida, Coddy descreve seu gráfico.

Experimente você mesmo

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

# Uma linha por chute: distância até o gol (m), ângulo em relação à abertura do gol (graus), gol ou erro
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")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online