Оценка вероятности захода пользователя в приложение — это задача классификации или регрессии?

«Оценка вероятности захода пользователя в приложение — это задача классификации или регрессии?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это задача бинарной классификации, но с важным нюансом: мы часто хотим получить не просто класс (зашел/не зашел), а вероятность принадлежности к классу.

Почему классификация? Целевая переменная — дискретная (бинарная): 1 (пользователь зашел) или 0 (не зашел). Почему важна вероятность? Для бизнеса часто критично ранжировать пользователей по этой вероятности, чтобы, например, показывать таргетированные предложения самым "горячим" из них.

Практический пример из моего опыта (прогноз клика по рекламе):

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import roc_auc_score, log_loss

# Допустим, у нас есть лог действий пользователей
# Цель — predict_proba для события 'app_launch'
df['target'] = (df['event'] == 'app_launch').astype(int)
features = df[['session_count', 'time_since_last_visit', 'os', 'campaign_id']]
# ... (кодирование категориальных признаков)

X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, stratify=target)

# Используем алгоритм, который дает хорошо калиброванные вероятности
model = GradientBoostingClassifier(n_estimators=200, learning_rate=0.05)
# Иногда применяю калибровку, особенно для SVM или нейросетей
calibrated_model = CalibratedClassifierCV(model, method='isotonic', cv=5)
calibrated_model.fit(X_train, y_train)

# Получаем вероятности
probabilities = calibrated_model.predict_proba(X_test)[:, 1]

# Оцениваем качество вероятностных предсказаний
print(f"ROC-AUC: {roc_auc_score(y_test, probabilities):.4f}")  # Оценивает ранжирование
print(f"Log Loss: {log_loss(y_test, probabilities):.4f}")      # Оценивает "уверенность" модели

# Бизнес-метрика: доля пользователей в топ-10% по предсказанной вероятности, которые действительно зашли
top_10_idx = probabilities.argsort()[-len(probabilities)//10:]
conversion_in_top_10 = y_test.iloc[top_10_idx].mean()
print(f"Conversion in top-10%: {conversion_in_top_10:.1%}")

Таким образом, мы решаем задачу классификации, но используем метрики и подходы, ориентированные на работу с вероятностями.