Вопросы на собеседовании в Ozon
Ozon спрашивает прикладное: ML system design вокруг маркетплейса (ранжирование, прогноз спроса, логистика), SQL, классический ML и метрики. Ниже — вопросы такого же формата из банка Сеньорчика, с вариантами и разбором, что за каждым проверяют.
Фича «зашла» в A/B: +2% к кликам за две недели. Через месяц после раскатки метрика вернулась к базовой. Какое объяснение наиболее вероятно?
A)A/B-тесты не работают, и им вообще не получится доверять как методу оценкиB)Метрика просто технически сломалась в момент полной раскатки фичиC)Конкуренты быстро скопировали фичу, и преимущество исчезло самоD)Novelty effect: аплифт от новизны затух; тест поймал пикпоказать ответ и разбор
+D)Novelty effect: аплифт от новизны затух; тест поймал пик// разбор: Новое привлекает клики само по себе (и наоборот: primacy effect — полезную фичу сначала не понимают). Смотреть тренд эффекта внутри теста: затухание к концу — тревожный знак; для важных решений держат долгий holdout (5–10% без фичи) и меряют устойчивый эффект. Короткие тесты систематически переоценивают кликовые метрики.
Приём «скользящее окно» (sliding window) уместнее всего для задачи:
A)найти максимальную сумму подряд идущих k элементов, не пересчитывая окно с нуля каждый разB)Отсортировать массив по возрастаниюC)Найти НОД двух чиселD)Проверить, читается ли строка одинаково слева направо и справа налево целикомпоказать ответ и разбор
+A)найти максимальную сумму подряд идущих k элементов, не пересчитывая окно с нуля каждый раз// разбор: Sliding window держит агрегат по окну и при сдвиге обновляет его инкрементально: вычел ушедший элемент, добавил пришедший — O(1) на шаг, весь проход O(n). Наивный пересчёт суммы каждого окна — O(n·k). Приём работает для «подряд идущих» подотрезков/подстрок с монотонным условием.
Что означает «амортизированная сложность O(1)» на примере append в динамическом массиве (list)?
A)Каждый отдельный append за одну операцию — дорогих вызовов встречается редкоB)В среднем O(1) на элемент: редкие расширения размазаны по дешёвым вставкамC)Append за O(1) если заранее известен финальный размер массиваD)Это маркетинговый термин: на самом деле каждый append честно стоит O(n) если честно считать каждую отдельную операцию appendпоказать ответ и разбор
+B)В среднем O(1) на элемент: редкие расширения размазаны по дешёвым вставкам// разбор: Динамический массив при заполнении удваивает ёмкость: копирование O(n) случается редко, а между удвоениями append дёшев. Сумма затрат на m вставок — O(m), значит в среднем O(1) на элемент — это и есть амортизированная оценка. Отдельный append в момент расширения всё же O(n); гарантии на каждый вызов нет.
Что значит, что сортировка «стабильная» (stable)?
A)Элементы с равными ключами сохраняют исходный взаимный порядокB)Она не падает с ошибкой и завершается на входных данных независимо от их исходного порядка и содержимого ключейC)Она работает за одно и то же времяD)Она не использует дополнительную памятьпоказать ответ и разбор
+A)Элементы с равными ключами сохраняют исходный взаимный порядок// разбор: Стабильная сортировка при равных ключах не меняет относительный порядок таких элементов. Это критично при многоуровневой сортировке: сначала по одному полю, потом стабильно по второму — первый порядок сохранится внутри групп. Timsort (Python sorted) и merge sort стабильны; быстрая сортировка в общем виде — нет.
Нужна структура FIFO с O(1) на добавление в конец и удаление из начала. Что взять в Python?
A)Обычный list, добавляя через append в конец и удаляя через pop(0) из начала спискаB)SetC)Обычный dictD)collections.deque с append и popleft — оба конца за O(1)показать ответ и разбор
+D)collections.deque с append и popleft — оба конца за O(1)// разбор: deque (double-ended queue) реализован так, что операции с обоих концов — O(1). list для FIFO плох: pop(0) сдвигает все элементы (O(n)). deque — правильный выбор для очередей, BFS, скользящих окон. Если нужен обмен между потоками — queue.Queue поверх той же идеи.
Почему для сравнения значений по категориям bar chart обычно лучше pie?
A)Круговая диаграмма якобы заметно быстрее рендерится в BI-инструментах на больших данныхB)Bar chart не способен отображать доли и процентыC)Глаз точнее сравнивает длины столбцов, чем углы секторовD)Pie chart не получится раскрасить, а bar chart можно раскрашиватьпоказать ответ и разбор
+C)Глаз точнее сравнивает длины столбцов, чем углы секторов// разбор: Восприятие: человек точно оценивает длину вдоль общей оси и плохо — угол и площадь сектора. Поэтому близкие доли на pie почти неразличимы, а на bar видны сразу. Для долей одного целого при этом честнее 100%-stacked bar, чем набор отдельных pie-диаграмм.
Что такое cart abandonment rate и почему он важен для e-commerce?
A)Это доля вообще всех товаров на складе магазина, которые ни разу не добавлялись ни в одну корзинуB)Средняя суммарная стоимость всех товаров, одновременно лежащих в корзине одного покупателяC)Доля покупателей, вернувших уже оплаченный и доставленный товар обратно в магазинD)Доля корзин, не дошедших до оплаты; аудитория с намерением купить и высоким потенциалом возвратапоказать ответ и разбор
+D)Доля корзин, не дошедших до оплаты; аудитория с намерением купить и высоким потенциалом возврата// разбор: Cart abandonment rate = 1 − оплаченные корзины / созданные корзины. Эти пользователи уже проявили намерение купить, поэтому дешевле «дожать» их (напоминания, упрощение оплаты, прозрачная доставка), чем привлекать новых. Частые причины — неожиданная стоимость доставки, обязательная регистрация, сложный чекаут. Метрика прямо указывает на утечки в самом низу воронки.
Для категориального признака с 10 000 уникальных значений (id города) в градиентном бустинге чаще всего вредно делать one-hot encoding. Почему?
A)One-hot искажает распределение таргета в редких категориях, и бустинг систематически переобучается именно на этих колонкахB)Бустинг не принимает больше нескольких тысяч признаков на входC)One-hot по построению работает с линейными моделямиD)Получатся тысячи разреженных колонок: сплиты по одной категории почти без прироста информации, память и время растутпоказать ответ и разбор
+D)Получатся тысячи разреженных колонок: сплиты по одной категории почти без прироста информации, память и время растут// разбор: Дерево делит по одному признаку за раз; тысячи почти всегда нулевых колонок дают сплиты по одной категории с крошечным приростом информации. Для высококардинальных категорий рабочие варианты — target/mean encoding с регуляризацией против утечки, счётчики частот или нативная поддержка категорий (CatBoost, LightGBM).
Нужно предсказывать 90-й перцентиль времени доставки, а не среднее. Что менять в линейной модели?
A)Лосс: квантильная регрессия с pinball loss при τ = 0.9 вместо MSEB)Ничего: предсказанное среднее просто домножается на 1.28 сигмыC)Таргет: обучаться на топ-10% самых долгих доставокD)Регуляризацию: сильный L1 сдвинет предсказания вверх к хвоступоказать ответ и разбор
+A)Лосс: квантильная регрессия с pinball loss при τ = 0.9 вместо MSE// разбор: MSE оптимизирует условное среднее. Pinball loss асимметричен: при τ = 0.9 недооценка штрафуется в 9 раз сильнее переоценки — оптимум ровно на 90-м перцентиле условного распределения. Пересчёт через «среднее + 1.28σ» верен только для гауссовых остатков с постоянной дисперсией, чего в доставке не бывает.
это девять из 44
Ещё 35 вопросов уровня Ozon — внутри тренажёра.
Они входят в общий банк Сеньорчика: 2899 вопросов по 44 темам. Выбираете роль, тренируетесь ежедневными сессиями, а движок повторения возвращает темы, где вы плывёте, — как раз те, на которых валят секции. Начать можно бесплатно.