https://github.com/brossend/automl_bank_project
Automated ML pipeline for the UCI Bank Marketing dataset: ETL, Optuna-based AutoML, model evaluation, MLflow logging, pytest tests, Docker, and CI/CD.
https://github.com/brossend/automl_bank_project
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
Last synced: 13 days ago
JSON representation
Automated ML pipeline for the UCI Bank Marketing dataset: ETL, Optuna-based AutoML, model evaluation, MLflow logging, pytest tests, Docker, and CI/CD.
- Host: GitHub
- URL: https://github.com/brossend/automl_bank_project
- Owner: Brossend
- Created: 2026-05-11T09:55:22.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-05-11T10:44:57.000Z (about 1 month ago)
- Last Synced: 2026-05-11T12:38:57.704Z (about 1 month ago)
- 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
- Language: Python
- Homepage:
- Size: 2.01 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Лямцев Иван Алексеевич - Автоматизация ML-пайплайна на датасете Bank Marketing
> **Дисциплина:** "Автоматизация машинного обучения"
> **Преподаватель:** Елена Смысловских
> **Студент:** Лямцев Иван Алексеевич
> **Формат проекта:** индивидуальная работа
> **Тема проекта:** автоматизация ML-пайплайна для прогнозирования отклика клиента на банковское предложение
---
## 1. Описание бизнес-задачи
Цель проекта - построить и автоматизировать ML-пайплайн, который прогнозирует, подпишется ли клиент банка на срочный депозит после маркетингового контакта.
Бизнес-смысл задачи: банк проводит кампании обзвона клиентов. Если заранее определить клиентов с высокой вероятностью положительного отклика, можно:
- повысить эффективность маркетинговой кампании;
- снизить затраты на нецелевые звонки;
- приоритизировать клиентов для менеджеров;
- улучшить конверсию в оформление срочного депозита.
Тип задачи машинного обучения: **бинарная классификация**.
Целевой признак: `y`.
- `yes` - клиент подписался на срочный депозит;
- `no` - клиент не подписался.
---
## 2. Датасет
В проекте используется открытый датасет **Bank Marketing** из **UCI Machine Learning Repository**.
Источник датасета:
https://archive.ics.uci.edu/dataset/222/bank+marketing
Датасет содержит данные прямых маркетинговых кампаний португальского банковского учреждения. Кампании проводились с помощью телефонных звонков. Задача датасета - предсказать, подпишется ли клиент на срочный депозит.
Характеристики датасета:
- **предметная область:** бизнес;
- **тип задачи:** классификация;
- **тип данных:** табличные данные;
- **признаки:** категориальные и числовые;
- **целевой признак:** `y`;
- **пропущенные значения:** отсутствуют.
В проекте используется файл `bank.csv`, то есть уменьшенная версия датасета, удобная для быстрого тестирования автоматизированного ML-пайплайна.
---
## 3. Используемые признаки
Примеры признаков:
| Признак | Описание |
|---|---|
| `age` | возраст клиента |
| `job` | тип занятости |
| `marital` | семейное положение |
| `education` | уровень образования |
| `default` | наличие кредитного дефолта |
| `balance` | средний годовой баланс |
| `housing` | наличие ипотечного кредита |
| `loan` | наличие персонального кредита |
| `contact` | тип коммуникации |
| `campaign` | количество контактов в рамках кампании |
| `pdays` | количество дней после предыдущего контакта |
| `previous` | количество прошлых контактов |
| `poutcome` | результат предыдущей кампании |
Признак `duration` исключается из обучения, потому что он описывает длительность текущего звонка. В реальном бизнес-сценарии до звонка это значение неизвестно, поэтому его использование может привести к утечке данных.
---
## 4. Архитектура ML-пайплайна
Общая схема пайплайна:
```text
UCI Dataset
↓
Download / Extract
↓
ETL
↓
Train / Validation / Test split
↓
Preprocessing
├── StandardScaler для числовых признаков
└── OneHotEncoder для категориальных признаков
↓
AutoML через Optuna
├── выбор модели
└── подбор гиперпараметров
↓
Обучение лучшей модели
↓
Оценка качества
↓
Сохранение модели, метрик, графиков и MLflow-логов
```
---
## 5. ETL
ETL реализован в файле:
```text
src/etl.py
```
### Extract
Загрузка датасета выполняется из **UCI Machine Learning Repository** через файл:
```text
src/download_data.py
```
Команда:
```bash
python -m src.download_data
```
### Transform
На этапе обработки данных выполняется:
- удаление дублей;
- нормализация текстовых значений;
- обработка потенциальных пропусков;
- преобразование целевого признака `y` из `yes/no` в `1/0`;
- удаление признака `duration` для предотвращения утечки данных.
### Load
Подготовленные данные передаются в ML-пайплайн для обучения и оценки модели.
---
## 6. AutoML / автоматизация обучения
Автоматизация ML-модели реализована через библиотеку **Optuna**.
Optuna автоматически перебирает:
- тип модели;
- набор гиперпараметров;
- параметры регуляризации;
- глубину деревьев;
- количество деревьев;
- минимальные ограничения на разбиения в деревьях.
В проекте сравниваются следующие модели:
- `LogisticRegression`;
- `RandomForestClassifier`;
- `ExtraTreesClassifier`.
Основная метрика для оптимизации:
```text
F1-score
```
Причина выбора F1-score: в задаче есть дисбаланс классов, поэтому одной accuracy недостаточно. F1-score учитывает и precision, и recall.
Файл обучения:
```text
src/train.py
```
Запуск обучения:
```bash
python -m src.train
```
---
## 7. Метрики модели
Для оценки качества используются:
- Accuracy;
- Precision;
- Recall;
- F1-score;
- ROC-AUC;
- Confusion Matrix;
- ROC Curve.
После обучения метрики сохраняются в файл:
```text
reports/metrics.json
```
Результаты Optuna сохраняются в файл:
```text
reports/tables/optuna_trials.csv
```
Лучшая модель по результатам AutoML: `ExtraTreesClassifier`.
Лучшие параметры:
```text
n_estimators = 94
max_depth = 17
min_samples_split = 7
min_samples_leaf = 1
```
---
## 8. Визуализации
После запуска обучения создаются графики:
```text
reports/figures/target_distribution.png
reports/figures/confusion_matrix.png
reports/figures/roc_curve.png
reports/figures/metrics.png
```




