Перед нами собеседование Data Scientist в Т-Банк. Здесь проверяют классическое машинное обучение, метрики и поиск ошибок в PyTorch. Мы оставляем вопросы и правильные ответы без личных данных участников.
Как строится дерево решений?
Короткий ответ: дерево рекурсивно делит выборку и на каждом шаге жадно выбирает признак и порог, которые сильнее всего уменьшают неоднородность целевой переменной.
В классификации качество разбиения часто измеряют через индекс Джини или энтропию. В регрессии можно уменьшать среднеквадратичную или абсолютную ошибку. Это не градиентный спуск: алгоритм перебирает допустимые разбиения и выбирает лучшее на текущем шаге.

Каждый узел задаёт проверку признака, ветви ведут к следующему условию, а листья содержат итоговый прогноз. Источник: scikit-learn.
Рост останавливают по максимальной глубине, минимальному числу объектов в листе или минимальному улучшению критерия. Без ограничений дерево легко запоминает обучающую выборку. Наглядный пример с полной структурой дерева есть в официальной галерее scikit-learn.
Как работать с категориальными признаками?
Короткий ответ: сначала нужно понять, упорядочены ли категории и сколько у них уникальных значений, затем выбрать кодирование под модель и защититься от утечки целевой переменной.
Для цвета или города обычные числа создадут ложный порядок. One-hot encoding делает отдельный бинарный столбец для каждой категории и хорошо подходит при умеренном числе значений. При высокой мощности признака используют частотное кодирование, хеширование или алгоритмы с нативной поддержкой категорий.
Target encoding опирается на целевую переменную, поэтому статистику нельзя считать по всему датасету. Нужны разбиение, сглаживание и вычисление без доступа к ответу текущего объекта. На новых данных нужно обработать неизвестную категорию. Примеры есть в документации scikit-learn.
Как обучается случайный лес?
Короткий ответ: случайный лес независимо обучает много глубоких деревьев на bootstrap-выборках, а при каждом разбиении рассматривает случайное подмножество признаков. Затем ответы усредняются или выбираются голосованием.
Bootstrap означает выбор объектов с возвращением: один объект может встретиться несколько раз, другой — не попасть в выборку конкретного дерева. Случайные признаки делают деревья менее похожими друг на друга. Усреднение таких моделей снижает дисперсию и делает прогноз устойчивее одного глубокого дерева.
Важно назвать обе части случайности: по объектам и по признакам.
Как оценивать важность признаков в случайном лесе?
Короткий ответ: встроенная важность суммирует взвешенное уменьшение неоднородности от разбиений по признаку и усредняет результат по деревьям. Но её нужно проверять другим методом.
Такая оценка может завышать роль признаков с большим числом вариантов, а связанные признаки способны делить важность между собой. Поэтому полезно считать permutation importance на отложенных данных: перемешать один столбец и измерить падение качества.
Если после перемешивания метрика почти не изменилась, модель мало зависит от признака в текущем контексте. Оба подхода и их ограничения показаны в примере scikit-learn.
Типичная ошибка. Выдать встроенную важность признаков за доказательство причинного влияния или безусловно удалить признаки с малой оценкой. Связанные переменные, утечка и способ кодирования способны изменить картину.
Как лучше. Считайте важность диагностикой модели: проверьте её на отложенных данных другим методом, посмотрите устойчивость результата и только затем формулируйте вывод о поведении модели.
Чем бустинг отличается от случайного леса и что будет при удалении дерева?
Короткий ответ: деревья случайного леса независимы и усредняются, а бустинг последовательно добавляет модели, которые улучшают текущий ансамбль.
В градиентном бустинге новая модель приближает отрицательный градиент функции потерь. Часто используют неглубокие деревья и небольшой темп обучения. Лес снижает дисперсию, а бустинг последовательно уменьшает ошибку.
Удаление одного дерева из большого леса обычно слабо меняет средний прогноз, но это не гарантия. В обученном бустинге удаление любого дерева меняет сумму на его вклад. Утверждение «первое дерево разрушит модель, а последнее ничего не изменит» слишком категорично: эффект нужно измерять. Устройство ансамблей разобрано в руководстве scikit-learn.
Какие метрики бинарной классификации выбрать и как объяснить ROC-AUC?
Короткий ответ: метрику выбирают по цене ложноположительной и ложноотрицательной ошибки. Accuracy показывает общую долю правильных ответов, precision — точность положительных сигналов, recall — полноту найденных положительных объектов.
ROC-AUC оценивает ранжирование без одного фиксированного порога. Его можно объяснить как вероятность того, что случайный положительный объект получит более высокий скор, чем случайный отрицательный. Для бизнеса этого определения мало: нужно добавить, какое действие принимается по прогнозу и на каком рабочем пороге.
При дисбалансе классов стоит дополнительно смотреть на precision, recall и PR-AUC. Определения собраны в руководстве scikit-learn.
Почему F1 использует гармоническое среднее?
Короткий ответ: гармоническое среднее резко уменьшается, если одна из двух метрик мала, поэтому F1 требует одновременно приемлемых precision и recall.
Формула: F1 = 2 × precision × recall / (precision + recall). При precision = 1 и recall = 0,25 F1 равен 0,4, а арифметическое среднее — 0,625. Гармоническое среднее остаётся более консервативным.
F1 не учитывает истинно отрицательные ответы и цену бизнес-ошибки, поэтому подходит не каждой задаче.
Как порог меняет precision и recall?
Короткий ответ: снижение порога добавляет положительные прогнозы, поэтому recall обычно растёт, а precision может снижаться. Повышение порога действует в обратную сторону.

