Обратите внимание! Дедлайн для сдачи лабораторных работ – 4 недели (с момента выдачи, то есть крайний срок сдачи – через занятие). Если вы сдаете работу (базовую часть) позднее без уважительной причины, то баллы уменьшаются в 2 раза. На дополнительные задания это не распространяется.
Приоритет для сдачи у тех, кто сдает актуальную лабораторную.
Ноутбук с примером оформления шага 0 и шага 1: check_lifelines.ipynb
Основная цель проектов, связанных с ML – разработать качественную и надежную модель, которую можно использовать на новых данных.
Для того, чтобы убедиться, что модель адекватная, необходимо, чтобы:
На последних двух пунктах остановимся поподробнее.
Цель лабораторной работы – создать шаблон обучения модели, а также проверки ее предсказаний при помощи визуализации графика остатков
Для будущих лабораторных работ нам нужно будет строить модели, и было бы хорошо, чтобы такой шаблон появился как можно раньше
Представим, что у нас уже имеется предобработанный датасет. Мы решали задачу регрессии: предсказывали стоимость дома по его характеристикам (то есть объектом в датасете являются параметры дома, а целевым значением – его стоимость).
from sklearn.datasets import fetch_california_housing
Количество строк, которое возвращается, указывать не нужно, лучше возвращать датасет в виде объекта pd.DataFrame:
fetch_california_housing(as_frame=True)
Данная функция возвращает словарь, в котором под ключом 'data' хранится матрица объект-признак, а под 'target' – список целевых значений.
Разделите данные на обучающую и тестирующую выборки. Обоснуйте объем тестирующей выборки.
Выберите модель ML, которой можно решить данную задачу. Определите набор метрик, которые позволят объективно оценить качество модели. Обоснуйте свой выбор (модели и метрик).
При помощи библиотеки optuna сгенерируйте функционал по подбору гиперпараметров выбранной модели. Сформируйте сетку гиперпараметров, а также запустите обучение.
Получите предсказание на обученной модели.
Постройте графики остатков (Predicted vs Actual Plot и Residuals vs Predicted Plot) для предсказанных данных и истинных значений. Попробуйте проинтерпретировать полученные результаты.
Как не трудно заметить, функцию objective в optuna приходится менять каждый раз, как мы выбираем новую модель или новые данные. Например, для решения задачи мы хотим построить 3 разные модели, чтобы выбрать среди них лучшую. Но получается так, что надо трижды определять функциюobjective, поскольку в ней зашита сетка гиперпараметров.
Или мы хотелим сравнить качество одной модели, обученной на двух датасетах: с применением скалирования и без.
И было бы здорово, если бы у нас был функционал по генерации функций objective. Достаточно в него передать класс модели, сетку и обучающие данные, и вернется нужная функция, которую можно использовать для оптимизации.
Задача: разработать функционал по генерации функции
objectiveв зависимости от параметров обучения
Допустим, я выбрал модель CatBoostRegressor с сеткой catboost_grid, которую хочу обучить на данных X_train_std и y_train, эти параметры я передаю в функцию gen_objective:
def gen_objective(estimator_class, grid, X_train, y_train, **kwargs):
...
def objective(trial):
...
return objective
которая возвращает функцию, что используется при подборе гиперпараметров.
В Data Science очень важен навык систематизации знаний о задаче: правильно ее описать и найти все входные параметры -- это уже половина пути! И тогда выполнить начальную обработку данных будет очень просто.
Цель лабораторной работы – выполнить описание задачи и признаков, систематизировать знания о проекте, а также провести начальный этап предварительной обработки данных
Начиная с этой лабораторной работы, все дальнейшие ЛР будут связаны общей тематикой. Данная работа необходима для понимания исходной задачи. Без нее последующие лабораторные приниматься не будут
Необходимо ознакомиться с информацией о задаче, решению которой будут посвящены лабораторные работы. Сделать это можно, прочитав файл Задание.pdf здесь.
На основании информации из файла выполнить нулевой шаг: описание задачи и признаков. Для этого нужно:
Загрузить предложенный набор данных (данные можно взять отсюда) и выполнить начальный этап обработки данных:
Разделить данные на train и test выборки, определить объем выборок в соответствие с объемом исходного датасета
Из-за пропущенных значений и категориальных признаков невозможно обучать большинство моделей ML, поэтому с ними необходимо работать.
Существует большое количество методов для заполнения пропусков, однако наиболее распространенными являются статистические и машинные подходы.
В задаче бывает тяжело определить, какой метод себя покажет лучше, поэтому разумно на этапе заполнения пропусков сгенерировать 2 датасета с помощью каждого подхода. И потом проверить их работоспособность на основании метрик качества.
С категориальными признаками проще, достаточно выбрать один наиболее подходящий подход и использовать его.
В данной лабораторной работе вам необходимо закодировать категориальные признаки и обработать пропуски в обучающей выборке, которую вы получили в ЛР №1. А потом результаты обработки перенести на тестовую выборку.
Выполните кодировку категориальных признаков на обучающем датасете (обучите кодировщик на обучаюшем датасете). Отберите категориальные столбцы и к ним примените кодирование. Обратите внимание на семантику категориальных признаков и их структуру:
Примените обученный кодировщик категориальных признаков к тестовым данным. Следите, чтобы не было утечки данных!
Выполните заполнение пропущенных значений в обучающем датасете двумя способами:
Примените полученные результаты к тестовым данным (обязательно обратите внимание, что значения для заполнения вычисляются на основании обучающей выборке, а потом переносятся на тестовую).
Существуют подходы по оценке качества машинных методов заполнения пропусков. Один из таких -- вычисление метрики NRMSE для каждого признака с целю проверки корректности заполнения.
Идея следующая: нам необходимо оценить с помощью специальной метрики качество заполнения пропусков моделью, однако истинных значений мы не знаем (действительно, в датасете уже есть пропуски, и истинных значений, что скрывается за пропусками, нам никогда уже не узнать). Однако нам никто не запрещает сделать чистый датасет (например, убрать строки с пропусками, просто их удалить), испортить его (добавить пропуски вручную), а потом уже посчитать метрику.
Задание: необходимо самостоятельно изучить, как вычисляется данная метрика и как с ее помощью оценивать качество заполнения пропусков. Также необходимо сгенерировать на исходном обучающем датасете маскированные данные, на этой маске обучить машинный алгоритм заполнения, чтобы потом проверить его качество. И потом посчитать метрику, чтобы понять, насколько заполнение корректно, можно ли его принимать.