Темы 28–34: дисбаланс классов, кодирование категорий, калибровка вероятностей, кластеризация, снижение размерности, поиск аномалий и SHAP.
28. Дисбаланс классов
Важность на собеседовании: 9/10
█████████░🔥🔥🔥 Критично. Идёт в связке с метриками и почти всегда всплывает («у вас 1% положительных — что делаете?»). Копают средне-глубоко, но ждут практичный, а не книжный ответ. Знание того, что SMOTE — не серебряная пуля, отличает опытного кандидата.
Разбивка по подтемам:
| Подтема | Балл |
|---|---|
| Смена метрики и порога — первым делом | 10/10 |
| class_weight / scale_pos_weight | 9/10 |
| Ресэмплинг только внутри train-фолда | 9/10 |
| SMOTE и его ограничения | 7/10 |
| Почему после балансировки падает precision | 8/10 |
Порядок действий (именно в этом порядке — это и есть хороший ответ):
- Сначала метрика, потом всё остальное. Смените accuracy на PR-AUC / F-beta / recall@fixed-precision. Половина проблем «дисбаланса» — это на самом деле проблема неправильной метрики.
- Подвиньте порог. Модель, обученная как есть, часто ранжирует нормально — достаточно выбрать порог по стоимости ошибок. Это самое дешёвое решение и его почему-то забывают.
- Веса классов.
class_weight='balanced'в sklearn,scale_pos_weightв XGBoost,is_unbalance/class_weightsв LightGBM/CatBoost. Влияет на функцию потерь, не трогает данные. Обычно первый выбор. - Ресэмплинг. Undersampling мажоритарного класса (теряем данные, но быстро — хорошо при огромных выборках), oversampling миноритарного (риск переобучения на дубликатах).
- Синтетика: SMOTE и варианты (Borderline-SMOTE, ADASYN) — генерируют новые точки интерполяцией между соседями миноритарного класса.
- Смена постановки: при экстремальном дисбалансе (< 0.1%) имеет смысл перейти к детекции аномалий (обучаться только на нормальном классе).
Про SMOTE честно (это ценится). Исследования 2024–2026 показывают, что SMOTE далеко не всегда помогает: он может усиливать шум (синтетика строится в том числе от выбросов), плохо ведёт себя у границы распределения, а без подбора k асимптотически вырождается в простое копирование миноритарных объектов. На современных бустингах взвешивание классов и подбор порога чаще дают результат не хуже, при меньшей сложности. Правильная формулировка на собесе: «SMOTE пробую, но не первым, и обязательно сравниваю с class_weight по PR-AUC на честной валидации».
Критическая деталь. Ресэмплинг применяется только к обучающей части внутри фолда. Балансировка до сплита — это утечка, а балансировка валидации искажает оценку: валидация должна отражать реальное распределение в проде.
from imblearn.pipeline import Pipeline as ImbPipeline
from imblearn.over_sampling import SMOTE
pipe = ImbPipeline([("smote", SMOTE(random_state=42)), ("clf", LGBMClassifier())])
# SMOTE применяется только внутри train-части каждого фолда
Вопрос: После балансировки precision упал. Почему? — Балансировка меняет априорное распределение классов, и модель начинает предсказывать положительный класс чаще. Ранжирование могло даже улучшиться, а precision при фиксированном пороге 0.5 — просесть. Решение: либо перекалибровать вероятности обратно к реальной доле класса, либо просто оценивать по PR-AUC и подбирать порог заново.
29. Признаки и кодирование категорий
Важность на собеседовании: 7/10
███████░░░🔥🔥 Часто. Спрашивают в практическом ключе: «как закодируете категорию с 10 000 значений». Target encoding и его утечка — популярный вопрос средней глубины.
Кодирование категориальных признаков:
| Способ | Когда | Риск |
|---|---|---|
| One-hot | Малая кардинальность (< ~15), линейные модели | Взрыв размерности |
| Label / Ordinal | Есть естественный порядок; деревья | Для линейных моделей навязывает ложный порядок |
| Target (mean) encoding | Высокая кардинальность, бустинг | Утечка, если без OOF |
| Frequency / count | Частота сама по себе информативна | Коллизии разных категорий с одной частотой |
| Hashing trick | Огромная кардинальность, стриминг | Коллизии, потеря интерпретируемости |
| Embeddings | Нейросети, очень высокая кардинальность | Нужна нейросеть и данные |
| Встроенная обработка CatBoost | Категории любой кардинальности | — (лучший дефолт) |
Target encoding и его лечение. Кодируем категорию средним значением таргета по этой категории. Проблема: если считать среднее с участием текущей строки, признак содержит ответ → идеальная валидация и провал в проде. Лечения:
- Out-of-fold: для каждого фолда кодировка считается по остальным фолдам.
- Leave-one-out: вычитаем собственное значение.
- Сглаживание к глобальному среднему:
enc = (n·mean_cat + m·mean_global)/(n+m). Редкие категории «подтягиваются» к общему среднему — иначе категория с одним объектом получит кодировку, равную его таргету. - Ordered (CatBoost): кодировка по предшествующим объектам в случайной перестановке — устраняет утечку по построению.
Работа с пропусками: удаление (только если пропусков мало и они случайны), заполнение (медиана/мода/константа-маркер), индикатор пропуска отдельным признаком (сам факт пропуска часто информативен — «не заполнил поле» коррелирует с поведением), модельная импутация (KNNImputer, IterativeImputer). Бустинги умеют обрабатывать NaN нативно, и обычно это лучший вариант.
Выбросы: винзоризация (обрезка по перцентилям), логарифмирование скошенных величин, робастное масштабирование (по медиане и IQR). Деревьям выбросы во входных признаках почти безразличны (важен порядок), а вот выбросы в таргете ломают бустинг с MSE.
Масштабирование: обязательно для линейных моделей, SVM, kNN, нейросетей, PCA, k-means. Не нужно деревьям и их ансамблям.
Вопрос: Признак user_id с миллионом уникальных значений. Что делать? — В сыром виде почти всегда вредный признак: модель запомнит конкретных пользователей и не обобщится (плюс он не существует для новых пользователей — cold start). Лучше извлечь из него агрегаты (число заказов, средний чек, давность последней активности) с обязательной защитой от утечки во времени, либо обучить эмбеддинг, либо отказаться от него.
30. Калибровка вероятностей
Важность на собеседовании: 5/10
█████░░░░░🔥 Иногда, но 🔥🔥 в финтехе и рисковых задачах (Т-Банк, Сбер). Отличный способ выделиться: большинство кандидатов о калибровке не вспоминают вообще. Копают неглубоко — достаточно понимать, зачем и какими методами.
Проблема. Высокий ROC-AUC означает хорошее ранжирование, но ничего не говорит о том, что число 0.8 действительно означает «в 80% случаев это положительный класс». А там, где вероятность используется в расчёте (ожидаемые потери, ставка, цена страховки, порог по стоимости), нужна именно калибровка.
Кто как калиброван из коробки:
- Логистическая регрессия — хорошо (обучается на правильном правдоподобии).
- Нейросети — обычно переуверены (сдвиг к 0 и 1), особенно современные глубокие.
- SVM — не даёт вероятностей вообще.
- Наивный Байес — сильно переуверен из-за нарушенной независимости.
- Random Forest — недоуверен (усреднение сжимает предсказания к центру).
- Бустинг — зависит от потери и числа итераций; при долгом обучении становится переуверенным.
Диагностика: калибровочная кривая (reliability diagram) — разбить предсказания на бины и в каждом сравнить среднее предсказание с реальной долей положительных. Идеал — диагональ. Числовые метрики: Brier score = (1/n)Σ(p−y)² (чем меньше, тем лучше; сочетает калибровку и точность) и ECE (Expected Calibration Error).
Методы калибровки (обучаются на отдельной отложенной выборке, не на train):
- Platt scaling — логистическая регрессия поверх скоров. Работает при малых данных, предполагает сигмоидальную форму искажения.
- Isotonic regression — монотонная кусочно-постоянная подгонка. Гибче, но требует больше данных и склонна переобучаться.
- Temperature scaling — для нейросетей: делим логиты на обучаемый скаляр
T. Один параметр, не меняет ранжирование (и значит, не меняет AUC) — идеальный вариант для глубоких моделей.
from sklearn.calibration import CalibratedClassifierCV
cal = CalibratedClassifierCV(base_model, method="isotonic", cv=5).fit(X_train, y_train)
Вопрос: Меняет ли калибровка ROC-AUC? — Нет, если преобразование монотонно (а Platt, isotonic и temperature scaling монотонны): порядок объектов сохраняется, значит AUC неизменен. Меняются Brier score, log loss и осмысленность конкретного порога. Это хороший индикатор понимания разницы между ранжированием и калибровкой.
31. Кластеризация
Важность на собеседовании: 5/10
█████░░░░░🔥 Иногда. Спрашивают в блоке «а что вы знаете про unsupervised». Обычно достаточно k-means, DBSCAN и способа выбрать число кластеров. Глубоко не копают; иногда просят реализовать k-means кодом.
k-means. Итеративно: назначить точки ближайшим центроидам → пересчитать центроиды как средние. Минимизирует внутрикластерную сумму квадратов (inertia).
- Требует задать
kзаранее, чувствителен к инициализации (лечитсяk-means++), находит только выпуклые примерно сферические кластеры одинакового размера, чувствителен к масштабу и выбросам. - Сложность
O(n·k·d·итераций)— быстрый.
DBSCAN. Плотностный: кластер — это связная область высокой плотности (eps — радиус, min_samples — минимум точек в окрестности).
- Не требует
k, находит кластеры произвольной формы, явно помечает шум/выбросы. - Плохо работает при разной плотности кластеров и сложен в подборе
eps. Развитие — HDBSCAN, который снимает проблему единогоepsи на практике почти всегда лучше.
Иерархическая (агломеративная). Строит дендрограмму: последовательно склеивает ближайшие кластеры. Число кластеров выбирается визуально по срезу дендрограммы. O(n²)–O(n³) — только для небольших данных.
Прочее: GMM (мягкое отнесение, эллиптические кластеры, EM-алгоритм), спектральная кластеризация (через граф похожести).
Как выбрать число кластеров:
- Метод локтя — график inertia от k, ищем перегиб. Субъективен, не применим к DBSCAN.
- Silhouette score
∈[−1,1]— учитывает и компактность, и разделённость; выбирается k с максимумом. Работает для любых алгоритмов, включая DBSCAN. - Davies–Bouldin, Calinski–Harabasz.
- Внешний критерий: если кластеры нужны для бизнеса, проверяйте их осмысленность и полезность в даунстрим-задаче, а не только внутренние метрики.
Вопрос: Кластеры получились несбалансированные и один огромный. Что не так? — Скорее всего, данные не масштабированы (один признак доминирует), либо форма кластеров не сферическая (k-means не подходит — попробуйте DBSCAN/HDBSCAN), либо в данных действительно есть одна плотная масса и разреженная периферия. Ещё вариант — слишком высокая размерность: сначала снизить её (UMAP/PCA), потом кластеризовать.
32. Снижение размерности
Важность на собеседовании: 4/10
████░░░░░░🔥 Иногда. PCA уже разобран (тема 2). Здесь — t-SNE/UMAP, о которых спрашивают в контексте визуализации эмбеддингов. Глубина минимальная: главное — знать ограничения.
- PCA — линейное, сохраняет глобальную структуру и дисперсию, быстрое, обратимое. Дефолт для препроцессинга.
- t-SNE — нелинейное, сохраняет локальную структуру. Только для визуализации: нельзя применять к новым данным (нет
transform), расстояния между кластерами на графике не имеют смысла, размеры кластеров не отражают реальность, результат зависит отperplexityи сида. - UMAP — быстрее t-SNE, лучше сохраняет глобальную структуру, имеет
transformдля новых точек. Практический дефолт для визуализации эмбеддингов. - Автоэнкодеры — нелинейное сжатие нейросетью; узкое горлышко = представление.
Практика в NLP: для визуализации эмбеддингов документов — UMAP до 2D, поверх — HDBSCAN для кластеризации (связка UMAP+HDBSCAN лежит в основе BERTopic).
Вопрос: На t-SNE-графике два кластера далеко друг от друга. Значит ли это, что они семантически далеки? — Нет. t-SNE не сохраняет глобальные расстояния, взаимное расположение кластеров на нём произвольно. Судить о близости можно только по исходным расстояниям в пространстве эмбеддингов.
33. Поиск аномалий
Важность на собеседовании: 3/10
███░░░░░░░⚪ Редко для NLP-ролей, 🔥 если в вакансии есть антифрод/мониторинг. Хватит списка методов и понимания, когда аномалии лучше классификации.
Когда применять вместо классификации: размеченных аномалий почти нет, они разнородны, и новые типы отличаются от всех виденных ранее.
Методы:
- Статистические: z-score, IQR, доверительные интервалы. Работают на одномерных данных.
- Isolation Forest. Строит случайные деревья; аномалия изолируется за меньшее число разбиений, потому что она «в стороне». Быстрый (
O(n log n)), работает в высоких размерностях — практический дефолт. - LOF (Local Outlier Factor). Сравнивает локальную плотность точки с плотностью её соседей. Ловит аномалии относительно локального контекста.
- One-Class SVM. Строит границу вокруг «нормальных» данных. Медленный, чувствителен к параметрам.
- Автоэнкодер. Обучается восстанавливать нормальные данные; большая ошибка реконструкции = аномалия. Хорош для сложных данных.
Метрики. Обычные метрики классификации на редком классе (PR-AUC), плюс обязательно оценка на реальной пропускной способности: «сколько алертов в день выдержит команда».
Вопрос: Как выбрать порог, если разметки нет вообще? — Через операционное ограничение: определить, сколько кейсов команда способна проверить (например, 100 в день), взять топ-100 по аномальности и постепенно накопить разметку от проверяющих. Дальше — обучить супервизорную модель на накопленных метках.
34. Интерпретируемость моделей
Важность на собеседовании: 7/10
███████░░░🔥🔥 Часто. В 2026 интервьюеры целенаправленно проверяют, умеете ли вы объяснить модель бизнесу. SHAP спрашивают чаще всего; ловушка со встроенной важностью деревьев (тема 23) — популярный уточняющий вопрос.
Зачем. Регуляторные требования (кредитный скоринг обязан объяснять отказ), отладка (поймать утечку по подозрительно важному признаку), доверие бизнеса, поиск сдвигов в данных.
Глобальная интерпретация (что модель делает в целом):
- Permutation importance. Перемешиваем значения одного признака на отложенной выборке и смотрим, насколько упало качество. Модельно-независим, честен (считается на не виденных данных). Недостаток: при коррелирующих признаках занижает важность обоих (модель компенсирует через второй).
- Встроенная важность деревьев (MDI). Быстро, но смещена к высококардинальным и непрерывным признакам и считается на train. Использовать только как грубый ориентир.
- PDP (Partial Dependence Plot) — средний эффект признака на предсказание при усреднении остальных. Ломается при сильных корреляциях (усредняет по нереалистичным комбинациям). ICE-кривые показывают эффект для каждого объекта отдельно и вскрывают гетерогенность, которую PDP усредняет.
Локальная интерпретация (почему именно этот объект):
- SHAP (SHapley Additive exPlanations). Из кооперативной теории игр: вклад признака = его средний предельный вклад по всем коалициям признаков. Свойства: аддитивность (
сумма SHAP + базовое значение = предсказание), согласованность, работает и локально, и глобально (усреднение |SHAP| даёт глобальный рейтинг). TreeSHAP для деревьев считается точно и быстро; KernelSHAP — модельно-независим, но дорог. - LIME. Локальная линейная аппроксимация вокруг объекта. Быстрее, но менее стабилен: два запуска могут дать разные объяснения.
import shap
explainer = shap.TreeExplainer(model)
sv = explainer.shap_values(X_val)
shap.summary_plot(sv, X_val) # глобально: важность + направление влияния
shap.force_plot(explainer.expected_value, sv[0], X_val.iloc[0]) # один объект
Важная оговорка (уровень senior). SHAP объясняет модель, а не реальный мир. Высокий SHAP не означает причинность: признак может быть прокси другого фактора. Путать интерпретацию модели с причинно-следственным выводом — типичная ошибка, и интервьюеры это проверяют.
Вопрос: Как SHAP помогает найти утечку данных? — Если один признак имеет аномально доминирующий вклад и при этом логически «слишком хорош» (например, days_to_close в задаче предсказания закрытия сделки), это почти наверняка утечка. SHAP-график — самый быстрый способ увидеть такое.
Часть 7 из 17 конспекта для подготовки к собеседованиям на NLP/LLM-разработчика. Остальные части — в разделе «Собесы».
Оставить отзыв
Комментарии
Загрузка комментариев...
★ Оставить отзыв