Цель статьи – подробно рассмотреть‚ как построить модель предсказания дохода клиента‚ какие данные и признаки нужны‚ какие алгоритмы работают лучше всего в реальном бизнесе‚ как оценить качество модели и интегрировать её в продакшн.
Что такое доход клиента и зачем его прогнозировать?
Customer Lifetime Value (CLV) – это суммарный ожидаемый доход‚ который клиент принесёт компании за всё время своего взаимодействия. Прогнозирование CLV позволяет:
- Сегментировать клиентскую базу и выделять «золотых» клиентов.
- Оптимизировать маркетинговый бюджет (CAC vs. CLV).
- Предотвратить отток‚ предлагая персонализированные акции.
- Планировать запасы и прогнозировать выручку.
В статье на Хабре показано‚ как компании используют CatBoostRegressor для построения CLV‑моделей‚ а в проектах Сбербанка такие модели позволяют предсказывать выручку всех компаний‑клиентов России.
Формальная постановка задачи
Задача формулируется как регрессионная: для каждого клиента i необходимо предсказать будущий суммарный доход Y_i за фиксированный горизонт (например‚ 12 месяцев). Обучающая выборка состоит из:
- Исторических транзакций (сумма‚ количество‚ дата).
- Демографических и поведенческих признаков.
- Информации о взаимодействиях с маркетингом (рассылки‚ акции).
Сбор и подготовка данных
3.1 Источники данных
- CRM‑система (история покупок‚ даты‚ суммы).
- Система аналитики (события на сайте‚ мобильном приложении).
- Внешние открытые данные (доходы регионов‚ индекс потребительских цен).
3.2 Предобработка
Для каждой клиентской единицы необходимо построить «таблицу фактов»‚ агрегировав транзакции за выбранный период.
import pandas as pd
import numpy as np
orders = pd.read_csv('orders.csv') # order_id‚ client_id‚ amount‚ order_date
clients = pd.read_csv('clients.csv') # client_id‚ gender‚ age‚ city‚ registration_date
last_date = pd.to_datetime('2026-04-28')
start_date = last_date ― pd.DateOffset(months=12)
mask = (orders['order_date'] >= start_date) & (orders['order_date'] <= last_date)
orders_12m = orders.loc[mask]
revenue_12m = orders_12m.groupby('client_id')['amount'].sum.reset_index
revenue_12m.rename(columns={'amount':'revenue_12m'}‚ inplace=True)
data = clients.merge(revenue_12m‚ on='client_id'‚ how='left')
data['revenue_12m'].fillna(0‚ inplace=True)
3.3 Признаки (features)
Ниже перечислены типичные группы признаков‚ которые повышают точность модели:
- Транзакционные: средний чек‚ частота покупок‚ RFM‑метрики (Recency‚ Frequency‚ Monetary).
- Поведенческие: количество визитов‚ среднее время на сайте‚ каналы привлечения.
- Демографические: возраст‚ пол‚ регион‚ уровень дохода (по открытым данным).
- Маркетинговые: количество полученных рассылок‚ отклики на акции‚ статус VIP‑программы.
- Исторические метрики оттока: вероятность churn‚ полученная из отдельной модели.
Выбор и обучение модели
4.1 Почему CatBoost?
В статье «Использование ML для прогнозирования CLTV» упоминаются две модели: CatBoostRegressor и CatBoostClassifier. CatBoost обладает:
- Поддержкой категориальных признаков без необходимости one‑hot‑encoding.
- Устойчивостью к переобучению благодаря встроенной регуляризации.
- Высокой скоростью обучения на больших датасетах.
4.2 Пример кода обучения
from catboost import CatBoostRegressor‚ Pool
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error‚ r2_score
y = data['revenue_12m']
X = data.drop(columns=['client_id'‚ 'revenue_12m'])
cat_features = ['gender'‚ 'city'‚ 'vip_status']
X_train‚ X_test‚ y_train‚ y_test = train_test_split(
X‚ y‚ test_size=0.2‚ random_state=42
)
train_pool = Pool(X_train‚ y_train‚ cat_features=cat_features)
test_pool = Pool(X_test‚ y_test‚ cat_features=cat_features)
model = CatBoostRegressor(
iterations=800‚
depth=8‚
learning_rate=0.05‚
loss_function='RMSE'‚
eval_metric='MAE'‚
random_seed=42‚
verbose=100
)
model.fit(train_pool‚ eval_set=test_pool‚ early_stopping_rounds=50)
preds = model.predict(X_test)
mae = mean_absolute_error(y_test‚ preds)
r2 = r2_score(y_test‚ preds)
print(f'MAE = {mae:.2f}‚ R2 = {r2:.4f}')
4.3 Альтернативные алгоритмы
Если данных очень много (миллионы записей) или требуется интерпретируемость‚ можно сравнить:
- LightGBM – аналогичный градиентный бустинг‚ быстрее на больших наборах.
- XGBoost – проверенный «рабочий» вариант.
- Linear regression с регуляризацией (Ridge/Lasso) – простая базовая модель.
- Neural networks (TabNet‚ DeepFM) – при наличии сложных нелинейных взаимодействий.
Оценка модели в бизнес‑контексте
5.1 Метрики
- MAE (Mean Absolute Error) – легко интерпретировать в денежном выражении.
- RMSE – штрафует большие ошибки сильнее.
- R² – доля объясненной дисперсии.
- Profit‑Weighted Accuracy – метрика‚ учитывающая‚ сколько прибыли принесёт правильно предсказанный клиент (см. Алексея Чернобровова о переводе ошибок в деньги).
5.2 Пример расчёта финансового эффекта
# Предположим‚ что маржа на каждый рубль дохода = 30%
margin = 0.30
financial_loss = mae * margin
print(f'Ожидаемые потери в марже: {financial_loss:‚.0f} ₽')
Если MAE = 1200 ₽‚ маржа 30 %‚ то потери составят ≈ 360 000 ₽ за 300 предсказанных клиентов. Снижение MAE на 200 ₽ экономит 60 000 ₽.
Интеграция модели в продакшн
6.1 Сервис предсказаний
Для быстрого доступа к предсказаниям удобно развернуть модель как REST‑API. Ниже – минимальный пример на Flask:
from flask import Flask‚ request‚ jsonify
import joblib
import pandas as pd
app = Flask(__name__)
model = joblib.load('catboost_clv.pkl')
cat_features = ['gender'‚ 'city'‚ 'vip_status']
@app.route('/predict'‚ methods=['POST'])
def predict:
data = request.get_json
df = pd.DataFrame(data)
# Приведём типы‚ если нужно
preds = model.predict(df)
return jsonify({'predicted_clv': preds.tolist})
if __name__ == '__main__':
app.run(host='0.0.0.0'‚ port=8080)
6.2 Обновление модели
Модели CLV требуют регулярного переобучения (раз в квартал или по мере появления новых данных). Для автоматизации используют:
- CI/CD‑pipeline (GitHub Actions‚ GitLab CI).
- Платформы MLOps: MLflow‚ Kubeflow‚ Azure ML‚ Sber AI Platform.
- Мониторинг «дрейфа» данных – сравнение распределения новых признаков с обучающим набором.
Практические рекомендации и типичные подводные камни
- Качество данных важнее модели. Ошибки в транзакционных логах приводят к смещённым предсказаниям.
- Не забывайте про сезонность. При агрегировании за 12 мес. учитывайте пики (например‚ новогодние продажи).
- Сбалансируйте целевые метрики. Слишком сильный фокус на MAE может игнорировать редких‚ но очень прибыльных клиентов.
- Интерпретируемость. Для бизнес‑руководства часто важнее знать‚ какие признаки влияют на CLV. Используйте SHAP‑значения.
- Этичность. При работе с персональными данными соблюдайте GDPR/ФЗ‑152‚ а также не используйте признаки‚ которые могут вести к дискриминации;
Кейсы из реального мира
- Сбербанк построил ML‑модель‚ способную предсказывать выручку любой компании‑клиента‚ что позволило банку предлагать более точные кредитные линии.
- Ozon использует предсказание спроса и CLV для оптимизации закупок‚ сокращая издержки на хранение товаров.
- Mindbox в гайд по LTV демонстрирует‚ как совместно использовать классификатор оттока и регрессионную модель CLV для персонализированных рекламных кампаний.
Модель предсказания дохода клиента – мощный инструмент‚ который объединяет данные о покупках‚ поведении и демографии в единую оценку будущей ценности. При правильной подготовке данных‚ выборе алгоритма (CatBoost – один из лучших вариантов) и оценке бизнес‑эффекта‚ такая модель позволяет:
- Сократить отток и повысить LTV.
- Оптимизировать рекламные бюджеты.
- Увеличить общую прибыльность компании.
Не забывайте регулярно переобучать модель‚ отслеживать дрейф данных и поддерживать прозрачность предсказаний. Тогда ML‑модель станет надёжным конкурентным преимуществом.
Дата публикации: