Что такое feature engineering
Трансформация сырых данных в признаки которые модель понимает. Качество фич > сложность модели.
Кодирование категорий
One-hot encoding
df = pd.get_dummies(df, columns=['city'])
Когда: < 50 категорий, без natural ordering.
Label encoding
df['size'] = df['size'].map({'S': 0, 'M': 1, 'L': 2, 'XL': 3})
Когда: ordinal данные.
Target encoding
mean_target = df.groupby('city')['target'].mean()
df['city_te'] = df['city'].map(mean_target)
Когда: много категорий (>100). Риск leakage — делать по фолдам.
Scaling
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# StandardScaler — для нормально распределённых
# MinMaxScaler — для bounded [0, 1]
# RobustScaler — для данных с outliers
Дата → признаки
df['hour'] = df['ts'].dt.hour
df['dow'] = df['ts'].dt.dayofweek
df['is_weekend'] = (df['dow'] >= 5).astype(int)
df['month'] = df['ts'].dt.month
Целевая переменная
Binary
Класс 0/1. Используй log-loss / accuracy / F1.
Regression с log-transform
# Если target = доход (log-normal)
df['target_log'] = np.log1p(df['target'])
# В продакшене np.expm1(prediction)
Imbalanced
Если 95% класс 0 и 5% класс 1 — accuracy 95% при тривиальной модели "всегда 0".
- SMOTE для oversampling
- Class weights
- Optimize precision/recall а не accuracy
Кейс
Стартап делал модель churn. Accuracy 92%. Менеджер счастлив. Через неделю реальность: модель никого не предсказывала уходящим (тривиально answer "не уходит"). Recall = 0.
Урок: для несбалансированных данных НИКОГДА не optimize accuracy. Используй F1, AUC-PR.