{"id":50491251,"url":"https://github.com/brossend/automl_bank_project","last_synced_at":"2026-06-02T03:03:21.190Z","repository":{"id":357113149,"uuid":"1235415575","full_name":"Brossend/automl_bank_project","owner":"Brossend","description":"Automated ML pipeline for the UCI Bank Marketing dataset: ETL, Optuna-based AutoML, model evaluation, MLflow logging, pytest tests, Docker, and CI/CD.","archived":false,"fork":false,"pushed_at":"2026-05-11T10:44:57.000Z","size":2104,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T12:38:57.704Z","etag":null,"topics":["automl","bank-marketing","binary-classification","ci-cd","classification","data-science","docker","docker-compose","etl","github-actions","gitlab-ci","machine-learning","ml-pipeline","mlflow","model-monitoring","optuna","pytest","python","scikit-learn","uci-dataset"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Brossend.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-11T09:55:22.000Z","updated_at":"2026-05-11T11:00:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Brossend/automl_bank_project","commit_stats":null,"previous_names":["brossend/automl_bank_project"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Brossend/automl_bank_project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Brossend%2Fautoml_bank_project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Brossend%2Fautoml_bank_project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Brossend%2Fautoml_bank_project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Brossend%2Fautoml_bank_project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Brossend","download_url":"https://codeload.github.com/Brossend/automl_bank_project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Brossend%2Fautoml_bank_project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33803734,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automl","bank-marketing","binary-classification","ci-cd","classification","data-science","docker","docker-compose","etl","github-actions","gitlab-ci","machine-learning","ml-pipeline","mlflow","model-monitoring","optuna","pytest","python","scikit-learn","uci-dataset"],"created_at":"2026-06-02T03:03:20.490Z","updated_at":"2026-06-02T03:03:21.184Z","avatar_url":"https://github.com/Brossend.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Лямцев Иван Алексеевич - Автоматизация ML-пайплайна на датасете Bank Marketing\n\n\u003e **Дисциплина:** \"Автоматизация машинного обучения\" \n\u003e **Преподаватель:** Елена Смысловских  \n\u003e **Студент:** Лямцев Иван Алексеевич   \n\u003e **Формат проекта:** индивидуальная работа  \n\u003e **Тема проекта:** автоматизация ML-пайплайна для прогнозирования отклика клиента на банковское предложение\n\n---\n\n## 1. Описание бизнес-задачи\n\nЦель проекта - построить и автоматизировать ML-пайплайн, который прогнозирует, подпишется ли клиент банка на срочный депозит после маркетингового контакта.\n\nБизнес-смысл задачи: банк проводит кампании обзвона клиентов. Если заранее определить клиентов с высокой вероятностью положительного отклика, можно:\n\n- повысить эффективность маркетинговой кампании;\n- снизить затраты на нецелевые звонки;\n- приоритизировать клиентов для менеджеров;\n- улучшить конверсию в оформление срочного депозита.\n\nТип задачи машинного обучения: **бинарная классификация**.\n\nЦелевой признак: `y`.\n\n- `yes` - клиент подписался на срочный депозит;\n- `no` - клиент не подписался.\n\n---\n\n## 2. Датасет\n\nВ проекте используется открытый датасет **Bank Marketing** из **UCI Machine Learning Repository**.\n\nИсточник датасета:  \nhttps://archive.ics.uci.edu/dataset/222/bank+marketing\n\nДатасет содержит данные прямых маркетинговых кампаний португальского банковского учреждения. Кампании проводились с помощью телефонных звонков. Задача датасета - предсказать, подпишется ли клиент на срочный депозит.\n\nХарактеристики датасета:\n\n- **предметная область:** бизнес;\n- **тип задачи:** классификация;\n- **тип данных:** табличные данные;\n- **признаки:** категориальные и числовые;\n- **целевой признак:** `y`;\n- **пропущенные значения:** отсутствуют.\n\nВ проекте используется файл `bank.csv`, то есть уменьшенная версия датасета, удобная для быстрого тестирования автоматизированного ML-пайплайна.\n\n---\n\n## 3. Используемые признаки\n\nПримеры признаков:\n\n| Признак | Описание |\n|---|---|\n| `age` | возраст клиента |\n| `job` | тип занятости |\n| `marital` | семейное положение |\n| `education` | уровень образования |\n| `default` | наличие кредитного дефолта |\n| `balance` | средний годовой баланс |\n| `housing` | наличие ипотечного кредита |\n| `loan` | наличие персонального кредита |\n| `contact` | тип коммуникации |\n| `campaign` | количество контактов в рамках кампании |\n| `pdays` | количество дней после предыдущего контакта |\n| `previous` | количество прошлых контактов |\n| `poutcome` | результат предыдущей кампании |\n\nПризнак `duration` исключается из обучения, потому что он описывает длительность текущего звонка. В реальном бизнес-сценарии до звонка это значение неизвестно, поэтому его использование может привести к утечке данных.\n\n---\n\n## 4. Архитектура ML-пайплайна\n\nОбщая схема пайплайна:\n\n```text\nUCI Dataset\n    ↓\nDownload / Extract\n    ↓\nETL\n    ↓\nTrain / Validation / Test split\n    ↓\nPreprocessing\n    ├── StandardScaler для числовых признаков\n    └── OneHotEncoder для категориальных признаков\n    ↓\nAutoML через Optuna\n    ├── выбор модели\n    └── подбор гиперпараметров\n    ↓\nОбучение лучшей модели\n    ↓\nОценка качества\n    ↓\nСохранение модели, метрик, графиков и MLflow-логов\n```\n\n---\n\n## 5. ETL\n\nETL реализован в файле:\n\n```text\nsrc/etl.py\n```\n\n### Extract\n\nЗагрузка датасета выполняется из **UCI Machine Learning Repository** через файл:\n\n```text\nsrc/download_data.py\n```\n\nКоманда:\n\n```bash\npython -m src.download_data\n```\n\n### Transform\n\nНа этапе обработки данных выполняется:\n\n- удаление дублей;\n- нормализация текстовых значений;\n- обработка потенциальных пропусков;\n- преобразование целевого признака `y` из `yes/no` в `1/0`;\n- удаление признака `duration` для предотвращения утечки данных.\n\n### Load\n\nПодготовленные данные передаются в ML-пайплайн для обучения и оценки модели.\n\n---\n\n## 6. AutoML / автоматизация обучения\n\nАвтоматизация ML-модели реализована через библиотеку **Optuna**.\n\nOptuna автоматически перебирает:\n\n- тип модели;\n- набор гиперпараметров;\n- параметры регуляризации;\n- глубину деревьев;\n- количество деревьев;\n- минимальные ограничения на разбиения в деревьях.\n\nВ проекте сравниваются следующие модели:\n\n- `LogisticRegression`;\n- `RandomForestClassifier`;\n- `ExtraTreesClassifier`.\n\nОсновная метрика для оптимизации:\n\n```text\nF1-score\n```\n\nПричина выбора F1-score: в задаче есть дисбаланс классов, поэтому одной accuracy недостаточно. F1-score учитывает и precision, и recall.\n\nФайл обучения:\n\n```text\nsrc/train.py\n```\n\nЗапуск обучения:\n\n```bash\npython -m src.train\n```\n\n---\n\n## 7. Метрики модели\n\nДля оценки качества используются:\n\n- Accuracy;\n- Precision;\n- Recall;\n- F1-score;\n- ROC-AUC;\n- Confusion Matrix;\n- ROC Curve.\n\nПосле обучения метрики сохраняются в файл:\n\n```text\nreports/metrics.json\n```\n\nРезультаты Optuna сохраняются в файл:\n\n```text\nreports/tables/optuna_trials.csv\n```\n\nЛучшая модель по результатам AutoML: `ExtraTreesClassifier`.\n\nЛучшие параметры:\n\n```text\nn_estimators = 94\nmax_depth = 17\nmin_samples_split = 7\nmin_samples_leaf = 1\n```\n\n---\n\n## 8. Визуализации\n\nПосле запуска обучения создаются графики:\n\n```text\nreports/figures/target_distribution.png\nreports/figures/confusion_matrix.png\nreports/figures/roc_curve.png\nreports/figures/metrics.png\n```\n\n![Target distribution](reports/figures/target_distribution.png)\n![Metrics](reports/figures/metrics.png)\n![Confusion matrix](reports/figures/confusion_matrix.png)\n![ROC curve](reports/figures/roc_curve.png)\n\nМодель показала ROC-AUC = 0.72, что означает умеренную способность модели отделять клиентов, склонных к подписке на депозит, от клиентов, которые не подпишутся.\n\nAccuracy = 0.83, однако из-за дисбаланса классов эта метрика не является основной. Целевой класс \"yes\" встречается значительно реже, поэтому дополнительно анализируются precision, recall и F1-score.\n\nPrecision = 0.30, recall = 0.38, F1-score = 0.33. Это показывает, что модель находит часть клиентов, склонных к подписке, но качество можно улучшать за счёт балансировки классов, расширения признаков, увеличения числа итераций AutoML и подбора порога классификации.\n\n---\n\n## 9. MLflow\n\nДля логирования экспериментов используется **MLflow**.\n\nЛогируются:\n\n- лучшие гиперпараметры;\n- accuracy;\n- precision;\n- recall;\n- F1-score;\n- ROC-AUC;\n- обученная модель;\n- графики.\n\nЗапуск MLflow UI:\n\n```bash\nmlflow ui\n```\n\nПосле запуска интерфейс будет доступен по адресу:\n\n```text\nhttp://127.0.0.1:5000\n```\n\n---\n\n## 10. Тестирование\n\nТесты реализованы с помощью `pytest`.\n\nФайлы тестов:\n\n```text\ntests/test_etl.py\ntests/test_train.py\n```\n\nПроверяется:\n\n- очистка данных;\n- удаление дублей;\n- нормализация текстовых значений;\n- преобразование целевого признака;\n- исключение признака `duration`;\n- корректное разделение на train/test;\n- работа preprocessing-пайплайна;\n- корректный расчёт метрик.\n\nЗапуск тестов:\n\n```bash\npytest\n```\n\n---\n\n## 11. Docker\n\nДля воспроизводимого запуска проекта используется Docker.\n\nСборка контейнера:\n\n```bash\ndocker compose build\n```\n\nЗапуск пайплайна:\n\n```bash\ndocker compose up\n```\n\nКонтейнер выполняет команду:\n\n```bash\npython -m src.train\n```\n\nDocker сохраняет результаты в локальные директории:\n\n```text\nmodels/\nreports/\nmlruns/\n```\n\n---\n\n## 12. CI/CD\n\nCI/CD реализован двумя способами:\n\n1. GitHub Actions - файл `.github/workflows/ci.yml`.\n2. GitLab CI/CD - файл `.gitlab-ci.yml`.\n\nWorkflow выполняет:\n1. загрузку репозитория;\n2. установку Python 3.11;\n3. установку зависимостей;\n4. запуск тестов `python -m pytest`;\n5. сборку Docker-образа.\n\nНа момент сдачи GitHub Actions не запускается из-за ограничения аккаунта GitHub: `GitHub Actions is currently disabled for your account`.\n\nДля дополнительной проверки добавлен GitLab CI/CD.  \nРаботоспособность шагов также проверена локально:\n- `python -m pytest` - 6 passed;\n- `docker compose build` - образ успешно собран;\n- `docker compose up` - пайплайн выполнен, контейнер завершился с кодом 0.\n\nGitHub-репозиторий:\n\nhttps://github.com/Brossend/automl_bank_project\n\nСсылка на GitLab-репозиторий:\n\nhttps://gitlab.com/Brossend2335/automl_bank_project\n\nСсылка на успешно выполненный GitLab Pipeline:\n\nhttps://gitlab.com/Brossend2335/automl_bank_project/-/pipelines/2515617869\n\n---\n\n## 13. Мониторинг\n\nМониторинг реализован на двух уровнях.\n\n### Мониторинг качества модели\n\nИспользуются:\n\n- F1-score;\n- ROC-AUC;\n- Precision;\n- Recall;\n- Confusion Matrix;\n- распределение целевого класса.\n\nЭто позволяет контролировать качество ML-модели и понимать, насколько хорошо она определяет клиентов с вероятностью подписки на депозит.\n\n### Мониторинг инфраструктуры\n\nФайл:\n\n```text\nsrc/monitor.py\n```\n\nСкрипт собирает:\n\n- загрузку CPU;\n- использование RAM.\n\nЗапуск:\n\n```bash\npython -m src.monitor\n```\n\nРезультат сохраняется в файл:\n\n```text\nreports/tables/resource_monitoring.csv\n```\n\n---\n\n## 14. Запуск проекта локально\n\n### 1. Создать виртуальное окружение\n\n```bash\npython -m venv .venv\n```\n\nWindows:\n\n```bash\n.venv\\Scripts\\activate\n```\n\nLinux/macOS:\n\n```bash\nsource .venv/bin/activate\n```\n\n### 2. Установить зависимости\n\n```bash\npip install -r requirements.txt\n```\n\n### 3. Скачать датасет\n\n```bash\npython -m src.download_data\n```\n\n### 4. Запустить обучение\n\n```bash\npython -m src.train\n```\n\n### 5. Запустить тесты\n\n```bash\npytest\n```\n\n### 6. Запустить мониторинг ресурсов\n\n```bash\npython -m src.monitor\n```\n\n### 7. Запустить MLflow UI\n\n```bash\nmlflow ui\n```\n\n---\n\n## 15. Структура проекта\n\n```text\n.\n├── .github/\n│   └── workflows/\n│       └── ci.yml\n├── data/\n│   ├── raw/\n│   └── processed/\n├── docs/\n│   └── teacher_note.md\n├── models/\n├── reports/\n│   ├── figures/\n│   └── tables/\n├── src/\n│   ├── __init__.py\n│   ├── config.py\n│   ├── download_data.py\n│   ├── etl.py\n│   ├── evaluate.py\n│   ├── monitor.py\n│   ├── predict.py\n│   └── train.py\n├── tests/\n│   ├── test_etl.py\n│   └── test_train.py\n├── Dockerfile\n├── docker-compose.yml\n├── Makefile\n├── README.md\n└── requirements.txt\n```\n\n---\n\n## 16. Выводы для бизнеса\n\nРазработанный ML-пайплайн позволяет автоматизировать процесс обучения модели для прогнозирования отклика клиента на банковское предложение.\n\nПрактическая польза для бизнеса:\n\n- можно заранее выделять клиентов с высокой вероятностью подписки на депозит;\n- можно снижать нагрузку на операторов;\n- можно уменьшать количество неэффективных звонков;\n- можно повышать конверсию маркетинговой кампании;\n- можно регулярно переобучать модель при появлении новых данных.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrossend%2Fautoml_bank_project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrossend%2Fautoml_bank_project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrossend%2Fautoml_bank_project/lists"}