Feature Engineering на собеседовании Data Scientist

Зачем feature engineering на собесе

В реальной DS-работе 60-80% времени уходит на feature engineering, не на обучение модели. На собесе Data Scientist feature engineering проверяют через кейсы: «дано задача X, какие фичи возьмёшь и почему».

Слабый feature engineering = модель «по шаблону», ROC-AUC 0.7 на простой задаче. Сильный = осознанное создание признаков из доменного знания, ROC-AUC 0.85+ на той же задаче с тем же алгоритмом.

Числовые признаки

Нормализация / стандартизация:

  • Min-max scaling: (x - min) / (max - min) → [0, 1]
  • Z-score: (x - mean) / std → mean 0, std 1
  • Robust scaler: median + IQR. Устойчив к выбросам

Когда нужна:

  • Linear / logistic regression, SVM, нейросети — обязательно
  • Tree-based (XGBoost / Random Forest) — не нужна

Трансформации:

  • Log: для skewed-распределений (revenue, sessions)
  • Box-Cox / Yeo-Johnson: параметрические, ищут оптимальную трансформацию
  • Power transform: квадрат, корень

Биннинг:

  • Равные интервалы (equal-width)
  • Равная частота (equal-frequency, quantile-based)
  • На основе target (decision tree binning)

Подробнее — feature engineering на собесе DS.

Категориальные признаки

One-hot encoding:

  • Каждая категория → бинарный столбец
  • Хорошо для маленькой кардинальности (< 100 категорий)
  • Плохо для high-cardinality (взрыв размерности)

Label encoding:

  • Категория → число
  • Только для tree-based, где порядок не важен по semantics

Target encoding (mean encoding):

  • Категория → среднее target в этой категории
  • Мощный, но риск leak
  • Решение: K-fold target encoding, smoothing

Frequency encoding:

  • Категория → её частота в датасете
  • Простой baseline для high-cardinality

Hash encoding:

  • Категория → hash mod N
  • Экстремально большая кардинальность
  • Возможны collisions

CatBoost native:

  • Внутреннее ordered target encoding
  • Часто лучшее out-of-box решение для категориальных

Временные признаки

Календарные:

  • Day of week (0-6)
  • Hour of day (0-23)
  • Day / week / month / quarter / year
  • Is_weekend, is_holiday
  • Days_since_event (например, days since last purchase)

Циклические:

  • День года как sin(2π * day / 365) и cos(2π * day / 365)
  • Час дня аналогично
  • Сохраняет циклическую природу (23:00 и 00:00 близки)

Lag-фичи (для temporal):

  • y(t-1), y(t-7), y(t-30)
  • Rolling mean / std / min / max за окно
  • Exponentially-weighted moving averages

Подробнее — feature engineering для time series.

Текстовые признаки

Базовые статистики:

  • Длина текста (chars, words, sentences)
  • Доля больших букв, пунктуации, цифр
  • Среднее слово (длина)
  • Read-easiness scores (Flesch-Kincaid)

TF-IDF:

  • Document → vector. Term frequency × inverse document frequency
  • Бэйслайн для классификации текстов

Embeddings:

  • Word2Vec / fastText (word-level)
  • BERT / RuBERT [CLS] (sentence-level)
  • Sentence-BERT / OpenAI embeddings (semantic similarity)

Domain-specific:

  • N-grams (биграмы, триграмы) — часто бьют unigram TF-IDF
  • POS-tags (части речи)
  • NER tags (named entities)

Взаимодействия

Polynomial features: x1 * x2, x1². Для линейных моделей. Tree-based сами находят.

Manual interactions: «возраст × доход», «город × категория товара». Доменное знание.

Auto feature engineering: Featuretools (Deep Feature Synthesis), AutoFeat. Для exploration.

Feature selection

Filter methods (быстрые):

  • Variance threshold (убираем constant фичи)
  • Correlation with target
  • Mutual information
  • Chi-square (для категориальных)

Wrapper methods (точные, медленные):

  • Forward selection
  • Backward elimination
  • RFE (Recursive Feature Elimination)

Embedded methods (внутри модели):

  • L1 регуляризация (Lasso) — обнуляет коэффициенты
  • Feature importance в Random Forest / XGBoost
  • SHAP-based selection

Permutation importance:

  • Перемешать значения фичи → падение метрики
  • Если падение большое — фича важна

Подробнее — регуляризация L1/L2 на собесе DS.

Утечки (leakage)

Главная ошибка feature engineering: фича знает то, что модель не должна знать.

Target leakage: фича получена из target. Например, «количество транзакций в день оттока» для модели churn.

Train-test leakage:

  • Mean encoding на всём dataset до split — leakage
  • Scaling на всём dataset → среднее test просочилось в train

Temporal leakage:

  • Lag-фича считается на «future» данных
  • Lag должен учитывать только прошлое относительно target

Решения:

  • Все трансформации внутри Pipeline / ColumnTransformer
  • K-fold для target encoding
  • Time-based split для temporal

Типичные вопросы

«Дано: классификация фрода в банке. Какие фичи возьмёшь?»

Транзакционные: amount, hour_of_day, day_of_week, time_since_last_transaction. Геолокационные: distance_from_home, country_mismatch. Behavior: rolling_count_7d, mean_amount_30d, deviation_from_user_average. Categorical: merchant_category, payment_type. Network: count_unique_recipients.

«Категориальный признак с 10k уникальных значений — как кодировать?»

Target encoding с K-fold smoothing — стандарт. Frequency encoding — простой baseline. CatBoost — native. One-hot — нельзя (10k столбцов).

«В чём опасность target encoding?»

Leakage: train encoding использует target → модель видит target через фичу. Решения: K-fold target encoding (каждый fold кодируется на остальных), smoothing с глобальным средним.

«Как обработать пропуски?»

  • Удалить строки (если мало)
  • Заполнить mean / median / mode
  • Indicator column (is_missing) + заполнить
  • Для tree-based: оставить NaN (XGBoost и CatBoost умеют)
  • Iterative imputation (sklearn IterativeImputer)

Частые ошибки

  • Target leakage. Самая опасная и распространённая ошибка
  • One-hot для high-cardinality. 10k столбцов из category — нерабочая идея
  • Игнор time-based split. Mean encoding по всем данным = leak в будущее
  • Default параметры. StandardScaler() для tree-based — лишнее, для линейных — обязательно
  • Без EDA. Feature engineering без анализа данных — гадание на кофейной гуще

FAQ

Сколько фичей оптимально?

Зависит от данных и модели. Линейные — меньше фичей, больше interactions. Boosting — терпит 100+ фичей. Слишком много → overfitting и медленный inference.

Auto feature engineering работает?

Для exploration — иногда. Для production обычно проигрывает domain-driven фичам.

Embedding-фичи в tabular?

Иногда дают boost: добавить embedding текста или категории через pre-trained модель. Сложно в production, но работает.

Полиномы или ручные interactions?

Tree-based сами найдут. Линейные модели — добавь полиномы или domain-driven interactions.

Feature engineering или больше данных?

Больше данных обычно сильнее. Но в реальности feature engineering дешевле и быстрее.

Смотрите также