Menu
CoddyTech

Недообучение и переобучение

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

Ты столкнулся с самой большой ловушкой машинного обучения: k = 1 и глубокие деревья всё запомнили. В этой главе мы дадим ей название и закончим графиками вроде этого:

Точность дерева на обучающей и проверочной выборках в зависимости от глубины: точность на обучающей выборке растёт примерно до 1.0, а точность на проверочной достигает пика при глубине 3 и падает. Пунктирная линия отмечает выбранную глубину, красная звезда — единственный результат на тестовой выборке, 0.82

Ловушка: 15 растений базилика, которые поливали по-разному, и три кривые, подобранные по их урожаю:

Урожай листьев у 15 обучающих растений показан серыми точками, а у 5 тестовых растений — черными квадратами, в зависимости от ежедневного количества воды. Прямая синяя линия не повторяет выпуклость, зеленая кривая третьей степени следует ей, а красная кривая двенадцатой степени сильно колеблется между точками

Степень 1 — слишком простая модель: недообучение. Степень 12 проходит через каждую обучающую точку, изгибаясь между ними: переобучение — модель запоминает, а не обучается.

np.polyval(coefs, x) возвращает высоты кривой. RMSE на обучающей и тестовой выборках, в граммах:

for degree in [1, 3, 12]:
    coefs = np.polyfit(water_train, grams_train, degree)
    train_err = np.sqrt(mean_squared_error(grams_train, np.polyval(coefs, water_train)))
    test_err = np.sqrt(mean_squared_error(grams_test, np.polyval(coefs, water_test)))
    print(degree, round(train_err), round(test_err))

Он выводит:

1 156 138
3 15 19
12 9 173

Признак переобучения: малая ошибка на обучающей выборке, большая ошибка на тестовой выборке.

challenge icon

Задание

Средне

Для ветропарка моделируется мощность одной турбины в зависимости от скорости ветра. Стартовый код разделяет 24 измерения и считывает max_degree.

  1. Для каждой степени от 1 до max_degree подгони кривую по обучающим данным; выведи RMSE на обучающей и тестовой выборках в целых кВт.
  2. Выведи первую степень, для которой ошибка на тестовой выборке более чем вдвое превышает ошибку на обучающей выборке, или No overfitting up to degree и max_degree.

Для другой турбины и 7:

Degree 1: train 117 kW, test 172 kW
Degree 2: train 115 kW, test 182 kW
Degree 3: train 64 kW, test 85 kW
Degree 4: train 63 kW, test 79 kW
Degree 5: train 47 kW, test 67 kW
Degree 6: train 47 kW, test 65 kW
Degree 7: train 23 kW, test 85 kW
Overfitting starts at degree 7

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

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

max_degree = int(input())

# Не изменяйте строки ниже: скорость ветра (m/s) и мощность (kW) одной ветряной турбины
speed = np.array([3.8, 4.3, 5.1, 5.6, 5.6, 6.7, 6.8, 7.2, 7.8, 8.5, 8.9, 9.1,
                  10.2, 10.9, 11.4, 11.9, 12.2, 12.4, 12.6, 13.2, 13.9, 14.4, 15.5, 16.5])
power = np.array([0, 85, 179, 22, 17, 126, 255, 273, 419, 545, 612, 665,
                  913, 1120, 1114, 1227, 1299, 1400, 1293, 1329, 1396, 1493, 1461, 1552])
speed_train, speed_test, power_train, power_test = train_test_split(
    speed, power, test_size=0.25, random_state=0)

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

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

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

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