# Исследование и настройка предсказательной модели

## Блокноты Jupyter

* `research` &mdash; Создание множества разных моделей, с использованием разных создаваемых признаков и оптимизацией гиперпараметров.

  Использует файл аугментированных данных датасета о подержанных автомобилях, создаваемый блокнотом `eda/cars_eda.py`. См. `eda/README.md`.

  Если параметр блокнота `mlflow_do_log` установлен в `True`, блокнот логирует в MLFlow создаваемые модели в отдельные вложенные (nested) прогоны под одним (новым) общим прогоном с именем, определяемым параметром `mlflow_experiment_name`.

  Точность предсказания текущей цены автомобиля оценивается в первую очередь по показателю MAPE (из-за наличия в выборке значений цены разных порядков), во вторую очередь учитывается MSE (ради отслеживания систематических ошибок на подвыборках). Исследованные модели:

  1. baseline (MAPE = 0.35, MSE = 1.18);
  2. с использованием добавленных признаков (feature engineering с помощью scikit-learn) &mdash; точность неоднозначна по сравнению с baseline (MAPE = 0.31, MSE = 1.50);
  3. с использованием добавленных и выбранных (SFS) признаков &mdash; точность существенно лучше baseline (MAPE = 0.20, MSE = 1.02);
  4. с использованием добавленных и выбранных признаков и оптимизированными гиперпараметрами (optuna) &mdash; точность немного лучше модели 3 по MAPE (MAPE = 0.20, MSE = 0.94).

  Модель 4 выбрана как финальная модель для последующего развёртывания. Она использует следующие признаки (такие же, как и модель 3):
  * `extend_features_as_polynomial__selling_price` (исходная цена продажи, нормализована `StandardScaler`),
  * `extend_features_as_polynomial__selling_price^2`,
  * `extend_features_as_spline__age_sp_1` (значение базисной функции 2/5 однородного сплайна, нормализованного к крайним значениям возраста автомобилей),
  * `extend_features_as_spline__age_sp_2` (то же, но базисная функция 3/5),
  * `scale_to_standard__age` (исходный возраст автомобиля, нормализован `StandardScaler`).

  По указанию преподавателя, скриншоты пользовательского интерфейса MLFlow сохранены в директории `./mlflow_ui_figures`.

  По указанию преподавателя, ID финального прогона: `4c7f04ad9ee94237b44f60b6eb14b41e` (вложен в прогон `4e4a9094cb3c4eed9d4a056a27cadcd9`).

## Установка

Для исследования и настройки предсказательной модели необходимы общие зависимости, см. [Общие зависимости](../README.md#общие-зависимости) в `README.md`.

Для исследования и настройки предсказательной модели используется среда [Jupyter](https://jupyter.org/). См. об установке и использовании Jupyter в проекте в `docs/jupyter.md`.

### Зависимости

Дополнительные зависимости, необходимые для исследования и настройки предсказательной модели, &mdash; пакеты Python &mdash; записаны в файле `requirements/requirements-research.txt` (см. **Пакеты Python**). См. об установке пакетов Python в **Пакеты Python** в `README.md`.

## Работа с блокнотами Jupyter

См. об установке и использовании Jupyter в проекте в `docs/jupyter.md`.

## Работа с MLFlow

Для управления жизненным циклом моделей машинного обучения используется платформа [MLFlow](https://mlflow.org/).

Запуск локального сервера MLFlow (**выполнять в корневой директории проекта**):

    run_mlflow_server

Для остановки сервера MLFlow пошлите ему сигнал `SIGINT` (`Ctrl+C` в терминале).

Очистка локальной tracking БД MLFlow от удалённых прогонов (**выполнять в корневой директории проекта**):

    gc_mlflow

Очистка локальной tracking БД MLFlow от конкретных удалённых экспериментов по списку их ID, разделённым запятыми, `<ids>` (**выполнять в корневой директории проекта**):

    gc_mlflow --experiment-ids=<ids>
