Skip to content

Repository files navigation

🔮 Churn Prediction Service

MLOps-система для прогнозирования оттока пользователей подписочного сервиса

Python FastAPI Docker License


📋 Бизнес-ценность

Проблема

Подписочные сервисы (онлайн-кинотеатры, SaaS-платформы, фитнес-приложения) ежемесячно теряют 5-15% клиентов. Привлечение нового клиента стоит в 5-7 раз дороже удержания существующего. Без предиктивной аналитики маркетинг «стреляет вслепую», тратя бюджет на лояльных клиентов или упуская тех, кто уже готов уйти.

Решение

Сервис Churn Prediction анализирует поведение пользователей и предсказывает вероятность оттока в ближайшие 30 дней. Это позволяет:

  • 🎯 Таргетировать удержание: точечные предложения только тем, кто действительно уходит
  • 💰 Снизить CAC: сохранение клиента вместо привлечения нового
  • 📊 Приоритизировать: сегментация по риску для эффективного распределения ресурсов
  • Действовать проактивно: уведомления до того, как клиент ушёл

Ценность для бизнеса

Метрика До внедрения После внедрения
Точность определения оттока ~50% (случайно) 85%+
Стоимость удержания $50/клиент $15/клиент
Снижение оттока 20-30%

🏗️ Архитектура системы

┌─────────────────────────────────────────────────────────────────────────────┐
│                           CHURN PREDICTION SYSTEM                           │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────┐     ┌──────────────┐     ┌──────────────────────────┐    │
│  │  Streamlit   │────▶│   FastAPI    │────▶│      PostgreSQL          │    │
│  │     UI       │◀────│  ML Service  │◀────│  (predictions, metrics)  │    │
│  │  :8501       │     │    :8000     │     │       :5432              │    │
│  └──────────────┘     └──────┬───────┘     └──────────────────────────┘    │
│         │                    │                         ▲                    │
│         │                    ▼                         │                    │
│         │             ┌──────────────┐                 │                    │
│         │             │    Kafka     │                 │                    │
│         │             │   Broker     │                 │                    │
│         │             │    :9092     │                 │                    │
│         │             └──────┬───────┘                 │                    │
│         │                    │                         │                    │
│         │                    ▼                         │                    │
│         │             ┌──────────────┐                 │                    │
│         │             │   Kafka      │─────────────────┘                    │
│         │             │  Consumer    │                                      │
│         │             │  (async)     │                                      │
│         │             └──────────────┘                                      │
│         │                                                                   │
│         │             ┌──────────────┐     ┌──────────────────────────┐    │
│         └────────────▶│   Airflow    │────▶│   Feature Engineering    │    │
│                       │  Scheduler   │     │   Model Retraining       │    │
│                       │    :8080     │     │   Metrics Calculation    │    │
│                       └──────────────┘     └──────────────────────────┘    │
│                                                                             │
│         ┌──────────────┐                                                    │
│         │   Grafana    │◀───── Prometheus metrics + PostgreSQL data        │
│         │  Monitoring  │                                                    │
│         │    :3000     │                                                    │
│         └──────────────┘                                                    │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Компоненты

Компонент Технология Порт Описание
ML Service FastAPI + CatBoost 8000 REST API для инференса с OpenAPI документацией
UI Streamlit 8501 Веб-интерфейс для предсказаний и аналитики
Database PostgreSQL 5432 Хранение предсказаний, фичей, метрик
Message Broker Kafka 9092 Асинхронная обработка запросов
Scheduler Airflow 8080 ETL, расчёт фичей, переобучение модели
Monitoring Grafana + Prometheus 3000 Дашборды и алерты

🚀 Быстрый старт

Требования

  • Docker 20.10+
  • Docker Compose 2.0+
  • 8 GB RAM (минимум)
  • 10 GB свободного места

Запуск

# Клонирование репозитория
git clone https://github.com/your-username/churn-prediction-service.git
cd churn-prediction-service

# Запуск всех сервисов одной командой
docker-compose up --build

# Или в фоновом режиме
docker-compose up -d --build

Доступ к сервисам

Сервис URL Логин/Пароль
Streamlit UI http://localhost:8501
FastAPI Docs http://localhost:8000/docs
Airflow http://localhost:8080 airflow / airflow
Grafana http://localhost:3000 admin / admin
Kafka UI http://localhost:8082

📊 Используемые данные

Датасет: Telco Customer Churn

Признак Описание
tenure Срок подписки (месяцы)
MonthlyCharges Ежемесячный платёж
TotalCharges Общая сумма платежей
Contract Тип контракта (месяц/год/2 года)
PaymentMethod Способ оплаты
InternetService Тип интернет-сервиса
OnlineSecurity, TechSupport, ... Дополнительные услуги

