Menu
CoddyTech

Кривые обучения

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

Сделает ли большее количество данных вашу модель лучше? Это показывает кривая обучения: точность на тестовой выборке по мере увеличения обучающей выборки. Здесь показано дерево большой глубины на данных «две луны»:

Точность в зависимости от количества обучающих строк от 25 до 800. Линия для обучающей выборки всё время находится на уровне 1.0; линия для тестовой выборки растёт с 0.80 до 0.94

Дерево запоминает каждую обучающую выборку, но каждая дополнительная строка учит его чему-то реальному. Гибкие модели больше всего выигрывают от данных.

Обучайте модель на первых n строках обучающей выборки, а затем каждый раз оценивайте её на одних и тех же строках тестовой выборки:

sizes = [25, 50, 100, 200, 400, 800]
test_scores = []
for n in sizes:
    tree = DecisionTreeClassifier(random_state=0)
    tree.fit(X_train[:n], y_train[:n])
    test_scores.append(tree.score(X_test, y_test))
ax.plot(sizes, test_scores, marker="o")

Всё ещё растёт у правого края? Поможет больше данных.

challenge icon

Задание

Средне

Помогут ли дополнительные записи отличить два вида сов? В заготовке разделены 600 криков, подготовлены обе модели и график.

  1. Для каждого n из sizes обучи обе модели на первых n строках обучающей выборки; сохрани точность на тестовой выборке.
  2. Выведи прирост для каждой модели — последняя оценка минус первая, с точностью до 3 знаков после запятой.
  3. Построй графики обеих моделей относительно sizes, используя marker="o", подписи logistic и tree и легенду.

Совы из другого леса выдают:

Logistic gains 0.053 from more data
Tree gains 0.160 from more data

и строят этот график. Затем Coddy описывает твой результат.

Крики сов: кривые обучения. Линия логистической регрессии поднимается с 0.64 примерно до 0.69 и остаётся ровной; линия дерева неуклонно растёт с 0.67 до 0.83

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

# Не меняйте строки ниже: 600 криков сов, высота звука (Hz) и длительность (s)
rng = np.random.default_rng(23)
pitch = np.round(rng.uniform(300, 900, 600))
length = np.round(rng.uniform(0.2, 2.0, 600), 2)
# Вид 1 — серая неясыть: её крики длиннее для данной высоты звука; в нескольких полевых записях есть ошибки
longer = length > 0.5 + 6.4 * ((pitch - 600) / 600) ** 2
wrong_note = rng.random(600) < 0.05
species = np.where(longer != wrong_note, 1, 0)
X = np.column_stack([pitch, length])
X_train, X_test, y_train, y_test = train_test_split(X, species, test_size=0.25, random_state=0)

sizes = [25, 50, 100, 200, 400]
logistic = LogisticRegression(max_iter=1000)
tree = DecisionTreeClassifier(random_state=0)

fig, ax = plt.subplots()
ax.set_title("Owl Calls: Learning Curves")
ax.set_xlabel("Training rows")
ax.set_ylabel("Test accuracy")

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

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

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

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