Ответ
Да, генерация признаков — это одна из самых важных и творческих частей в построении ML-моделей. Моя работа здесь всегда начинается с анализа домена и данных.
Конкретные примеры из практики:
-
Для задачи прогнозирования оттока клиентов (churn prediction):
- Создавал признаки, описывающие активность пользователя во времени:
days_since_last_login,rolling_avg_session_duration_7d,cnt_transactions_last_month. - Генерировал статистические признаки по сегментам:
avg_invoice_amount_for_user_segment,std_payment_delay_for_user_region.
# Пример: создание признака "тренд трат" df['purchase_trend'] = df.groupby('user_id')['purchase_amount'] .transform(lambda x: x.rolling(window=3, min_periods=1).mean().pct_change()) - Создавал признаки, описывающие активность пользователя во времени:
-
Для временных рядов (прогноз спроса):
- Извлекал циклические признаки из даты: синус и косинус дня недели, часа дня, чтобы модель понимала цикличность.
- Создавал лаг-признаки (значения за предыдущие дни) и скользящие статистики (среднее, стандартное отклонение за последнюю неделю).
-
Работа с категориальными признаками:
- Помимо One-Hot Encoding и Target Encoding, использовал счётчики (count encoding): как часто конкретное значение встречается в датасете. Это особенно полезно для категорий с высокой кардинальностью.
Методология:
- После генерации большого пула признаков я всегда провожу отбор.
- Использую
feature_importanceиз деревьев (XGBoost, LightGBM) и SHAP-значения, чтобы понять, какие признаки действительно вносят вклад в предсказание модели, а какие являются шумом. - Domain knowledge — это ключ. Например, для e-commerce признак
discount_depth_to_avg_price_ratio(глубина скидки относительно средней цены товара) часто оказывается более значимым, чем просто абсолютное значение скидки.