Каждая точка кривой соответствует своему порогу: график помогает увидеть обмен между precision и recall до выбора рабочего значения. Источник: пример Precision–Recall в документации scikit-learn.
Ниже — небольшой запускаемый пример. Он показывает не «лучший» порог, а сам обмен между двумя метриками.
def precision_recall(labels: list[int], scores: list[float], threshold: float) -> tuple[float, float]:
# Вероятности превращаются в решения только после выбора порога.
predictions = [int(score >= threshold) for score in scores]
true_positive = sum(prediction == label == 1 for prediction, label in zip(predictions, labels))
predicted_positive = sum(predictions)
actual_positive = sum(labels)
# Защищаем расчёт от деления на ноль, если положительных ответов нет.
precision = true_positive / predicted_positive if predicted_positive else 0.0
recall = true_positive / actual_positive if actual_positive else 0.0
return precision, recall
y_true = [1, 0, 1, 0, 1]
y_score = [0.9, 0.6, 0.55, 0.4, 0.3]
# Сравниваем пороги на отложенной выборке, а не на данных обучения.
for border in (0.7, 0.5, 0.3):
print(border, precision_recall(y_true, y_score, border))При пороге 0,7 модель находит меньше положительных объектов, зато её положительные сигналы точнее. При 0,3 она находит все единицы, но захватывает больше нулей. Порог выбирают на валидационных данных под стоимость ошибок, а не на финальной тестовой выборке. Практический процесс описан в руководстве по настройке порога.
Чем micro-усреднение отличается от macro?
Короткий ответ: micro сначала складывает TP, FP и FN по всем классам, а затем считает одну общую метрику. Macro считает метрику отдельно для каждого класса и берёт обычное среднее.
Micro сильнее отражает качество на многочисленных классах. Macro даёт редкому классу такой же вес, как частому, поэтому показывает, не потеряла ли модель небольшие группы. Weighted macro тоже считает метрики по классам, но взвешивает их по числу объектов.
Ответ «при дисбалансе всегда выбираем macro» неполон. Выбор зависит от того, одинаково ли важны классы и что именно нужно измерить.
Какие ошибки нужно найти в цикле обучения PyTorch?
Короткий ответ: перед новым backward() нужно обнулить накопленные градиенты, а перед валидацией — переключить модель в режим eval и отключить вычисление градиентов.
В PyTorch градиенты накапливаются. Если не вызвать optimizer.zero_grad(), новый шаг прибавит значения к предыдущим. model.eval() меняет поведение Dropout и BatchNorm для проверки. Сам по себе он не отключает граф вычислений, поэтому инференс обычно выполняют внутри torch.no_grad().
В практической задаче кандидат нашёл две главные проблемы: отсутствие обнуления градиентов и режима валидации. Это хороший сигнал, потому что вопрос проверяет не знание названий моделей, а способность заметить ошибку в рабочем пайплайне. Эталонный порядок шагов есть в учебнике PyTorch по оптимизации.
Итог: получил бы кандидат оффер?
Короткий ответ: по опубликованной технической части кандидат скорее прошёл бы дальше, но фактическое решение работодателя не раскрыто.
Фактическое решение Т-Банка в доступной записи не раскрыто. По показанной технической части мы считаем, что кандидат скорее прошёл бы дальше и имел хорошие шансы на оффер.
Он уверенно держал классическое машинное обучение, правильно работал с ROC-AUC и порогом, решил задачу на метрики и нашёл ключевые ошибки в PyTorch-коде. Отдельные ответы можно сделать точнее: аккуратнее описать важность признаков, micro- и macro-усреднение и последствия удаления дерева из бустинга. Но эти неточности не перевешивают сильную базу и успешную практическую часть.
На тренажёре собеседований ЮНИКОД можно отработать такие вопросы в формате диалога, получить уточнения и проверить, не распадается ли правильный ответ после дополнительного вопроса.
Источники
частые вопросы
Короткие ответы
Нужно ли помнить формулы метрик на собеседовании Data Scientist?
Базовые формулы precision, recall и F1 лучше знать. Но важнее объяснить смысл ошибок, выбрать метрику под задачу и показать, как порог влияет на решение.
Как тренировать ответы на вопросы по машинному обучению?
Дайте себе 60–90 секунд: сначала короткое определение, затем механизм, пример и одно ограничение. После этого потренируйте два уточняющих вопроса по теме.
Можно ли по одной технической секции точно предсказать оффер?
Нет. Техническая секция показывает только часть решения. Работодатель также учитывает уровень позиции, практический опыт, другие этапы и потребности конкретной команды.


