No history yet

Инженерия признаков

Продвинутая обработка пропусков

Когда простые методы заполнения пропусков, такие как замена средним или медианой, не справляются, на помощь приходят более сложные подходы. Они учитывают взаимосвязи между признаками и позволяют восстанавливать данные с большей точностью.

Один из таких методов — KNNImputer. Его логика проста: чтобы заполнить пропуск, он находит k ближайших «соседей» (строк) с похожими значениями в других признаках и использует их для вычисления замены, например, как среднее значение. Это особенно эффективно, когда данные образуют четкие кластеры.

Более мощный инструмент — . Этот метод превращает задачу заполнения пропусков в серию регрессионных задач. Для каждого признака с пропусками он обучает модель, используя все остальные признаки для предсказания недостающих значений. Процесс повторяется в несколько итераций, и на каждом шаге прогнозы становятся все точнее, поскольку они делаются на основе уже частично заполненных данных.

import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# Пример данных с пропусками
X = np.array([
    [1, 2, np.nan],
    [3, 4, 5],
    [np.nan, 6, 7],
    [8, 9, 10]
])

# Инициализация импьютера
imputer = IterativeImputer(max_iter=10, random_state=0)

# Обучение и трансформация данных
X_filled = imputer.fit_transform(X)

print(X_filled)

Кодирование категорий высокой мощности

Стандартный One-Hot Encoding создает проблему при работе с признаками, у которых тысячи уникальных значений (например, почтовые индексы или ID товаров). Это приводит к так называемому «проклятию размерности» — огромному количеству разреженных признаков, что усложняет обучение модели и может снизить ее качество.

Здесь на помощь приходит Target Encoding (целевое кодирование). Идея в том, чтобы заменить каждую категорию средним значением целевой переменной, рассчитанным для этой категории. Например, если мы предсказываем отток клиентов, категорию «Город А» можно заменить на средний процент оттока именно в этом городе. Это позволяет сжать информацию из множества категорий в один числовой признак.

Главная опасность целевого кодирования — утечка данных. Если вычислять среднее по целевой переменной на всей обучающей выборке, модель получит прямой доступ к ответам, что приведет к переобучению. Чтобы этого избежать, кодирование выполняют внутри кросс-валидации или используют сглаживание.

Вариацией этого метода является Leave-One-Out Encoding (кодирование с исключением текущего). Для каждой строки среднее значение целевой переменной по ее категории вычисляется без учета самой этой строки. Это также является способом борьбы с утечкой данных.

Создание нелинейных и взаимодействующих признаков

Многие модели, особенно линейные, плохо улавливают нелинейные зависимости в данных. Если цена дома зависит не линейно от его площади, а, скажем, квадратично, модель этого не поймет. Мы можем помочь ей, добавив полиномиальные признаки. Инструмент PolynomialFeatures из sklearn автоматически генерирует новые признаки, являющиеся степенями и произведениями существующих.

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

# Два признака: площадь и количество комнат
X = np.array([[100, 3], [150, 4]])

# Создаем полиномиальные признаки 2-й степени
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

# Исходные признаки: [x1, x2]
# Результат: [1, x1, x2, x1^2, x1*x2, x2^2]
print(poly.get_feature_names_out(['площадь', 'комнаты']))
# ['1', 'площадь', 'комнаты', 'площадь^2', 'площадь комнаты', 'комнаты^2']

Член x1*x2 (в нашем примере площадь * комнаты) называется признаком взаимодействия (). Он позволяет модели учесть, что эффект одного признака может зависеть от значения другого. Например, дополнительная комната может по-разному влиять на цену в маленьких и больших домах. Создание таких признаков вручную на основе доменных знаний — один из самых творческих и важных этапов в работе специалиста по машинному обучению.

Извлечение признаков из данных

Сырые данные, такие как текст или временные метки, не могут быть напрямую использованы моделями. Их нужно преобразовать в числовые признаки.

Текстовые данные

Самый простой способ векторизации текста — CountVectorizer (мешок слов). Он создает матрицу, где для каждого документа подсчитывается частота каждого слова из словаря. Однако этот подход считает все слова одинаково важными.

Более продвинутый метод — (Term Frequency-Inverse Document Frequency). Он взвешивает слова не только по их частоте в документе (TF), но и по их редкости во всей коллекции документов (IDF). Чем реже слово встречается в других текстах, тем выше его вес. Это помогает выделить специфичные, важные для конкретного документа термины и снизить вес общих слов вроде «и», «в», «на».

Временные ряды

Из временных меток можно извлечь массу полезной информации: день недели, месяц, час, является ли день выходным. Для временных рядов (например, динамика продаж) ключевыми являются лаговые признаки и скользящие статистики.

  • Лаговые признаки (Lags): Значение показателя за предыдущий период (например, продажи вчера или в прошлом месяце). Это один из самых сильных предикторов для многих задач.
  • Скользящие окна (Rolling Windows): Агрегированные статистики (среднее, медиана, стандартное отклонение) за определенный период. Например, средние продажи за последние 7 дней могут показать недавний тренд.

Грамотная инженерия признаков — это сочетание технического мастерства, креативности и глубокого понимания бизнес-задачи. Зачастую именно этот этап, а не выбор самой сложной модели, вносит наибольший вклад в итоговый успех проекта.

Quiz Questions 1/5

Как метод KNNImputer заполняет пропущенные значения?

Quiz Questions 2/5

В какой ситуации Target Encoding (целевое кодирование) является наиболее подходящим методом?