Menu
CoddyTech

Выбор k

Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 7 из 58.

Какое значение k подходит для перцев чили? Попробуй несколько вариантов и дважды оцени каждую модель: на строках, которые она изучала, — точность на обучающей выборке, и на скрытых строках — точность на тестовой выборке.

Точность в зависимости от k для перцев чили, две линии. Точность на обучающей выборке начинается с 1.0 при k = 1 и снижается. Точность на тестовой выборке начинается с 0.8, достигает пика 0.92 при k = 13, а при k > 80 обе линии опускаются примерно до 0.7

При k = 1 каждый перец чили является своим ближайшим соседом, поэтому модель запоминает данные: идеальный результат на своих строках, хуже — на новых. Очень большое значение k размывает группы.

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

Пока что выбери k, при котором точность на тестовой выборке достигает максимума: в главе 7 будет показан более беспристрастный способ оценки.

challenge icon

Задание

Легко

Футбольный клуб записывает удары в shots.csv: расстояние, угол и goal или miss. При каком k прогнозы лучше всего? Стартовый код разделяет данные, перечисляет ks и задаёт подписи графика.

  1. Для каждого k обучи модель и сохрани точность на обучающей и тестовой выборках.
  2. Выведи лучшее k по точности на тестовой выборке, как показано ниже.
  3. Построй оба списка в зависимости от ks, добавив подписи train и test и легенду.

Для другого клуба:

Best k: 9 (test accuracy 0.783)

Удары другого клуба: точность в зависимости от k от 1 до 41. Точность на обучающей выборке снижается с 0.99 при k = 1 до примерно 0.71. Точность на тестовой выборке растёт с 0.68 до пика 0.78 при k = 9, а затем снижается до 0.7

Затем Coddy опишет твой график.

Попробуйте сами

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

# Одна строка на каждый удар: расстояние до ворот (м), угол по отношению к створу ворот (в градусах), гол или промах
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")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение с учителем

Потренируйтесь самостоятельно: Онлайн-компилятор Python