Кривые обучения
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 33 из 58.
Сделает ли большее количество данных вашу модель лучше? Это показывает кривая обучения: точность на тестовой выборке по мере увеличения обучающей выборки. Здесь показано дерево большой глубины на данных «две луны»:
Дерево запоминает каждую обучающую выборку, но каждая дополнительная строка учит его чему-то реальному. Гибкие модели больше всего выигрывают от данных.
Обучайте модель на первых 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")Всё ещё растёт у правого края? Поможет больше данных.
Задание
СреднеПомогут ли дополнительные записи отличить два вида сов? В заготовке разделены 600 криков, подготовлены обе модели и график.
- Для каждого
nизsizesобучи обе модели на первыхnстроках обучающей выборки; сохрани точность на тестовой выборке. - Выведи прирост для каждой модели — последняя оценка минус первая, с точностью до 3 знаков после запятой.
- Построй графики обеих моделей относительно
sizes, используяmarker="o", подписиlogisticиtreeи легенду.
Совы из другого леса выдают:
Logistic gains 0.053 from more data
Tree gains 0.160 from more dataи строят этот график. Затем Coddy описывает твой результат.
Попробуйте сами
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")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр7Переобучение
Недообучение и переобучениеКривые обученияРегуляризацияПроверочные выборкиПовторение: настройка дерева2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python