🔴 Сложный ⏱️ 25 минут

Feature Engineering: превращаем данные в предсказания

Feature Engineering: превращаем данные в предсказания

🎯 Зачем это нужно?

Представь, что ты создаёшь приложение для предсказания популярности TikTok видео 📱. У тебя есть сырые данные: время публикации, описание, теги. Но алгоритм машинного обучения не понимает текст “23:45” или хэштег “#viral”. Нужно превратить эти данные в числа, которые модель сможет “переварить”!

🎬 Netflix тратит миллионы на feature engineering для рекомендаций 📊 Uber создаёт сотни признаков из GPS-координат для предсказания времени поездки
🏪 Amazon анализирует историю покупок, создавая признаки типа “покупает ли техника по пятницам”

📚 История вопроса

В 2000-х годах на соревнованиях по машинному обучению побеждали не самые сложные алгоритмы, а команды с лучшими признаками! Один инженер Google сказал: “Больше данных побеждает умный алгоритм, но правильные признаки побеждают больше данных”.

В 2012 году команда победила в конкурсе Kaggle, потратив 90% времени на feature engineering и всего 10% на подбор модели. Их секрет? Они создали признак “среднее время между покупками клиента” - и точность выросла на 15%!

💡 Интуиция

Feature engineering - это как готовка 👨‍🍳. У тебя есть сырые ингредиенты (данные), но нужно их нарезать, приправить, сварить (преобразовать) перед подачей алгоритму.

Плохой повар (инженер) даст модели сырую картошку. Хороший - приготовит идеальное пюре, которое модель “съест” с удовольствием и выдаст отличный результат!

[МЕДИА: image_01] Описание: Схема превращения сырых данных в обработанные признаки Промпт: “educational illustration showing raw data transformation to engineered features, cooking metaphor with ingredients becoming prepared dish, modern clean style, ML pipeline visualization”

📐 Основные техники Feature Engineering

1. Масштабирование (Scaling)

Когда признаки имеют разные единицы измерения:

Min-Max нормализация: X_scaled = (X - min) / (max - min) Переводит всё в диапазон [0,1]

Стандартизация: X_std = (X - μ) / σ
Делает среднее=0, стандартное отклонение=1

2. Кодирование категорий

One-hot encoding: “красный” → [1,0,0], “синий” → [0,1,0], “зелёный” → [0,0,1]

Label encoding: “маленький”→1, “средний”→2, “большой”→3

3. Создание новых признаков

Из даты “2024-01-15 14:30” можно сделать:

  • Час дня: 14
  • День недели: понедельник (1)
  • Сезон: зима (1)
  • Выходной ли: нет (0)

🔍 Примеры с разбором

Пример 1: Предсказание цены квартиры

Исходные данные:

df = {
    'area': 85,
    'district': 'Центр',
    'date': '2024-01-15',
    'floor': 5,
    'total_floors': 9
}

Feature Engineering:

# Создаём новые признаки
df['price_per_sqm'] = df['area'] / df['price']  
df['floor_ratio'] = df['floor'] / df['total_floors']
df['is_top_floor'] = (df['floor'] == df['total_floors']).astype(int)

# Кодируем район
district_mapping = {'Центр': 3, 'Спальный': 1, 'Промзона': 0}
df['district_encoded'] = df['district'].map(district_mapping)

# Извлекаем из даты
df['month'] = pd.to_datetime(df['date']).dt.month
df['is_winter'] = df['month'].isin([12,1,2]).astype(int)

[МЕДИА: image_02] Описание: До и после feature engineering - таблица с исходными данными и созданными признаками Промпт: “before/after comparison table showing raw apartment data transformed into engineered features, clean data visualization, educational style”

Пример 2: Анализ активности в соцсети

# Исходный признак: время публикации поста
post_time = '2024-01-15 23:45:30'

# Создаём осмысленные признаки
hour = 23
is_evening = 1 if 18 <= hour <= 23 else 0
is_weekend = 1 if datetime.weekday() >= 5 else 0
is_prime_time = 1 if hour in [19, 20, 21] else 0

# Результат: модель понимает, что пост в вечернее время + выходной
# может получить больше лайков!

🎮 Практика

Базовый уровень 🟢

Задание 1: У тебя есть данные о студентах: рост=175см, вес=70кг, возраст=19лет. Создай новый признак BMI (индекс массы тела).

Задание 2: Время покупки в магазине: “2024-02-14 15:30”. Создай признаки: hour, is_afternoon, is_valentine_day.

Задание 3: Оценки студента по предметам: математика=5, физика=4, химия=3. Создай признак “средняя_оценка”.

Продвинутый уровень 🟡

Задание 4: Кодируй категориальный признак “размер_футболки” со значениями [XS, S, M, L, XL] двумя способами: label encoding и one-hot encoding.

Задание 5: У интернет-магазина есть история покупок клиента за год. Создай признаки: “среднее_время_между_покупками”, “любимая_категория”, “тратит_больше_в_выходные”.

Задание 6: GPS координаты: lat=55.7558, lon=37.6176. Создай признаки расстояния до центра Москвы и признак “в_пределах_МКАД”.

Челлендж 🔴

Задание 7: Создай признак “похожесть_пользователей” на основе их списков друзей в соцсети (intersection over union).

Задание 8: Из текста отзыва создай признаки: количество восклицательных знаков, процент позитивных слов, длина предложений.

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

Ошибка: Применил масштабирование до разделения на train/test ✅ Правильно: Сначала раздели данные, потом масштабируй только на train 💡 Почему: Иначе информация из test “утекает” в train (data leakage)

Ошибка: Создал признак используя будущие данные
Правильно: Используй только данные, доступные на момент предсказания 💡 Почему: В реальности будущее неизвестно!

Ошибка: Применил one-hot encoding к признаку с 1000 уникальных значений ✅ Правильно: Группируй редкие категории или используй embedding 💡 Почему: Создашь слишком разреженную матрицу

🎓 Главное запомнить

✅ Feature engineering часто важнее выбора алгоритма ✅ Новые признаки = старые признаки + domain knowledge ✅ Всегда избегай data leakage

🔗 Связь с другими темами

Назад: Предобработка данных (урок 324) дала базу для трансформаций Вперед: Выбор модели (урок 326) - хорошие признаки сделают любую модель лучше Связано: Кросс-валидация поможет оценить качество твоих признаков

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!