← Назад к вопросам

К какой задаче относится отток пользователей: регрессии, кластеризации или классификации

1.3 Junior🔥 201 комментариев
#Машинное обучение#Метрики и оценка моделей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

К какой задаче относится предсказание оттока пользователей?

Предсказание оттока пользователей (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: Модель предсказала "уход", он реально ушёл ✓

Выводы

  1. Churn prediction = бинарная классификация с целевой переменной {0, 1}
  2. Не регрессия, потому что целевая переменная дискретна
  3. Не кластеризация, потому что есть supervised целевая переменная
  4. Необходимо учитывать дисбаланс классов в данных
  5. Используйте правильные метрики (ROC AUC, F1, PR AUC), а не simple accuracy