Ноутбук с примером оформления шага 0 и шага 1: check_lifelines.ipynb
Ноутбук с примером обработки выбросов и аномалий: outliers.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 датасета с помощью каждого подхода. И потом проверить их работоспособность на основании метрик качества.
С категориальными признаками проще, достаточно выбрать один наиболее подходящий подход и использовать его.
В данной лабораторной работе вам необходимо закодировать категориальные признаки и обработать пропуски в обучающей выборке, которую вы получили в ЛР №2. А потом результаты обработки перенести на тестовую выборку.
Выполните кодировку категориальных признаков на обучающем датасете (обучите кодировщик на обучаюшем датасете). Отберите категориальные столбцы и к ним примените кодирование. Обратите внимание на семантику категориальных признаков и их структуру:
Примените обученный кодировщик категориальных признаков к тестовым данным. Следите, чтобы не было утечки данных!
Выполните заполнение пропущенных значений в обучающем датасете двумя способами:
Примените полученные результаты к тестовым данным (обязательно обратите внимание, что значения для заполнения вычисляются на основании обучающей выборке, а потом переносятся на тестовую).
Существуют подходы по оценке качества машинных методов заполнения пропусков. Один из таких -- вычисление метрики NRMSE для каждого признака с целю проверки корректности заполнения.
Идея следующая: нам необходимо оценить с помощью специальной метрики качество заполнения пропусков моделью, однако истинных значений мы не знаем (действительно, в датасете уже есть пропуски, и истинных значений, что скрывается за пропусками, нам никогда уже не узнать). Однако нам никто не запрещает сделать чистый датасет (например, убрать строки с пропусками, просто их удалить), испортить его (добавить пропуски вручную), а потом уже посчитать метрику.
Задание: необходимо самостоятельно изучить, как вычисляется данная метрика и как с ее помощью оценивать качество заполнения пропусков. Также необходимо сгенерировать на исходном обучающем датасете маскированные данные, на этой маске обучить машинный алгоритм заполнения, чтобы потом проверить его качество. И потом посчитать метрику, чтобы понять, насколько заполнение корректно, можно ли его принимать.
Часто наличие аномалий и выбросов в данных может привести к непредсказуемым результатам обученя моделей: слишком непохожие на подавляющее большинство объектов значения меняют веса, в результате чего теряется обобщающая способность.
В данной лабораторной работе будем считать, что все найденные вами выбросы и аномалии действительно необходимо удалять
Ищите выбросы и аномалии на обучающих данных!
Генерация признаков -- очень мощный инструмент, который позволяет не только повышать качество моделей, но и исправлять проблемы в данных.
А проблем в этом датасете достаточно...
DataFrame.describe(), чтобы проанализировать средние значения и среднеквадратические отклонения столбцов.Часто для исправления проблемы мультиколлинеарности в данных применяют метод главных компонент (PCA). Это линейное преобразование, которое на основе матрицы перехода формирует новое признаковое пространство (часто с меньшей размерностью, чем исходное). При этом PCA очень любит линейные зависимости внутри входных признаков: благодаря этому свойству ему проще сохранить исходную дисперсию признаков в новом пространств.
Одним из преимуществ PCA является возможность анализировать процент сохраненной дисперсии в новом пространстве, потому при помощи метода локтя можно определить оптимальную размерность нового пространства.
В дополнительном задании необходимо для данных, которые у вас получились после ЛР №4 (без устранения), выполнить следующие действия:
PCA.fit_transform(X_train), а для тестовой -- PCA.transform(X_test), чтобы не допустить утечку данных).После того, как выполнены все мероприятия по обработке данных, можно начинать работу по обучению моделей ML и оценке их качества.
Анализируя полученные на предыдущих этапах данные, отберите пул моделей, которые будете использовать в дальнейшем (не больше пяти). Обязательно постройте точечные графики, показывающие зависимости входных признаков и целевого, а также тепловую карту корреляции для целевого признака и входных данных (на выходе должна получиться не матрица, а вектор). Обращайте внимание на алгоритмическую сложность алгоритмов, размер выборки и размерность признакового пространства. Обоснуйте свой выбор.
Выберите пул метрик, которые наиболее точно соответствуют требованиям задачи. Среди этих метрик выберите ту, на основе которой будут подбираться гиперпараметры (целевая метрика для optuna). Обоснуйте свой выбор.
Для каждой модели сформируйте сетки гиперпараметров, которые будете подбирать. Это лучше сделать заранее при помощи словарей.
Это был 3 раздел работы над DS-проектами (определение моделей и метрик)
Это был 4 раздел работы над DS-проектами (обучение моделей ML)
Это был 5 раздел работы над DS-проектами (получение предсказаний)
В домашнем задании вам необходимо объединить все лабораторные работы в единый и структурированный проект.
Для упрощения работы вам предлагается шаблон ipynb-ноутбука, в который необходимо добавить блоки кода, которые вы делали в рамках ЛР. Суть работы -- научиться оформлять и структурировать свой код, чтобы его можно было отправлять в прод и архивировать.
На выходе ожидается pdf-файл, состоящий из подписанного преподавателем титульного листа, а также самой работы (ipynb-файл можно перегнать в pdf или html - последний вариант даже предпочтительнее, потому что не ломается форматирование, его потом тоже можно перегнать в pdf).
Шаблон ДЗ: template.ipynb (обратите внимание, что в ячейках присутствуют поясняющие комментарии для помощи в оформлении ДЗ, нужно просто раскрыть ячейку, чтобы их увидеть)
Титульные листы:
- для групп ФИТ: титульник_по_пп_фит.docx
- для группы МО: титульник_по_пп_мо.docx
Работа корректно собрана, разбита на логические главы, к значимым блокам кода добавлены текстовые комментарии в формате markdown (ячейки с текстом). Если в работе будет просто код, если не будут прокомментированы все графики, работа не будет зачтена. Важно обосновывать свои действия и подкреплять их анализом и рассуждениями.
Отчет (титульник + работа в pdf) подписан и загружен в личный кабинет студента.
Все комментарии к результатам выполнены в markdown-ячейках (без применения кода, за исключением сводной таблицы с метриками, возможно, так будет удобнее).
Поскольку домашнее задание представляет из себя сборную всех лабораторных работ курса (ЛР №2 - ЛР №6), а вы могли делать не все лабораторки, допускается, что ДЗ будет неполным.
Например, если вы сделали только ЛР №2 и ЛР №3, то можете оформить только разделы, посвященные этим лабам. Но итоговая оценка за ДЗ будет пропорциональна стоимостям лабораторных работ.
Сводная таблица баллов представлена ниже.
| Включенная ЛР в ДЗ | Вклад лабы в ДЗ |
|---|---|
| ЛР №2 | 2 балла |
| ЛР №3 | 2 балла |
| ЛР №4 | 3 балла |
| ЛР №5 | 3 балла |
| ЛР №6 | 5 балла |
| Сумма | 15 баллов |
То есть если вы в ДЗ включили только ЛР №2 и ЛР №3, то вы получите 4 балла.
Если в ДЗ вы делаете лабы, то они тоже зачтутся в общий зачет