Работа с признаками
Кодирование, масштабирование, импутация, выбросы, преобразования, отбор признаков, мультиколлинеарность и временные признаки без утечки будущего.
12 вопросов
JuniorТеорияОчень частоСтандартизация, min-max или robust scaling — и какие модели игнорируют масштаб?
Стандартизация, min-max или robust scaling — и какие модели игнорируют масштаб?
Стандартизация центрирует признак и делит на стандартное отклонение; min-max переводит его в фиксированный диапазон; robust scaling берёт медиану и межквартильный размах. Моделям на расстояниях и градиентах масштабирование нужно, деревьям — нет, они делят по порядку.
Типичные ошибки
- ✗Масштабировать признаки для градиентного бустинга на деревьях и ждать другого результата
- ✗Применять стандартизацию к признаку с тяжёлым хвостом, где выбросы задают стандартное отклонение
- ✗Обучать скейлер на всём датасете до разделения на train и test
Уточняющие вопросы
- →Почему метод ближайших соседей k-nearest-neighbours меняет ответ, если один признак не масштабирован?
- →Меняет ли масштабирование таргета то, что реально оптимизирует квадратичная ошибка?
MiddleТеорияОчень частоСреднее, модель или флаг пропуска — когда флаг важнее самого значения?
Среднее, модель или флаг пропуска — когда флаг важнее самого значения?
Медиана устойчива к выбросам, которые тянут среднее; модельная импутация заимствует другие столбцы, но способна выдумать структуру. Флаг пропуска нужен, когда сам пропуск несёт сигнал — пустое поле нередко предсказывает таргет лучше подставленного значения.
Типичные ошибки
- ✗Импутировать средним по столбцу с тяжёлым хвостом, где несколько экстремумов его смещают
- ✗Терять сам паттерн пропусков, заполняя данные молча и не добавляя индикатор
- ✗Обучать импутер на всей таблице, из-за чего тестовая статистика попадает в обучающие строки
Уточняющие вопросы
- →Как градиентный бустинг на деревьях обрабатывает пропуск нативно, без импутации?
- →Когда заполнение заведомо внедиапазонным значением лучше статистической оценки?
JuniorТеорияЧастоКогда биннинг и явные признаки-взаимодействия помогают линейной модели?
Когда биннинг и явные признаки-взаимодействия помогают линейной модели?
Линейная модель видит только аддитивные вклады, поэтому корзины позволяют ей изогнуть нелинейный отклик, а произведение — дать одному признаку менять эффект другого. Бустинг на деревьях строит их сам — пороги дают корзины, разбиения дают взаимодействия.
Типичные ошибки
- ✗Добавлять рукотворные столбцы-взаимодействия в градиентный бустинг, который и так их находит
- ✗Разбивать признак на корзины так грубо, что реальный монотонный тренд внутри корзины пропадает
- ✗Считать, что линейная модель уловит кривизну без единого преобразованного столбца
Уточняющие вопросы
- →Как выбрать границы корзин — равная ширина, равная частота или из обученного дерева?
- →Когда взаимодействие всё же помогает дереву, например отношение двух счётчиков?
JuniorТеорияЧастоЗачем логарифмировать скошенный признак или таргет и что это меняет?
Зачем логарифмировать скошенный признак или таргет и что это меняет?
Логарифм сжимает правый хвост, и несколько огромных значений перестают доминировать, а зависимость становится ближе к линейной. На таргете он меняет задачу — квадратичная ошибка по логарифмам штрафует относительную ошибку, и модель подгоняет отношения.
Типичные ошибки
- ✗Забывать, что логарифмический таргет надо переводить обратно, а наивная экспонента даёт смещение вниз
- ✗Логарифмировать признак с нулями или отрицательными значениями вместо сдвига вроде log1p
- ✗Ждать пользы от логарифма для дерева, которое инвариантно к любому монотонному преобразованию
Уточняющие вопросы
- →Чем степенное преобразование Box-Cox отличается от простого логарифма?
- →Какое смещение возникает при экспоненцировании предсказания, сделанного на логарифмическом таргете?
JuniorТеорияЧастоКогда для категории верно one-hot, label или ordinal кодирование?
Когда для категории верно one-hot, label или ordinal кодирование?
One-hot подходит для номинальных категорий — каждый уровень получает свой бинарный столбец. Ordinal-кодирование подходит там, где порядок уровней реален. Label-кодирование раздаёт произвольные целые, и линейная модель читает ложный порядок и расстояния.
Типичные ошибки
- ✗Применять label-кодирование к номинальному признаку и позволять линейной модели читать целые как порядок
- ✗Считать one-hot бесплатным — признак большой мощности взрывает число столбцов
- ✗Считать ordinal-кодирование безопасным там, где у уровней нет реального ранжирования
Уточняющие вопросы
- →Как вы закодируете признак большой мощности, например почтовый индекс?
- →Страдают ли деревья от one-hot так же, как линейные модели от label-кодирования?
JuniorТеорияЧастоКак обнаружить выбросы и когда их стоит оставить, а не обрезать?
Как обнаружить выбросы и когда их стоит оставить, а не обрезать?
Правило межквартильного размаха отмечает точки за средней половиной; z-оценка — точки во многих стандартных отклонениях от среднего; isolation forest отделяет точку за малое число разбиений. Экстремумы с реальным сигналом оставляйте, обрезайте только ошибку измерения.
Типичные ошибки
- ✗Удалять каждую отмеченную точку, стирая редкие события, ради которых модель и создана
- ✗Применять z-оценку к признаку с тяжёлым хвостом, где выбросы сами раздувают стандартное отклонение
- ✗Обрезать выбросы по порогам, посчитанным на всём датасете вместе с тестовой частью
Уточняющие вопросы
- →Почему межквартильное правило лучше переносит скошенный признак, чем z-оценка?
- →Как поступить с выбросом в таргете, а не в признаке?
MiddleКодЧастоНайдите шаг этого pandas-конвейера, который обучается до разделения выборки.
Найдите шаг этого pandas-конвейера, который обучается до разделения выборки.
Скейлер и импутер обучаются на полном фрейме, поэтому статистики теста утекают в обучающие признаки, а метрика завышена. Сначала разделите выборку, вызовите fit только на train, затем примените transform к обеим частям этими статистиками.
Открыть задачу →Типичные ошибки
- ✗Вызывать fit_transform на тестовой части вместо transform обученными на train статистиками
- ✗Думать, что утечка требует обращения к таргету, тогда как статистики признаков текут сами
- ✗Разделить выборку, но затем заново обучить скейлер отдельно на каждой части
Уточняющие вопросы
- →Как помощник sklearn под названием Pipeline делает такую ошибку структурно невозможной?
- →Где та же утечка возникает снова при кросс-валидации вместо одного разделения?
MiddleТеорияЧастоКак обнаружить мультиколлинеарность и что именно она ломает?
Как обнаружить мультиколлинеарность и что именно она ломает?
Скоррелированные предикторы видны в корреляционной матрице или по высокому VIF. В линейной модели коэффициенты неустойчивы и неинтерпретируемы, знаки могут переворачиваться, а предсказания остаются нормальными. Точность деревьев не страдает, важность делится между близнецами.
Типичные ошибки
- ✗Считать, что коллинеарность портит предсказания линейной модели, а не только её коэффициенты
- ✗Читать важности признаков дерева как устойчивые, когда два скоррелированных столбца делят вклад
- ✗Принимать высокий фактор инфляции дисперсии VIF за проблему масштабирования
Уточняющие вопросы
- →Как метод регуляризации ridge regression меняет картину для скоррелированных предикторов?
- →Почему удаление одного признака из скоррелированной пары всё же вредит интерпретируемой модели?
MiddleТеорияЧастоКак target-кодирование протекает по метке и как out-of-fold среднее это чинит?
Как target-кодирование протекает по метке и как out-of-fold среднее это чинит?
Замена категории средним таргетом по тем же строкам кладёт метку каждой строки в её же признак, модель её запоминает, а валидация выглядит слишком хорошо. Считайте среднее out-of-fold и сглаживайте редкие категории к глобальному среднему.
Типичные ошибки
- ✗Считать кодирование сразу по всем обучающим строкам, из-за чего метка строки попадает в её признак
- ✗Доверять валидационной метрике, полученной при внутрифолдовом target-кодировании
- ✗Оставлять редкую категорию закодированной средним по одной-двум строкам без сглаживания
Уточняющие вопросы
- →Как сглаживающий приор балансирует среднее категории и глобальное среднее?
- →Почему библиотека бустинга CatBoost вместо этого использует упорядоченную целевую статистику?
JuniorКодИногдаЗакодируйте час суток так, чтобы 23:00 и 00:00 оказались рядом.
Закодируйте час суток так, чтобы 23:00 и 00:00 оказались рядом.
Отобразите значение на окружность — возьмите угол два пи, умноженный на час и делённый на 24, и выдайте его синус и косинус двумя столбцами. Окружность замкнута, поэтому час 23 и час 0 оказываются рядом, чего целый столбец не выражает.
Открыть задачу →Типичные ошибки
- ✗Оставлять исходный целый час, из-за чего модель по-прежнему видит полночь далеко от 23:00
- ✗Выдавать только синус, из-за чего два разных часа схлопываются в одно значение
- ✗Жёстко зашивать период 24 и переиспользовать помощник для месяца или дня недели
Уточняющие вопросы
- →Почему один столбец с синусом схлопывает два разных часа в одно значение?
- →Даёт ли это кодирование что-нибудь градиентному бустингу на деревьях?
MiddleТеорияИногдаКак отличить полностью случайные пропуски от случайных и неслучайных?
Как отличить полностью случайные пропуски от случайных и неслучайных?
Полностью случайные пропуски не зависят ни от чего, поэтому годится любое несмещённое заполнение. Случайные зависят от наблюдаемых столбцов — импутируйте по ним. Неслучайные означают, что скрытое значение вызывает свой пропуск — моделируйте сам пропуск.
Типичные ошибки
- ✗Считать заполнение средним безопасным, когда значение скрылось именно из-за своей экстремальности
- ✗Верить, что неслучайность пропусков доказуема по одним лишь наблюдаемым данным
- ✗Удалять строки с пропусками и незаметно смещать оставшуюся выборку
Уточняющие вопросы
- →Какая диагностика отличает случайные пропуски от полностью случайных?
- →Почему цензурированное измерение, например насыщение датчика, даёт неслучайный пропуск?
SeniorДизайнИногдаМодель оттока переобучается каждую ночь из feature store. Метка клиента известна только через 30 дней после события, а таблицы признаков — тикеты поддержки, счётчики использования, смены тарифа — обновляются непрерывно и иногда дозаполняются с опозданием в несколько дней. Последний запуск дал 0.91 офлайн и 0.68 в проде. Спроектируйте конвейер признаков так, чтобы каждая обучающая строка видела только то, что реально было известно на момент её предсказания. Объясните, что должен гарантировать point-in-time (as-of) join, как обрабатывается запись, дозаполненная уже после метки, и как признаки обучения и признаки инференса остаются идентичными.
Модель оттока переобучается каждую ночь из feature store. Метка клиента известна только через 30 дней после события, а таблицы признаков — тикеты поддержки, счётчики использования, смены тарифа — обновляются непрерывно и иногда дозаполняются с опозданием в несколько дней. Последний запуск дал 0.91 офлайн и 0.68 в проде. Спроектируйте конвейер признаков так, чтобы каждая обучающая строка видела только то, что реально было известно на момент её предсказания. Объясните, что должен гарантировать point-in-time (as-of) join, как обрабатывается запись, дозаполненная уже после метки, и как признаки обучения и признаки инференса остаются идентичными.
Признаки читаются на момент предсказания, а не на сегодня. As-of join берёт последнее значение, чьи время события и поступления раньше этого момента, поэтому поздние дозаполнения невидимы старым строкам. Метка отстаёт на 30 дней, обучение и инференс делят одно определение.
Типичные ошибки
- ✗Соединять только по времени события и игнорировать момент реального поступления записи
- ✗Обучаться на признаках, уже отражающих то окно исхода, которое покрывает метка
- ✗Писать отдельный код признаков для обучения и для инференса, из-за чего определения расходятся
Уточняющие вопросы
- →Как проверить существующую обучающую таблицу на нарушения point-in-time?
- →Что задержка метки в 30 дней означает для границы между фолдами валидации?