Menu
CoddyTech

Повторение: ремонт скейтбордов

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

challenge icon

Задание

Средне

Стойке проката в скейт-парке нужна модель, которая определяет, какие возвращённые доски нуждаются в ремонте. Программа считывает наибольшее значение k для проверки.

  1. Отдели 25% строк для тестирования (random_state=0).
  2. Для каждого k из ks выполни перекрёстную проверку k-NN на обучающих строках (cv=5). Отобрази средние значения в виде столбцов и выведи лучшее значение k.
  3. Выполни поиск по сетке для дерева по параметру max_depth среди значений depths (cv=5, random_state=0) и выведи лучший результат.
  4. Побеждает модель с более высоким средним значением: выведи Winner: k-NN или Winner: tree вместе с её точностью на тестовой выборке.

Для другого парка и значения 13:

Best k: 13 (mean 0.785)
Best depth: 5 (mean 0.763)
Winner: k-NN, test accuracy 0.822

Затем Coddy описывает твою диаграмму. Она выглядит так:

Столбцы с заголовком Skateboard Repairs: Accuracy by k, по одному для каждого k от 1 до 13, ось от 0.6 до 0.9. Для небольших значений k они колеблются около 0.72, затем поднимаются до 0.785 при k = 13

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

# Наибольшее значение k для проверки, например 15
max_k = int(input())

# Одна строка на каждый возвращённый скейтборд: число прокатов после последнего обслуживания, оценки износа от 0 до 10
# и трещины в деке; 1 в repair означает, что скейтборд отправили в мастерскую
boards = pd.read_csv("skateboards.csv")
features = ["rentals", "wheel_wear", "bearing_noise", "grip_wear", "truck_wobble", "deck_cracks"]
X = boards[features]
y = boards["repair"]
# Каждый признак — небольшое количество или оценка, поэтому k-NN здесь не требует масштабирования
ks = list(range(1, max_k + 1, 2))
depths = [2, 3, 4, 5, 6, 7, 8]

fig, ax = plt.subplots()
ax.set_title("Skateboard Repairs: Accuracy by k")
ax.set_xlabel("k (neighbors)")
ax.set_ylabel("Mean CV accuracy")
ax.set_xticks(ks)
ax.set_ylim(0.6, 0.9)  # начинается с 0.6, чтобы были видны небольшие различия

# Напишите свой код ниже

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

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