К какой задаче относится отток пользователей: регрессии, кластеризации или классификации
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
К какой задаче относится предсказание оттока пользователей?
Предсказание оттока пользователей (churn prediction) — это задача бинарной классификации. Давайте разберёмся почему и как это решается в practice.
Почему это классификация, а не регрессия или кластеризация?
Целевая переменная бинарна:
- Пользователь либо уходит (churn = 1), либо остаётся (churn = 0)
- Это дискретная, а не непрерывная переменная
- Мы предсказываем класс (категорию), а не число
Другие типы задач:
- Регрессия — предсказывается непрерывное значение (например, lifetime value клиента в деньгах)
- Кластеризация — неконтролируемое обучение без целевой переменной (например, сегментация клиентов)
Формулировка задачи классификации
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score
# Пример подготовки данных для churn prediction
df = pd.read_csv(customer_data.csv)
# Целевая переменная: бинарная классификация
# Значения: 0 (остался), 1 (ушёл)
print(df[churn].value_counts())
# Output:
# 0 8000
# 1 2000
# Разделяем на признаки и целевую переменную
X = df.drop([churn, customer_id], axis=1)
y = df[churn] # бинарная целевая переменная
# Разделяем на train/test
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Шкалирование
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Обучаем классификатор
model = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
model.fit(X_train_scaled, y_train)
# Предсказания
y_pred = model.predict(X_test_scaled) # Классы: 0 или 1
y_pred_proba = model.predict_proba(X_test_scaled)[:, 1] # Вероятность чёрна (0 до 1)
# Оценка качества
print("Classification Report:")
print(classification_report(y_test, y_pred))
print(f"\nROC AUC: {roc_auc_score(y_test, y_pred_proba):.4f}")
Ключевые особенности churn prediction как классификации
1. Интерпретируемость Модель выдаёт:
- Класс: пользователь уходит или нет (0/1)
- Вероятность: как уверена модель в своём предсказании (0.0 до 1.0)
Вероятность 0.8 означает, что модель на 80% уверена в оттоке пользователя.
2. Дисбаланс классов Обычно количество ушедших пользователей (положительный класс) меньше:
- 80% остались, 20% ушли
- 95% остались, 5% ушли
Нужно учитывать дисбаланс при обучении:
# Способ 1: Взвешивание классов
model = RandomForestClassifier(
class_weight=balanced, # автоматически взвешивает редкий класс
n_estimators=100,
random_state=42
)
# Способ 2: SMOTE (oversample редкого класса)
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
model.fit(X_resampled, y_resampled)
# Способ 3: Threshold adjustment (настройка порога вероятности)
# Вместо стандартного 0.5, используем 0.3 для более чувствительной модели
y_pred_custom = (y_pred_proba > 0.3).astype(int)
3. Выбор метрик Обычная accuracy неинформативна при дисбалансе. Используем:
- Precision: из предсказанных уходящих, сколько реально ушли
- Recall (чувствительность): из реально уходящих, сколько модель поймала
- F1-score: гармоничное среднее precision и recall
- ROC AUC: как хорошо модель отделяет классы при разных порогах
from sklearn.metrics import precision_recall_curve, auc
# PR-кривая часто более информативна при дисбалансе
precision, recall, _ = precision_recall_curve(y_test, y_pred_proba)
pr_auc = auc(recall, precision)
print(f"PR AUC: {pr_auc:.4f}")
Почему не регрессия?
Теоретически можно предсказать вероятность оттока как регрессию (непрерывное значение 0-1), но:
- Классификация более естественна: модель оптимизируется именно под разделение на два класса
- Интерпретируемость: прямое предсказание 0/1 лучше воспринимается
- Метрики: classification metrics (precision, recall, F1) специально разработаны для таких задач
Почему не кластеризация?
Кластеризация — это unsupervised learning:
- Нет целевой переменной (не знаем, кто ушёл, кто нет)
- Находим группы схожих пользователей
- Не предсказываем индивидуальный результат
Кластеризация может быть полезна как предварительный анализ перед классификацией, но это не основной метод для churn prediction.
Практический workflow
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
print(f"True Negatives: {cm[0,0]}")
print(f"False Positives: {cm[0,1]}")
print(f"False Negatives: {cm[1,0]}")
print(f"True Positives: {cm[1,1]}")
# Интерпретация:
# TN: Модель предсказала "остаток", он реально остался ✓
# FP: Модель предсказала "уход", он остался ✗
# FN: Модель предсказала "остаток", он ушёл ✗
# TP: Модель предсказала "уход", он реально ушёл ✓
Выводы
- Churn prediction = бинарная классификация с целевой переменной {0, 1}
- Не регрессия, потому что целевая переменная дискретна
- Не кластеризация, потому что есть supervised целевая переменная
- Необходимо учитывать дисбаланс классов в данных
- Используйте правильные метрики (ROC AUC, F1, PR AUC), а не simple accuracy