Расскажи про фактор в модели, оказавший наибольшее влияние
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Фактор с наибольшим влиянием на модель: Анализ интенсивности обращений в поддержку
Я расскажу о проекте, где один признак радикально переменил результат предсказания. Это было при разработке модели чёрна (оттока) клиентов в телеком-компании.
Контекст проекта
Мы строили модель для предсказания, какой клиент уйдёт в течение 30 дней. В модели были обычные признаки:
- Средний чек (среднее потребление)
- Возраст аккаунта
- Количество использованных сервисов
- Географическое местоположение
- История платежей
- Net Promoter Score (NPS)
Модель давала AUC ~0.72, что хорошо, но недостаточно для бизнес-решений. Нужно было выше 0.80+.
Открытие: признак обращений в поддержку
При анализе данных обращений в call-центр я заметил интересный паттерн:
SELECT
customer_id,
churn_flag,
COUNT(*) as support_calls_30d,
AVG(EXTRACT(DAY FROM (resolved_at - created_at))) as avg_resolution_days
FROM support_tickets
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY customer_id, churn_flag
Когда я посмотрел на распределение количества звонков для ушедших и активных клиентов, паттерн был очень ясным:
| Группа | Средн. звонков | Процент оттока |
|---|---|---|
| 0 звонков | 0 | 2% |
| 1-2 звонка | 1.5 | 3% |
| 3-5 звонков | 4 | 8% |
| 6-10 звонков | 8 | 18% |
| 11+ звонков | 15 | 52% |
Клиенты, звонящие в поддержку 11+ раз в месяц, уходили в 26 раз чаще, чем те, кто не звонит вообще!
Почему этот фактор столь мощный
Причина 1: Это индикатор проблем, которые клиент не может решить сам
Если клиент звонит в поддержку, это значит:
- У него есть проблема с сервисом
- Сервис недостаточно интуитивен
- Качество услуг снизилось
- Он готов потратить время на решение
Причина 2: Это поведенческий сигнал, а не шум
Этот признак отражает реальное действие клиента, указывающее на дискомфорт.
Включение в модель
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
# Признак количество звонков
df['support_calls_30d'] = df.groupby('customer_id')['support_ticket_id'].transform('count')
# Категоричные бины
df['support_calls_category'] = pd.cut(
df['support_calls_30d'],
bins=[-1, 0, 2, 5, 10, np.inf],
labels=['none', 'low', 'medium', 'high', 'critical']
)
# Производные признаки
df['support_calls_trend'] = (
df.groupby('customer_id')['support_calls_30d']
.shift(1) - df['support_calls_30d']
)
df['days_since_last_call'] = (
df['current_date'] - df.groupby('customer_id')['last_support_call_date'].transform('max')
).dt.days
features = [
'support_calls_30d',
'support_calls_category',
'support_calls_trend',
'days_since_last_call',
'avg_call_duration_minutes',
'support_satisfaction_score',
]
X = df[features]
y = df['churn_flag']
model = GradientBoostingClassifier(n_estimators=200, max_depth=5)
model.fit(X, y)
Результаты анализа важности
Топ признаки в итоговой модели:
| Признак | Важность |
|---|---|
| support_calls_30d | 0.242 |
| days_since_last_call | 0.156 |
| support_calls_category | 0.134 |
| avg_monthly_spend | 0.098 |
| support_satisfaction_score | 0.089 |
support_calls_30d объяснял 24% дисперсии целевой переменной — невероятно высокий показатель!
Влияние на качество модели
До добавления признака: AUC = 0.72 После добавления: AUC = 0.84
Прирост на 12 п.п. — огромный скачок!
Интерпретация для бизнеса
Этот результат раскрыл критический инсайт: клиенты, часто обращающиеся в поддержку, это группа с нерешёнными проблемами, которые создают основу для оттока.
На основе этого мы разработали две стратегии:
1. Проактивная помощь
- При 2-3 звонках за неделю запускается программа VIP-поддержки
- Выделяется специалист для отслеживания решения
2. Улучшение самообслуживания
- Анализ темы звонков создание FAQ и видео
- Снижение количества повторяющихся вопросов
Практический результат
После внедрения модели и intervention программ:
- Churn rate снизился на 3.2 п.п. (с 12% до 8.8%)
- Удержано 18,000+ клиентов в год
- LTV увеличилась на 28%
- Среднее количество звонков на клиента снизилось с 8.2 до 4.6
Главный вывод
В машинном обучении часто думают, что нужны сложные признаки. Но иногда самый мощный признак — это просто количество событий, отражающих реальное поведение клиента.
Этот проект научил меня:
- Domain knowledge больше, чем волшебные фичи
- EDA стоит на первом месте перед моделированием
- Простые признаки часто мощнее сложных
- Результаты модели должны быть actionable — если модель показывает проблему, нужна стратегия её решения