Обучающие и тестовые данные | Вводный курс ML

Обучающие и тестовые данные

Все курсы > Вводный курс > Занятие 13

Работая с линейной регрессией в Scikit-learn, мы обучили нашу модель предсказывать обхват шеи по росту человека. Посмотрим на этот процесс еще раз.

Вначале, мы брали данные наших наблюдений (рост людей X и обхват шеи y) и строили модель (подбирали веса w). Затем, зная рост и веса модели, делали прогноз (ŷ). Качество модели мы оценивали по отклонению прогноза (ŷi) от реальных значений (yi).

В этом подходе все хорошо, кроме одного. Для обучения и проверки качества модели мы использовали одни и те же данные. Приведу хрестоматийную аналогию, чтобы объяснить почему так делать не стоит.

Пример студентов во время сессии

обучение модели: пример студента на экзамене

Как известно, от сессии до сессии живут студенты весело. Однако в какой-то момент сессия все-таки наступает, и перед учащимися встает вопрос подготовки к экзаменам. У них по большому счету есть два варианта:

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

Так вот при обучении модели у нас есть точно такой же выбор.

Обучающая и тестовая выборки

Если мы будем оценивать качество модели (например, с помощью корня из средней суммы расстояний, RMSE) на тех же данных, на которых обучали модель, то будем по большому счету заучивать билеты. Когда же нам встретятся новые данные, наш прогноз уже не будет таким замечательным.

Логичнее разделить данные на обучающую (training data) и тестовую (test data) выборки с тем, чтобы модель «знала предмет в целом» и не «проваливала экзамен из-за неожиданных вопросов преподавателя», т.е. не показывала низкого RMSE при встрече с новыми данными (новыми X и y).

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

Проблема переобучения

С точки зрения данных проблему «заучивания билетов» еще называют переобучением модели (model overfitting). Когда мы учим и проверяем модель на одних и тех же данных, то по сути просим модель запомнить каждую единицу наших данных.

Также существует проблема недообучения (underfitting).

Если бы мы строили не линейную модель, а, например, полиномиальную (она выражена кривой), то нормально обученная модель отличалась бы от недообученной и переобученной следующим образом.

недообученная модель, нормально обученная модель, переобученная модель

Разделение на обучающую и тестовую выборки в Scikit-learn

Вначале откроем ноутбук к этому занятию

Вновь возьмем данные роста и обхвата шея. Только теперь не просто разделим данные на рост (X) и обхват шеи (y), но и каждый компонент в свою очередь разделим на две части, обучающую и тестовую.

обучение модели: разделение данных на обучающую и тестовую выборки

Обучать мы будем на X_train и y_train, а делать прогноз и проверять качество модели на X_test и y_test. Вначале возьмем и подготовим наши данные.

Теперь произведем разделение с помощью функции train_test_split из библиотеки Scikit-learn.

Выведем результат.

Далее мы снова построим нашу модель, но уже с учетом вышеописанного разделения на train и test (для простоты часто говорят именно так).

Выведем коэффициенты (веса):

Сделаем прогноз, но уже на тестовой выборке.

Посмотрим на результат, т.е. рассчитаем RMSE, снова по тестовой выборке.

Результат несколько хуже, чем в прошлый раз (0,56 против 0,47), зато мы можем быть уверены, что модель готова к работе на всех данных, а не только на обучающих. Студент готов к самым неожиданным вопросам экзаменатора.

К сожалению, даже такое разделение имеет свои недостатки. Если тестовая выборка сильно отличается от обучающей, то оценка качества модели все равно будет некорректной. О том как преодолеть этот и некоторые другие недостатки мы поговорим в другой раз.

Вопросы и упражнения для закрепления

На какие четыре компонента разбивает данные функция train_test_split?

Ответ: данные независимых переменных (признаков) и данные зависимой (целевой) переменной разбиваются каждые на обучающую и тестовую выборки. Получается четыре набора данных.

На каких данных мы строим прогноз и проверяем качество модели?

Ответ: на тестовой выборке. Это позволяет избежать переобучения.

Дополнительные упражнения⧉ вы найдете в конце ноутбука.

Большое повторение

Итак, мы прошли два подготовительных раздела. Что мы узнали?

  1. В первую очередь, мы узнали, что такое модель машинного обучения, и чем она отличается от жестко прописанной компьютерной программы.
  2. Научились работать в программе Google Colab и освоили основы программирования на Питоне.
  3. Кроме того, мы изучили наборы данных, списки и словари.
  4. Добавив условия и циклы, мы начали писать первые программы.
  5. Все это заложило основу для анализа данных на Питоне.
  6. Во втором разделе, имея достаточно технических навыков, мы начали изучать данные с точки зрения их содержания. В частности, занимались описательной статистикой и статистическим выводом.
  7. Узнав о взаимосвязи переменных, мы начали строить первые модели.
  8. Затем мы изучили как компьютер подбирает веса и как можно представить данные в форме вектора или матрицы для удобства вычислений.
  9. Наконец, мы посмотрели, почему не стоит обучать и тестировать модели на одних и тех же данных.

Поздравляю!

Вы готовы к настоящей практической работе по построению моделей. В следующем, третьем, разделе мы изучим классические модели машинного обучения: регрессию, классификацию и кластеризацию. В последнем, четвертом, разделе, мы начнем решать существенно более сложные прикладные задачи.

Желаю успехов в дальнейшем обучении!