Целевая переменная: Churn — уйдёт ли клиент (Yes/No)


🧠 ML Pipeline

Модель

  • Алгоритм: CatBoost Classifier
  • Метрики: ROC-AUC 0.84, PR-AUC 0.65, Precision@20% = 0.72

Фичи

  • Оригинальные признаки датасета
  • Агрегированные метрики (RFM-подобные)
  • Интерактивные признаки

Переобучение

  • Автоматическое по расписанию (Airflow DAG)
  • Hot-reload модели без перезапуска сервиса

🔧 API Reference

POST /predict

Синхронное предсказание для одного клиента.

curl -X POST "http://localhost:8000/predict" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "7590-VHVEG",
    "gender": "Female",
    "SeniorCitizen": 0,
    "Partner": "Yes",
    "Dependents": "No",
    "tenure": 1,
    "PhoneService": "No",
    "MultipleLines": "No phone service",
    "InternetService": "DSL",
    "OnlineSecurity": "No",
    "OnlineBackup": "Yes",
    "DeviceProtection": "No",
    "TechSupport": "No",
    "StreamingTV": "No",
    "StreamingMovies": "No",
    "Contract": "Month-to-month",
    "PaperlessBilling": "Yes",
    "PaymentMethod": "Electronic check",
    "MonthlyCharges": 29.85,
    "TotalCharges": 29.85
  }'

POST /predict/async

Асинхронное предсказание через Kafka.

GET /health

Проверка состояния сервиса.

GET /model/info

Информация о текущей модели.

Полная документация: http://localhost:8000/docs


📈 Мониторинг

Grafana Dashboards

  • Business Metrics: распределение скоров, % high-risk клиентов, тренды оттока
  • Technical Metrics: latency, throughput, error rate
  • Model Metrics: prediction drift, feature drift

Логирование

  • Структурированные логи в JSON формате
  • Централизованный сбор через Docker logs

📁 Структура проекта

churn-prediction-service/
├── docker-compose.yml          # Оркестрация всех сервисов
├── README.md                   # Документация
├── ONE_PAGER.md               # Презентация проекта
│
├── ml_service/                 # FastAPI ML сервис
│   ├── Dockerfile
│   ├── requirements.txt
│   ├── app/
│   │   ├── main.py            # FastAPI приложение
│   │   ├── model.py           # Загрузка и инференс модели
│   │   ├── schemas.py         # Pydantic схемы
│   │   └── database.py        # Подключение к PostgreSQL
│   └── models/                # Сохранённые модели
│
├── training/                   # Обучение модели (offline)
│   ├── train.py
│   ├── data/
│   └── notebooks/
│
├── kafka_consumer/             # Асинхронная обработка
│   ├── Dockerfile
│   ├── requirements.txt
│   └── consumer.py
│
├── streamlit_ui/               # Веб-интерфейс
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app.py
│
├── airflow/                    # ETL и scheduling
│   ├── Dockerfile
│   ├── dags/
│   │   ├── feature_engineering.py
│   │   ├── model_retraining.py
│   │   └── metrics_calculation.py
│   └── plugins/
│
├── postgres/                   # База данных
│   └── init.sql               # Инициализация схемы
│
├── grafana/                    # Мониторинг
│   ├── provisioning/
│   │   ├── dashboards/
│   │   └── datasources/
│   └── dashboards/
│
└── prometheus/                 # Сбор метрик
    └── prometheus.yml

✅ Реализованные требования

Базовые требования (6-7 баллов)

  • Публичный GitHub репозиторий
  • Новый датасет (не из ДЗ курса)
  • docker-compose.yml для запуска всех сервисов
  • README с бизнес-описанием и архитектурой
  • Работающий сервис

Продвинутые требования (8-10 баллов)

  • Расширенный мониторинг: Grafana с бизнес-метриками + логирование
  • Переобучение модели: Airflow DAG для обновления модели без остановки
  • Продвинутый UI: Аналитическая панель + OpenAPI документация
  • Kafka инференс: Асинхронная обработка через брокер сообщений
  • ETL с БД: Airflow для расчёта фичей и метрик по расписанию

🛠️ Разработка

# Локальный запуск для разработки
docker-compose -f docker-compose.dev.yml up

# Запуск тестов
docker-compose exec ml_service pytest

# Просмотр логов
docker-compose logs -f ml_service

📄 Лицензия

MIT License


👥 Авторы

Финальный проект курса MLOps, 2025

About

End-to-end ML service with Kafka, Airflow, PostgreSQL, Prometheus, Grafana and Docker Compose.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages