From 3fa85672fb580fa293ad7efd407f5d8d111d6ff3 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 20 Oct 2024 17:27:39 +0300 Subject: [PATCH] lab2, lec7 pptx --- labs/lab1.md | 11 + labs/lab2.md | 268 ++++++++++++++++++ .../lec7-feature_selection_hyperparams.pptx | Bin 564872 -> 564855 bytes 3 files changed, 279 insertions(+) create mode 100644 labs/lab2.md diff --git a/labs/lab1.md b/labs/lab1.md index 7959e75..056d0e4 100644 --- a/labs/lab1.md +++ b/labs/lab1.md @@ -306,3 +306,14 @@ my_proj Файлы с обработанными данными, а также большие графики, которые не попали в репозитарий сохраните себе на флешку или любым другим способом. Обратите внимание, что с этими данными вы продолжите работать в следующих лабораторных работах. Сохранность файлов на виртуальной машине **НЕ ГАРАНТИРУЕТСЯ**. + + + +## Контрольные вопросы + +1. Для чего нужен и как используется файл `requirements.txt` +1. Что такое "виртуальное окружение" +1. Как установить виртуальное окружение для проекта +1. Для чего нужен этап разведочного анализа данных? Какие цели на нем решаются? +1. Какие типы графиков вы знаете и в каких случаях лучше применять тот или иной тип? + diff --git a/labs/lab2.md b/labs/lab2.md new file mode 100644 index 0000000..ae9c29c --- /dev/null +++ b/labs/lab2.md @@ -0,0 +1,268 @@ +# Лабораторная работа №2. Проведение экспериментов по настройке модели. + +## Цель работы +Провести ряд экспериментов по настройке модели, логируя все результаты в MLFlow. +Научиться пользоваться инструментами autofeat, mlxtend, MLFlow + +## Подготовка +Работа содержит задания "со звездочкой", выполнять котороые **не обязательно**, но их выполнение откроет новые знания :) + +Можете их выполнить дома в качестве самостоятельного задания. + +Их выполнение или не выполнение **не будет влиять** на итоговую оценку. + +## Задание +1. В VS Code открыть папку с вашим проектом и активировать виртуальное окружение. +2. Создать директорию и ноутбук, в котором вы будете проводить исследования. +3. Загрузить очищенную выборку. Разбить ее на тестовую и обучающую в пропорции 25%-75% +4. Создать переменные, содержащие названия столбцов с числовыми и категориальными признаками +----- +5. Создать pipeline обработки признаков и обучения модели. Для числовых признаков использовать `StandardScaler`, для категориальных - `TargetEncoder`(для задачи классификации) или `OrdinalEncoder` для задачи регрессии. В качестве модели - `RandomForest` +6. Обучить baseline-модель и получить метрики качества на тестовой выборке. Для задачи классификации это `precision`, `recall`, `f1`, `roc_auc`. Для регрессии - `mae`, `mape`, `mse` +----- +7. Создать в корне вашего проекта директорию `./mlflow` в которой будет запускаться фреймворк. +8. Написать sh-скрипт по запуску mlflow локально с хранилищем экспериментов (backend store) в СУБД sqlite. Запустить mlflow, убедиться в его работе. +9. Залогировать baseline-модель в новый эксперимент. Зарегистрировать модель. +----- +10. С использованием библиотеки `sklearn` создать дополнительные признаки, обучить модель, залогировать ее. +11. (*) Сгенерировать новые признаки с использованием библиотект `autofeat`, обучить модель, залогировать ее. +12. С использованием библиотеки `mlxtend` отобрать N наиболее важных признаков. N выбирается с учетом количества признаков на предыдущем шаге, ориентировочный диапазон - от 20% до 70%. Обучить модель, залогировать ее. +13. (*) Повторите предыдущий пункт с помощью `sklearn`, проанализируйте, схожие ли признаки выбраны другим алгоритмом? +14. С помощью `optuna` настроить оптимальные параметры для модели, показывающей лучший результат. Обучить модель, залогировать ее, зарегистрировать очередную версию. +15. (*) Обучить модель с помощью алгоритма [CatBoost](https://catboost.ai/) с выбранным вами набором признаков, залогировать ее, зарегистрировать очередную версию. Не забудьте воспользоваться оберткой (flavour) catboost. +----- +16. Проанализировать все прогоны и выбрать модель, показывающую наилучшее качество. +Обучить эту модель на всей выборке (а не только на train-части), залогировать ее. В реестре моделей установить ей тэг `Production`. Эту модель мы будем деплоить в следующей лабораторной работе. +17. Актуализировать файлы `requirements.txt` и `README.md`, `.gitignore` +18. Отправить изменения на github. Сохранить на флешку или иным способом директорию `./mlflow` + + + + +## Методические указания +### 1 +Работа является продолжением ЛР1. Выполнять ее нужно в той же директории проекта и с тем же виртуальным окуржением, что и ЛР1. + +> Если вы выполняете работу не на том же компьютере, что и ЛР1, то проект придется восстановить с гитхаба. Очень кстати в файле README указаны все команды по запуску проекта :) + +### 2 +В директории вашего проекта создать новую директорию `./research`, в которой будут храниться артефакты по настройке модели. Создать в ней ноутбук, в котором вы будете проводить исследования. +``` +my_proj + |_____ .venv_my_proj + |_____ .git + |_____ data + | |___ ... + | + |_____ eda + | |___ ... + | + |_____ research + | |___ research.ipynb + | + |_____ .gitignore + |_____ README.md + |_____ requirements.txt + +``` +### 3 + +В данной работе вы будете использовать обработанную и очищенную выборку, которая была получена в результате выполнения ЛР1. Ее следовало сохранить, однако если это не было сделано, то необходимо прогнать код ЛР1, чтобы заново ее получить. + +Деление на обучающую и тестовую - стандартным `train_test_split` из `sklearn` 75%-25% + +### 4 + +Переменные, содержащие названия столбцов с числовыми и категориальными признаками вы уже создавали в ЛР1, код можно подглядеть там. + +### 5 + +Pipeline на данном этапе будет состоять из двух шагов - `transform`, на котором вы проводите преобразования признаков, и `classification` (`regression`), на котором обучаете модель. +На шаге `transform` для числовых признаков использовать `StandardScaler`, для категориальных - `TargetEncoder`(для задачи классификации) или `OrdinalEncoder` для задачи регрессии. + +В качестве модели в работе будем использовать `RandomForest`. + +> Известно, что `RandomForest` и другие алгоритмы на основе деревьев не нуждаются в шкалировании числовых признаков. Кроме того, существуют алгоритмы на основе деревьев, которые нативно обрабатывают категориальные признаки, например [CatBoost](https://catboost.ai/). Однако это частный случай. Для возможности применения других алгоритмов, помимо деревьев, мы проведем стандартные шаги шкалирования и кодирования. + +> Если ваша модель обучается уже дольше 5 минут, то имеет смысл остановить обучение и либо уменьшить объем выборки (например, воспользовавшись методом sample: `DataFrame.sample(frac=0.25)` тут `frac=0.25` означает, что мы хотим оставить 25% выборки), либо изменить гиперпараметры модели, уменьшив количество деревьев и их глубину. + +### 6 +Baseline-модель - это простая модель, от которой отталкиваются, чтобы сделать что-то более эффективное, отправная точка для сравнения и улучшения. Обычно обученная без каких-то особенных настроек и подбора гиперпараметров. Ее цель - понять, решаема ли вообще поставленная задача. + +### 7, 8 +Директория `./mlflow` будет содержать все что связано с данным фреймворком, а также скрипт для ее запуска. + +Первоначально нужно установить фреймворк, будем использовать версию 2.16. Кроме того, следует обновить версию numpy до 1.26.4. Не забудьте обновить файл `requirements.txt` +``` +pip install numpy==1.26.4 mlflow==2.16 +``` + + +Запускать mlflow мы будем локально, с указанием хранилища экспериментов в СУБД sqlite. Команду для запуска мы сохраним в виде bash-скрипта, что поможет вспомнить спустя время, как запустить фреймворк. + +Саму команду можно подсмотреть в лекции №4. + +Перед запуском mlflow убедитесь что вы находитесь в директории `./mlflow`. +Запустить bash-скрипт можно командой: +``` +sh script_name.sh +``` + + После запуска убедитесь, что БД создана там же: + +``` +my_proj + |_____ .venv_my_proj + |_____ .git + |_____ data + | |___ ... + | + |_____ eda + | |___ ... + | + |_____ research + | |___ research.ipynb + | + |_____ mlflow + | |___ start_mlflow.sh + | |___ mlruns.db + | + |_____ .gitignore + |_____ README.md + |_____ requirements.txt + +``` +Проверьте, что фреймворк успешно запустился, пройдя в браузере на http://localhost:5000/ + +### 9 + +Прежде чем приступить непосредственно к логированию, подготовим дополнительные артефакты, которыми обогатим информацию о модели. +* сигнатуру модели +* пример входных данных +* файл `requirements.txt` + +Пример входных данных можно получить, взяв первые несколько строк исходного датасета, а для сигнатуры - воспользоваться модулем `infer_signature`: +``` +from mlflow.models import infer_signature +input_example = X_train.head(5) +signature = infer_signature(model_input = X_train.head(5)) +``` + +Модель нужно логировать со вкусом (flavour) sklearn. +``` +mlflow.sklearn.log_model(...) +``` + +Убедитесь, что логирование прошло успешно, открыв интерфейс и проверив, что в эксперименте появился первый Run. + +Так же, зарегистрируйте эту модель в качестве первой версии модели по решению текущей задачи. Это можно сделать как через интерфейс, так и с помощью python API. + +### 10 + +Сгенерируйте новые признаки с помощью различных трансформаций из библиотеки [`sklearn`](https://scikit-learn.org/stable/api/sklearn.preprocessing.html): + +* Для 2-3 числовых признаков PolynomialFeatures. Установить параметр degree=2. Не забудьте, что полученные таким образом признаки сами требуют шкалирования. Обратитесь к примеру из лекций, как поступить в этом случае. +* Если у вас есть признаки, представляющие временные ряды, то SplineTransformer +* Если временных признаков нет, то KBinsDiscretizer для разбивки 2-3 числовых признаков на корзины("бины") +* Возможно, другие на ваше усмотрение. + + +Для этого: +1. Создайте новую переменную `X_train_fe_sklearn`- копию исходной обучающей выборки, используя метод `.copy()` датафрейма. +2. Создайте `ColumnTransformer`, содержащий как трансформации baseline-модели (сделанные в п.5 ЛР), так и новые. +3. Обучите и сохраните в переменную `X_train_fe_sklearn` (используя метод `fit_transform`) получившиеся преобразования. +4. Сохраните в файл названия столбцов получившегося датафрейма. Этот файл нужно будет залогировать в MLFlow +5. Создайте `pipeline`, в котором на первом шаге будет работать `ColumnTransformer`, созданный в этом пункте, а на втором - модель. + +Далее нужно обучить модель, сделать предикт и залогировать модель и файл со столбцами, сделанный на шаге 4. Не забудьте поменять `RUN_NAME` на понятный, соответствующий действиям в этом пункте ЛР. + +### 11 (*) +Сгенерировать новые признаки с помощью библиотеки `autofeat` используя подходящие трансформации и задав `feateng_steps=2` +Данная трансформация заменит шаг `transform` вашего исходного `pipeline`. +Действия аналогичный предыдущему пункту. +Далее нужно обучить модель, сделать предикт и залогировать модель результаты. Не забудьте поменять `RUN_NAME` на понятный, соответствующий действиям в этом пункте ЛР. + + +### 12 +С использованием библиотеки `mlxtend` отобрать `N` наиболее важных признаков. `N` выбирается с учетом количества признаков на предыдущем шаге, ориентировочный диапазон - от 20% до 70%. + +В ЛР отбор будем проводить для признаков, полученных трансформациями `sklearn` в пункте 10. +Алгоритм выполнения пункта следующий: + +* Создайте `SequentialFeatureSelector` c направлением последовательным добавлением признаков (forward). +* В пункте 10 был получен датафрейм`X_train_fe_sklearn`, состоящий из расширенного набора признаков по сравнению с исходными данными. На этом датафрейме обучите `SequentialFeatureSelector`. +* Выведите на экран и сохраните в файлы названия отобранных столбцов и их индексы (их нужно будет залогировать вместе с моделью) +* Добавьте в папйлайн из пункта 10 вторым шагом отбор столбцов в соответствии с заданными индексами + + +Далее нужно обучить модель, сделать предикт и залогировать модель и файлы с названиями и индексами отбранных столбцов. Не забудьте поменять `RUN_NAME` на понятный, соответствующий действиям в этом пункте ЛР. + + +### 13 (*) +Повторите предыдущий пункт с `SequentialFeatureSelector` последовательно удаляя признаки (`forward=False`). И\или с помощью `RFE` из `sklearn`. + +Проанализируйте, схожие ли признаки выбраны другим алгоритмом? + +Можно провести исследование и попробовать объединить признаки, выбранные разными алгоритмами. Или наоборот - выбрать только те, котрые были выбраны всеми. + + +### 14 +Используйте модель, которая показала лучший результат. + +У `Random Forest` будем настраивать параметры: +* количество деревьев от 1 до 20 +* глубина дерева от 1 до 10 +* max_features в интевале от 0.1 до 1 + +Проведите не менее 10 trails по подбору опитмальных гиперпараметров. Настраивать качество будем по метрике `mae` для регрессии и `f1` для классификации. Обратите внимание и явно укажите в коде на то, что нужно делать с метрикой - максимизировать или минимизировать. + +Обученную модель залогируйте в MLFlow. Не забудьте поменять `RUN_NAME` на понятный, соответствующий действиям в этом пункте ЛР. + +Зарегистрируйте модель в качестве второй версии исходной модели. Можно через интерфейс, можно с использованием API. + +### 15 (*) +Обучить модель с помощью алгоритма [CatBoost](https://catboost.ai/) с выбранным вами набором признаков. Пункт аналогичен предыдущему. +Залогируйте модель. Не забудьте воспользоваться оберткой (flavour) catboost. + +Зарегистрируйте данную модель как третью версию. Можно через интерфейс, можно с использованием API. + + +### 16 +Актуализировать файл `requirements.txt`. + +Проанализировать все прогоны и выбрать модель, показывающую наилучшее качество. +Обучить эту модель на всей выборке (а не только на train-части), залогировать ее. +Метрики качества мерить уже не надо, однако кроме самой модели обязательно должны быть залогированы: +* сигнатура модели +* пример входных данных +* файл `requirements.txt` +* список используемых столбцов + + В реестре моделей установить ей тэг `Production` + +### 17. +Актуализировать файлы `README.md`, `.gitignore`. + +В Readme нужно +* добавить пункт по запуску MLFlow - где находится скрипт, какой командой его запустить. +* добавить пункт "Результаты исследования" где описать, какая модель показала лучший результат и какой. Ее параметры и выбранные столбцы. Указать `run_id` прогона с `Production` моделью. + +В `.gitignore` добавить в исключения папку с артефактами mlflow, и базу `mlruns.db`. + +Убедитесь, что скрипт по запуску **должен быть обязательно закоммичен!** + + +### 18. +Отправить изменения на github. + +Сохранить на флешку или иным способом директорию `./mlflow`. Убедитесь, что в ней содержится папка `mlartifacts` и база `mlruns.db` + + + +## Контрольные вопросы + +1. Для чего нужен этап feature extraction? +1. Для чего нужен этап feature selection? +1. Для чего используется фреймворл mlfow? +1. Что такое "гиперпараметры модели" для чего и как их настраивать? +1. Как выглядит пайплайн работы модели, какие шаги в нем могут быть? diff --git a/lectures/lec7-feature_selection_hyperparams.pptx b/lectures/lec7-feature_selection_hyperparams.pptx index 748bf03a3dbcc40e5e1804546558b7429eb32373..be498365159184b27e57a4749ec83fbb766df3fa 100644 GIT binary patch delta 19884 zcmZs?b9`Li+CCh!v5m$_W7~FP+cug^Y$uKFG`1TXjcr?v`A)v)Ip@Leoxj%XHCa2K znRVS4?!Ce~Ngp~$zbMLpL!g7ez`%ffHLCrB3JUhsD3KVH9H6Vv%ZTptpibwr*#?F< z6BS>&ErnWu9Btp&9(A(7W;?XCxoT^ZoABuNhp*(&mrV~pVr?~$JwM4=GyvI?*fR|- zZDQK2^VWQrC3z%izbJ@{J3uIMkK!QWM!7GM9>apR+hbA^cXS^Ayh0V-xX)dY5sfq0 zWv^)tvL5l|3xIa8O9RRSJp_fmyDmvH1W!aCA?C;=?WRXrmD?UcIff(@tdK1g0wSjo z)5Wlg-y#j(l;ljQN7YgR@gxu>u%_xXm#|rRQJ}}Zd?>|DMSs{#6<-lG2RBa#ygtrr z($8(*>%jHLM~z;-33?2LFXvyW1_}}ag(EVr*z4+tXn-MB3b*AFi-RLvh;?2?yP?Fp zBxfc|nyTG)c-8Bn94(IW1huo-*(iYzEpaCgcPwq|?}DAA7ke_)XOlLH<|J85&Q9zy z4hvfArO1Oza-}&n0*BeAGJbylRl8!)mL<3hk(7%*0V3unC`B1)7{U{pH)~K3kToz6 zkk6k4=HI_b;s_WSK+e9G@k_|%3x;Zcqm%%v>QE0e6G;&mwvg>BLe;rKbn@ zT+qWOlb1%qRR(>9PANo2h;th;r}TJ;3a84Z_J|(~_QwfiphdPtj+it~L4pfA{(vu& zeSWyYsIcrRCb38AQIL(HdQiBgct0l*I{P&cc@Em-X+2!60B1d@ z1gZ_;wPql{nc>+El|5-qW;_`?aZL4d_zIHH)-R8h%4J|?uJ_6Boe$W>3ry1udTvz@ zEl+4(!vnt^92miYKXh*(ARyVmujqg7*m?+v&VRP7As1f#2BgG4<82(gL}6%Lz=YkZ zIP&iYY8XN%XGwa1C|5E#Pk16ojCDV(SFxltX~%1i6S+1u9Op=pSO65Y7sHB-w}n5k z+)97UtU7T{VfEB9Iki&VH%<0+QAr359Yg^{bMr2Hx7LN3d0irSzLb7FY*x|zIyyKz zgU}eP2E3g&Z)^Bss{T1ReE3j*z$)^K9i5);yAickRIT$+M41eP14@6Sn#h?V?l);= z8+V<}2!_yjyzWLd$sduu)Rr=cwQk*wvE*c9A$!_-#0L)&C9MLac4ts?`N$WJ^23&y zL6yno?TaGqr-9Yuu#Qabxb7WPgh7QC60c9$a=n~3(_?N&hgF4CYmQRr0I#(S(%5^M z=|4LV(VW-kvo7P!!)_c}AUP;5#m9!R_nr^^rr3<$@H}VO5)Wagb!t=XQu&n@iFEK! zp*`$g8KPJC27y!%$w-0p(#C$TO(@P&c(}=h1(TpNgn;zMmQ~XCtxRoVyk0vI2-5rI zW>&BH^`d|*-KN-fJNMt20FSQqR>!(fa!WGeg-BA9>}ERifhR^Kr}$Dio8^m2WS(3& zNPP3sGbniciqLyEItUVzkRmJ)W!U)rID�!50+HLc#&Nm@#_kedL`r79_7!9^C~K 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