Расскажи про самый неуспешный рабочий ML-проект

Ответ

Один из проектов, который не достиг ожидаемых бизнес-результатов, — это предсказание оттока клиентов для телеком-оператора. Я столкнулся с несколькими фундаментальными проблемами:

  1. Качество данных: Исторические данные были сильно неполными (более 30% пропусков в ключевых полях), а целевая переменная (факт ухода) определялась менеджерами субъективно, без четких правил.
  2. Переобучение: Модель CatBoost показывала accuracy около 95% на кросс-валидации, но в production её precision упал до 60%. Это происходило потому, что модель научилась угадывать простые сезонные паттерны, но не выявила реальные причины оттока.
  3. Временной bias: Мы не учли временную природу данных при разбиении. В тест попадали данные из того же временного периода, что и в train, что и давало завышенные метрики.

Извлеченные уроки:

  • Валидация: Для подобных задач необходимо использовать временные срезы (time-series split), а не случайное разбиение.
  • Согласование метрик: Следует сразу согласовывать с бизнесом, какие метрики (precision, recall, F1) критичны, а не оптимизировать просто accuracy.
  • Работа с данными: Нужно больше времени уделять EDA и очистке данных на раннем этапе, а также формализации процесса разметки.

Пример ошибочного подхода к разбиению данных для временного ряда:

# НЕВЕРНО для данных с временной зависимостью
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Ответ 18+ 🔞

А, ну вот, вспомнил один проект, который накрылся медным тазом, ёпта. Предсказывали отток клиентов для одного телекома. В итоге — пизда рулю, и всё из-за классических косяков, которые в учебниках пишут, а мы, как мудя, на них наступили.

Первая беда — качество данных. Исторические данные были такие дырявые, что хоть в них рыбу лови. Больше 30% пропусков в ключевых полях, а целевая переменная — факт ухода клиента — это вообще отдельная песня. Её менеджеры на глазок ставили, без чётких правил. Подозрение ебать чувствую, что один чувак мог клиента в отток записать просто потому, что тот ему нахамил, а другой — нет. Доверия ебать ноль.

Вторая проблема — переобучение. CatBoost у нас на кросс-валидации accuracy показывал под 95%, прям красота. Мы уже предвкушали, как премии получим. А в продакшене его precision рухнул до 60%, как подкошенный. Модель-то оказалась хитрой жопой: она не причины оттока выявила, а просто угадывала сезонные паттерны, которые в исторических данных были. На новых данных эти паттерны уже не работали. Сам от себя охуел, когда это осознал.

И главный гвоздь в крышку гроба — временной bias. Мы же данные разбили как обычно, случайно. А в тест попали данные из того же временного периода, что и в тренировочную выборку. Вот модель и научилась угадывать именно этот период, а не будущее. Это как учиться водить на одной и той же пустой парковке, а потом выехать в час пик в центр — будет вам хиросима.

Что я вынес из этого, кроме разочарования?

  • Валидация: Для таких штук нужно временные срезы использовать, а не тупо train_test_split. Надо имитировать реальность: учиться на прошлом, тестироваться на будущем.
  • Согласование метрик: Надо было сразу с бизнесом выяснить, что им важнее — precision (чтобы не дергать лишних клиентов) или recall (чтобы никого не упустить). А мы просто accuracy гоняли, как дураки.
  • Работа с данными: Половину времени проекта нужно тратить на EDA и выбивание у бизнеса чётких правил разметки. Иначе получится манда с ушами, а не модель.

Вот смотри, как мы изначально неправильно данные делили, из-за чего всё и пошло по пизде:

# НЕВЕРНО для данных с временной зависимостью
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Вот так делать — это чих-пых тебя в сраку. Для временных рядов это смерть. Надо было через TimeSeriesSplit или вручную по датам резать. Учись на наших граблях, а то тоже будешь потом терпения ноль ебать.