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 дешевле и быстрее.