Модель показала ROC-AUC = 0.72, что означает умеренную способность модели отделять клиентов, склонных к подписке на депозит, от клиентов, которые не подпишутся.
Accuracy = 0.83, однако из-за дисбаланса классов эта метрика не является основной. Целевой класс "yes" встречается значительно реже, поэтому дополнительно анализируются precision, recall и F1-score.
Precision = 0.30, recall = 0.38, F1-score = 0.33. Это показывает, что модель находит часть клиентов, склонных к подписке, но качество можно улучшать за счёт балансировки классов, расширения признаков, увеличения числа итераций AutoML и подбора порога классификации.
---
## 9. MLflow
Для логирования экспериментов используется **MLflow**.
Логируются:
- лучшие гиперпараметры;
- accuracy;
- precision;
- recall;
- F1-score;
- ROC-AUC;
- обученная модель;
- графики.
Запуск MLflow UI:
```bash
mlflow ui
```
После запуска интерфейс будет доступен по адресу:
```text
http://127.0.0.1:5000
```
---
## 10. Тестирование
Тесты реализованы с помощью `pytest`.
Файлы тестов:
```text
tests/test_etl.py
tests/test_train.py
```
Проверяется:
- очистка данных;
- удаление дублей;
- нормализация текстовых значений;
- преобразование целевого признака;
- исключение признака `duration`;
- корректное разделение на train/test;
- работа preprocessing-пайплайна;
- корректный расчёт метрик.
Запуск тестов:
```bash
pytest
```
---
## 11. Docker
Для воспроизводимого запуска проекта используется Docker.
Сборка контейнера:
```bash
docker compose build
```
Запуск пайплайна:
```bash
docker compose up
```
Контейнер выполняет команду:
```bash
python -m src.train
```
Docker сохраняет результаты в локальные директории:
```text
models/
reports/
mlruns/
```
---
## 12. CI/CD
CI/CD реализован двумя способами:
1. GitHub Actions - файл `.github/workflows/ci.yml`.
2. GitLab CI/CD - файл `.gitlab-ci.yml`.
Workflow выполняет:
1. загрузку репозитория;
2. установку Python 3.11;
3. установку зависимостей;
4. запуск тестов `python -m pytest`;
5. сборку Docker-образа.
На момент сдачи GitHub Actions не запускается из-за ограничения аккаунта GitHub: `GitHub Actions is currently disabled for your account`.
Для дополнительной проверки добавлен GitLab CI/CD.
Работоспособность шагов также проверена локально:
- `python -m pytest` - 6 passed;
- `docker compose build` - образ успешно собран;
- `docker compose up` - пайплайн выполнен, контейнер завершился с кодом 0.
GitHub-репозиторий:
https://github.com/Brossend/automl_bank_project
Ссылка на GitLab-репозиторий:
https://gitlab.com/Brossend2335/automl_bank_project
Ссылка на успешно выполненный GitLab Pipeline:
https://gitlab.com/Brossend2335/automl_bank_project/-/pipelines/2515617869
---
## 13. Мониторинг
Мониторинг реализован на двух уровнях.
### Мониторинг качества модели
Используются:
- F1-score;
- ROC-AUC;
- Precision;
- Recall;
- Confusion Matrix;
- распределение целевого класса.
Это позволяет контролировать качество ML-модели и понимать, насколько хорошо она определяет клиентов с вероятностью подписки на депозит.
### Мониторинг инфраструктуры
Файл:
```text
src/monitor.py
```
Скрипт собирает:
- загрузку CPU;
- использование RAM.
Запуск:
```bash
python -m src.monitor
```
Результат сохраняется в файл:
```text
reports/tables/resource_monitoring.csv
```
---
## 14. Запуск проекта локально
### 1. Создать виртуальное окружение
```bash
python -m venv .venv
```
Windows:
```bash
.venv\Scripts\activate
```
Linux/macOS:
```bash
source .venv/bin/activate
```
### 2. Установить зависимости
```bash
pip install -r requirements.txt
```
### 3. Скачать датасет
```bash
python -m src.download_data
```
### 4. Запустить обучение
```bash
python -m src.train
```
### 5. Запустить тесты
```bash
pytest
```
### 6. Запустить мониторинг ресурсов
```bash
python -m src.monitor
```
### 7. Запустить MLflow UI
```bash
mlflow ui
```
---
## 15. Структура проекта
```text
.
├── .github/
│ └── workflows/
│ └── ci.yml
├── data/
│ ├── raw/
│ └── processed/
├── docs/
│ └── teacher_note.md
├── models/
├── reports/
│ ├── figures/
│ └── tables/
├── src/
│ ├── __init__.py
│ ├── config.py
│ ├── download_data.py
│ ├── etl.py
│ ├── evaluate.py
│ ├── monitor.py
│ ├── predict.py
│ └── train.py
├── tests/
│ ├── test_etl.py
│ └── test_train.py
├── Dockerfile
├── docker-compose.yml
├── Makefile
├── README.md
└── requirements.txt
```
---
## 16. Выводы для бизнеса
Разработанный ML-пайплайн позволяет автоматизировать процесс обучения модели для прогнозирования отклика клиента на банковское предложение.
Практическая польза для бизнеса:
- можно заранее выделять клиентов с высокой вероятностью подписки на депозит;
- можно снижать нагрузку на операторов;
- можно уменьшать количество неэффективных звонков;
- можно повышать конверсию маркетинговой кампании;
- можно регулярно переобучать модель при появлении новых данных.