Сначала зафиксируйте grain данных, допущения, метрику и риск leakage, затем обсуждайте модель, инструмент или инфраструктуру.
Вопросы и ответы
12 подробных ответов
01Выведите аналитическое решение линейной регрессии (МНК). Когда оно неприменимо?
middle
Короткий ответ: Минимизируем сумму квадратов ошибок ||y − Xw||²: приравниваем градиент по w к нулю и получаем нормальное уравнение XᵀXw = Xᵀy, откуда w = (XᵀX)⁻¹Xᵀy. Решение ломается, когда XᵀX вырождена — при мультиколлинеарности или p > n.
Подробно:
L(w) = ||y − Xw||² = (y − Xw)ᵀ(y − Xw)
∇w L = −2Xᵀ(y − Xw) = 0
XᵀXw = Xᵀy ← нормальное уравнение
w* = (XᵀX)⁻¹Xᵀy
- Когда обратной матрицы нет — XᵀX вырождена, если фичи линейно зависимы (мультиколлинеарность) или признаков больше, чем наблюдений (p > n): решений бесконечно много.
- Ridge как лечение — штраф λ||w||² даёт w = (XᵀX + λI)⁻¹Xᵀy; матрица XᵀX + λI положительно определена и обратима при любом λ > 0.
- Градиентный спуск — при большом p обращение стоит O(p³); итеративная оптимизация дешевле и вообще не требует обратимости.
⚠️ Частая ошибка: написать формулу и не суметь ответить, когда обращение падает. Вопрос почти всегда задают ради этого продолжения.
02Как устроена логистическая регрессия и почему её не обучают через MSE?
middle
Короткий ответ: Линейный скор пропускается через сигмоиду: p = σ(wᵀx) — получаем вероятность класса. Обучаем максимизацией правдоподобия Бернулли, что эквивалентно минимизации log-loss — выпуклой функции. MSE поверх сигмоиды невыпукла и даёт затухающие градиенты на уверенно-неправильных ответах.
Подробно:
- Модель — p(y=1|x) = σ(wᵀx), где σ(z) = 1/(1+e⁻ᶻ); граница решения при этом линейна в пространстве фич.
- Лосс из правдоподобия — правдоподобие Бернулли ∏ pʸ(1−p)¹⁻ʸ; минус логарифм даёт log-loss −[y·log p + (1−y)·log(1−p)] — выпуклый по w, единственный минимум.
- Почему не MSE — (σ(wᵀx) − y)² невыпукла по w, а её градиент содержит множитель σ′(z), близкий к нулю при большом |wᵀx|: на уверенно-неправильном ответе обучение почти останавливается.
log-loss: ∇ = (p − y)·x ← не затухает
MSE: ∇ = (p − y)·σ′(z)·x ← σ′ ≈ 0 на уверенных ошибках
- Бонус — выход интерпретируется как (примерно) калиброванная вероятность, чего нет у SVM или дерева из коробки.
⚠️ Частая ошибка: «это регрессия, она предсказывает непрерывный таргет». Это линейный классификатор; «регрессия» здесь — про регрессию логита.
03Как решающее дерево выбирает сплиты и почему глубокие деревья переобучаются?
junior
Короткий ответ: Жадно: в каждом узле перебираются фичи и пороги, выбирается сплит с максимальным снижением impurity (Джини или энтропия; для регрессии — MSE). Без ограничения глубины дерево доводит листья до чистоты — то есть запоминает трейн вместе с шумом.
Подробно:
- Критерий сплита — прирост: impurity(родителя) − взвешенная impurity(детей); Джини G = 1 − Σpₖ², энтропия −Σpₖ·log pₖ — на практике почти взаимозаменяемы.
- Жадность — каждый узел оптимизируется отдельно; глобально оптимальное дерево — NP-полная задача, поэтому неудачный верхний сплит никогда не пересматривается.
- Почему переобучение — модель кусочно-константная: при неограниченной глубине каждый лист ужимается до одного объекта → нулевая ошибка на трейне, высокая дисперсия на тесте.
| Ограничение | Что делает |
|---|---|
| max_depth | режет число уровней |
| min_samples_leaf | не даёт листу ужаться до 1 объекта |
| ccp_alpha (прунинг) | срезает узлы, не окупающие сложность |
| Ансамбли | RF/бустинг превращают слабость дерева в силу |
⚠️ Частая ошибка: считать, что дерево находит «лучшее разбиение» глобально — оно жадное, и это принципиальное ограничение, а не деталь реализации.
04В чём принципиальная разница между бэггингом и бустингом?
junior
Короткий ответ: Бэггинг обучает независимые модели на бутстрап-выборках и усредняет — это снижает дисперсию (variance). Бустинг строит модели последовательно, каждая исправляет ошибки текущего ансамбля — это снижает смещение (bias).
Подробно:
| Бэггинг (RF) | Бустинг (GBM) | |
|---|---|---|
| Обучение | параллельно, независимо | строго последовательно |
| Данные | бутстрап-выборки | вся выборка; фитим остатки/ошибки |
| Снижает | дисперсию | смещение |
| Базовая модель | глубокие деревья (low bias, high variance) | неглубокие (high bias, low variance) |
| Переобучение | плато с ростом числа деревьев | растёт; нужен early stopping |
- Почему деревья разной глубины — бэггингу нужны разнообразные сильные модели: их дисперсию уберёт усреднение. Бустингу нужны слабые: смещение он уберёт сам, а лишняя ёмкость шага — прямой путь к переобучению.
- Следствие для практики — RF почти нечувствителен к числу деревьев; в бустинге n_estimators и learning rate — главные ручки.
⚠️ Частая ошибка: «бустинг — это бэггинг с весами». Ключ — последовательная зависимость: каждая модель видит ошибки предыдущих, а не независимую выборку.
05Случайный лес или градиентный бустинг: что выберете и почему?
middle
Короткий ответ: Бустинг — выше потолок качества на табличных данных, дефолтный выбор в соревнованиях и проде. Случайный лес — когда нужна робастность: он малочувствителен к гиперпараметрам и шумным таргетам, тривиально параллелится, и его тяжело переобучить.
Подробно:
| Критерий | Случайный лес | Градиентный бустинг |
|---|---|---|
| Потолок качества | ниже | выше (SOTA на табличке) |
| Тюнинг | почти не нужен | LR, глубина, n_trees, регуляризация |
| Шумные таргеты | устойчив: усреднение | подгоняется под шум в остатках |
| Параллелизм | по деревьям | только внутри дерева |
| Переобучение | выходит на плато | требует early stopping |
- Зачем RF подмешивает фичи (max_features) — без этого все деревья выбирали бы одни и те же сильные сплиты и были бы скоррелированы, а усреднение коррелированных моделей почти не снижает дисперсию. Подвыборка фич декоррелирует деревья — только поэтому усреднение работает.
- Практика — быстрый бейзлайн, шумные метки, мало времени → RF; выжать максимум на чистой табличке → CatBoost/LightGBM/XGBoost с тюнингом.
⚠️ Частая ошибка: «бустинг всегда лучше». На маленьких шумных выборках лес с дефолтами нередко обходит недотюненный бустинг.
06Уберите первое дерево из случайного леса на 1000 деревьев и из бустинга на 1000 деревьев. Что изменится?
senior
Короткий ответ: В лесу — почти ничего: деревья независимы, предсказание — среднее, потеря одного слагаемого сдвинет его на ~1/1000. В бустинге предсказания сломаются: каждое следующее дерево обучалось на остатках, в которые входил вклад первого, и без него вся сумма систематически смещена.
Подробно:
RF: ŷ = (t₁ + t₂ + … + t₁₀₀₀)/1000
убрали t₁ → сдвиг порядка вклада одного дерева
GBM: F = f₁ + ν·f₂ + … + ν·f₁₀₀₀
f₂ фитит y − f₁; f₃ фитит y − f₁ − ν·f₂; …
убрали f₁ → остальные корректируют несуществующую базу
- Лес — деревья обучены независимо на своих бутстрап-выборках; ансамбль — простое среднее, симметричное к любому дереву: неважно, первое оно или пятисотое.
- Бустинг — аддитивная модель с последовательной зависимостью; первое дерево несёт самый крупный вклад (грубое приближение таргета), дальнейшие лишь докручивают остатки. Убрать f₁ — значит сдвинуть все предсказания примерно на его вклад.
- Что слушает интервьюер — независимость деревьев в бэггинге против последовательной зависимости в бустинге; это вопрос про bias/variance, заданный «в лоб».
⚠️ Частая ошибка: «в обоих случаях минус одно дерево из тысячи — ничего страшного», не заметив последовательную структуру бустинга.
07Где именно «градиент» в градиентном бустинге?
senior
Короткий ответ: Это градиентный спуск в пространстве функций: на каждом шаге новое дерево аппроксимирует антиградиент лосса по текущим предсказаниям ансамбля (псевдоостатки), и ансамбль делает шаг F ← F + ν·h. «Дерево обучается на остатках» — точно лишь для MSE.
Подробно:
rᵢ = −∂L(yᵢ, F(xᵢ))/∂F(xᵢ) ← псевдоостатки
hₘ ≈ argmin Σ (rᵢ − h(xᵢ))² ← дерево фитит rᵢ
Fₘ = Fₘ₋₁ + ν·hₘ ← шаг спуска с LR ν
MSE: L = ½(y−F)² → r = y − F (обычный остаток)
Log-loss: r = y − p, p = σ(F) (ошибка вероятности)
- Функциональное пространство — «параметры», по которым спускаемся, — значения F(xᵢ) на объектах: антиградиент говорит, куда сдвинуть предсказание каждого объекта, а дерево обобщает эти сдвиги на новые точки.
- Почему это обобщение — подставив любой дифференцируемый лосс (quantile, Poisson, ranking), получаем бустинг под задачу; так устроен objective в XGBoost/LightGBM/CatBoost.
- Learning rate — ν и есть длина шага спуска; меньше шаг + больше деревьев = стабильнее.
⚠️ Частая ошибка: «бустинг фитит остатки» как полный ответ. Это частный случай MSE; интервьюер ждёт слов «антиградиент лосса по предсказаниям».
08CatBoost, XGBoost, LightGBM — в чём ключевые отличия?
middle
Короткий ответ: XGBoost — приближение второго порядка (градиент + гессиан) и явная регуляризация в objective. LightGBM — гистограммы и рост дерева по листьям (leaf-wise): самый быстрый, но легче переобучается. CatBoost — ordered boosting и упорядоченные target statistics для категорий: борется с ликом таргета, сильные дефолты.
Подробно:
| XGBoost | LightGBM | CatBoost | |
|---|---|---|---|
| Рост дерева | level-wise | leaf-wise | симметричные (oblivious) |
| Категории | нужен энкодинг | встроенно, попроще | ordered target statistics |
| Фишка | 2-й порядок, регуляризация | скорость, память | ordered boosting, дефолты |
| Риск | медленнее LightGBM | переобучение на малых данных | дольше учится |
- Симметричные деревья CatBoost — на каждом уровне один и тот же сплит во всех узлах: дерево = таблица на 2^depth листьев, очень быстрый инференс и встроенная регуляризация.
- Leaf-wise у LightGBM — растит лист с максимальным приростом: быстрее сходится, но на малых выборках выращивает глубокие несбалансированные ветки.
- CIS-контекст — CatBoost — продукт Яндекса; на собеседованиях в Яндекс и его экосистему вопрос про отличия CatBoost почти гарантирован.
⚠️ Частая ошибка: «они одинаковые, разница в скорости». Различия алгоритмические: обработка категорий и защита от лика в CatBoost — отдельная идея, а не оптимизация.
09Что такое ordered boosting в CatBoost и какую проблему он решает?
senior
Короткий ответ: Проблему prediction shift — разновидность лика таргета: в классическом бустинге остаток объекта считается моделью, обученной в том числе на нём самом, а target statistics категорий включают его собственный таргет. CatBoost вводит случайную перестановку и для каждого объекта использует статистики и модели, обученные только на «предыдущих» объектах.
Подробно:
- Лик в target encoding — заменяя категорию средним таргета по всей выборке, мы записываем в фичу ответ самого объекта; на редких категориях фича почти равна таргету → блестящий трейн, провал на тесте.
- Ordered target statistics — статистика категории для объекта i считается только по объектам до i в случайной перестановке (плюс prior): свой таргет в свою фичу не утекает.
- Prediction shift в остатках — та же болезнь у псевдоостатков: остаток, посчитанный моделью, которая видела объект, систематически смещён. Ordered boosting держит набор моделей: остаток объекта i выдаёт модель, обученная на префиксе перестановки до i.
- Цена — дополнительные вычисления и память; на практике CatBoost усредняет по нескольким перестановкам.
перестановка: x₃ x₇ x₁ x₅ …
stats и остаток для x₅ ← считаются только по {x₃, x₇, x₁}
⚠️ Частая ошибка: делать target encoding по всей выборке «руками» и удивляться разрыву train/test — это ровно тот лик, который CatBoost чинит из коробки.
10Как работает k-means, как выбрать k и когда алгоритм ломается?
middle
Короткий ответ: Алгоритм Ллойда: назначаем точки ближайшему центроиду, пересчитываем центроиды как средние, повторяем до сходимости — минимизируется внутрикластерная сумма квадратов (inertia). k выбирают по elbow, silhouette или из бизнес-логики. Ломается на несферических кластерах, разных плотностях и немасштабированных фичах.
Подробно:
for _ in range(max_iter):
labels = closest_centroid(X, C) # шаг назначения
C = np.array([X[labels == j].mean(0) # шаг обновления
for j in range(k)])
- Что оптимизируем — Σ‖xᵢ − c(xᵢ)‖²; каждый шаг не увеличивает лосс → сходимость гарантирована, но только к локальному минимуму.
- Выбор k — elbow (перегиб inertia), silhouette (компактность против отделимости); часто k диктует задача — столько сегментов, сколько бизнес способен обслужить.
- Провалы — вытянутые/кольцевые кластеры (k-means рисует диаграмму Вороного из «сфер»), разные размеры и плотности, чувствительность к инициализации (лечится k-means++) и к масштабу фич.
- Альтернативы — DBSCAN для произвольных форм, GMM для эллиптических кластеров и мягких принадлежностей.
⚠️ Частая ошибка: запускать на немасштабированных данных — фича с самой большой дисперсией приватизирует метрику расстояния.
11Объясните PCA: чем являются главные компоненты математически?
middle
Короткий ответ: Главные компоненты — собственные векторы ковариационной матрицы центрированных данных (эквивалентно — правые сингулярные векторы X из SVD), упорядоченные по убыванию собственных значений, то есть объяснённой дисперсии. Это ортогональные направления, вдоль которых данные варьируются сильнее всего.
Подробно:
центрируем X → C = XᵀX/(n−1)
C·vᵢ = λᵢ·vᵢ ← vᵢ — компонента, λᵢ — её дисперсия
проекция: Z = X·V_k (первые k собственных векторов)
- Оптимизационный взгляд — первая компонента максимизирует дисперсию проекции; каждая следующая делает то же при ортогональности предыдущим. Эквивалентная формулировка: PCA минимизирует ошибку реконструкции.
- На практике — SVD — численно устойчивее, чем явное построение ковариационной матрицы; именно так реализован sklearn.
- Предобработка обязательна — без центрирования первая компонента поймает среднее; без масштабирования — фичу с самой большой дисперсией.
- PCA не смотрит на таргет — метод unsupervised: максимум дисперсии ≠ максимум предсказательной силы, сигнал может жить в младших компонентах.
⚠️ Частая ошибка: ответ «это снижение размерности» без механизма. Интервьюер ждёт слова: собственные векторы ковариации, объяснённая дисперсия, ортогональность.
12Можно ли бустить или бэггировать линейные модели? А kNN?
concept
Короткий ответ: Формально да, на практике бессмысленно. Сумма линейных моделей — снова линейная модель, так что бустинг не добавит выразительности и не снизит bias. Бэггинг kNN почти не меняет kNN: это стабильный алгоритм, у него мало дисперсии, которую можно было бы срезать усреднением.
Подробно:
- Бустинг линейных моделей — каждый шаг добавляет wₘᵀx; итог Σwₘᵀx = (Σwₘ)ᵀx — одна линейная модель, которую можно было обучить сразу. Смещение линейного класса никуда не денется.
- Бэггингу нужна высокая дисперсия — усреднение снижает variance; у стабильных алгоритмов (линейные, kNN с разумным k) предсказания почти не меняются от бутстрап-выборки к выборке — усреднять нечего.
- Почему деревья идеальны — глубокое дерево: low bias / high variance → создано для бэггинга; неглубокое: high bias / low variance → создано для бустинга.
| Базовая модель | Бэггинг | Бустинг |
|---|---|---|
| Глубокое дерево | ✅ случайный лес | переобучение |
| Неглубокое дерево | мало толку | ✅ GBM |
| Линейная | мало толку | остаётся линейной |
| kNN | ≈ без изменений | стабильный: не подходит |
⚠️ Частая ошибка: отвечать «нельзя». Можно — вопрос проверяет, понимаете ли вы, зачем ансамбли существуют: бэггинг ест variance, бустинг ест bias.
Источники
Источники и редакционная политика
Материалы RecallDeck сопоставлены с официальной документацией и открытыми публикациями компаний, когда первичный источник доступен. Мы не связаны с упомянутыми работодателями, не публикуем конфиденциальные задания и не продаём места в подборках. Формат найма может меняться — уточняйте его у рекрутера.
От чтения к воспроизведению
Отрепетируйте полный цикл интервью.
RecallDeck возвращает сложные темы по расписанию и помогает удерживать в памяти язык, SQL, архитектуру и поведенческие истории.