Моделирование признаков#
Feature Engineering, или моделирование признаков — это процесс создания новых признаков (характеристик или фич) из имеющихся данных, чтобы улучшить работу модели машинного обучения.
Он может включать:
- преобразование данных;
- создание новых признаков на основе существующих;
- удаление ненужных;
- комбинирование нескольких фич.
Основная цель — сделать информацию более структурированной для модели, чтобы она лучше справлялась с задачей предсказания.
Что такое признаки объекта и зачем их создавать#
Модели машинного обучения работают с данными, представленными в различных форматах:
- Табличные: CSV-файлы, таблицы Excel, базы данных SQL.
- Текстовые: сообщения, отзывы, статьи и т. д.
- Временные ряды: числовые значения, упорядоченные по времени.
- Изображения: файлы JPEG, PNG и других форматов.
- Аудио: звуковые файлы, например WAV, MP3.
- Геопространственные: координаты и другая пространственная информация, например GeoJSON или shapefiles.
Чтобы извлечь из них полезную информацию, их нужно преобразовать в признаки.
Что такое признаки?#
Признаки (фичи, или features) — отдельные характеристики или свойства данных, которые используются моделью для обучения и предсказания.
Они описывают данные и позволяют алгоритму делать выводы.
Пример: в задаче предсказания цены дома признаками могут быть:
- площадь,
- количество комнат,
- возраст здания.
Какие бывают виды признаков#
Числовые признаки (Numeric features):
Агрегаты
: среднее, медиана, максимум, минимум, стандартное отклонение и т. д.Производные
: фичи, созданные путем математических операций с исходными данными, например изменение значения во времени или соотношение двух признаков.Полиномиальные признаки
: квадратичные или кубические значения существующих признаков.
Категориальные (качественные) признаки (Categorical features):
Бинарные признаки
: принимают два значения (например, пол: мужской/женский, наличие дефекта: да/нет).Множественные категории
: могут принимать множество значений (например, цвет карандаша: красный, синий, зеленый).Порядковые признаки (Ordinal features)
: имеют естественный порядок по уровням, но разница между уровнями может быть неравной (например, уровень образования: среднее, бакалавр, магистр, доктор).
Временные признаки (Temporal features):
- Дата и время
(например, дата последней покупки, время суток).
Текстовые признаки (Text features):
- Данные в текстовом формате, которые нужно преобразовать в числовые значения для использования в ML-модели.
Зачем проводить Feature Engineering#
Feature Engineering (генерация признаков) — это процесс преобразования, создания и отбора признаков (features), направленный на улучшение работы моделей машинного обучения. Ниже перечислены основные причины, по которым проводится этот процесс.
Повышение точности моделей
Хорошо подобранные признаки позволяют алгоритмам точнее распознавать закономерности в данных, что напрямую влияет на качество предсказаний.
Учет сложных зависимостей
Не всегда в исходных данных есть признаки, которые явно связаны с целевой переменной. Создание новых признаков, например в виде разностей, произведений или логарифмов, помогает выделить скрытые зависимости.
Упрощение модели
Путём генерации новых признаков можно сократить количество исходных переменных, объединив их в обобщающие характеристики. Это снижает размерность задачи и уменьшает риск переобучения.
Работа с различными типами данных
Многие модели требуют числовой вход. Текст, даты, временные ряды и другие типы данных предварительно преобразуются в числовую форму, пригодную для машинного обучения, с помощью генерации признаков.
Когда проводится моделирование признаков#
Моделирование признаков
(feature engineering) проводится после этапов очистки
и анализа данных
. Ниже представлен общий порядок разработки модели машинного обучения:
Этап | Описание |
---|---|
Сбор данных | Информация собирается из различных источников и объединяется в единый набор данных. |
Предобработка данных | Удаление пропусков, очистка, устранение выбросов, приведение к единому формату. |
Анализ и визуализация данных (EDA) | Исследование данных с целью выявления закономерностей, аномалий и предварительной подготовки. |
Моделирование признаков | Создание новых признаков или преобразование существующих для улучшения работы модели. |
Создание тренировочных и тестовых наборов | Разделение данных на обучающую и тестовую выборки. |
Выбор модели | Определение подходящего алгоритма машинного обучения. |
Обучение модели | Настройка модели на основе обучающей выборки. |
Оценка модели | Проверка модели на тестовых данных, анализ метрик качества. |
Тюнинг гиперпараметров | Настройка параметров модели, которые не изменяются в процессе обучения (например, скорость обучения, глубина дерева и т. д.). |
Внедрение модели | Развертывание модели в рабочем окружении для использования на практике. |
Этап 1. Анализ данных#
Хотя анализ данных (Exploratory Data Analysis, EDA) формально не относится к генерации фич, на этом этапе закладывается основа для работы с признаками. Описание EDA помогает связать логику всего процесса и объяснить, почему и как создаются новые фичи.
Анализ проводится для того, чтобы:
- Понять структуры данных — определить организацию данных, типы (числовые, категориальные, текстовые и т. д.), количество признаков и их взаимосвязь.
- Выявить пропуски и выбросы — определить места в данных, где есть пропуски, аномальные значения или выбросы, которые требуют обработки.
- Найти взаимосвязи — обнаружить взаимосвязи между различными признаками и целевой переменной, что помогает лучше понять важность признаков для модели.
- Проверить гипотезы — сформулировать и проверить гипотезы о данных, например влияние возраста клиента на его покупательские привычки.
EDA обычно включает визуализацию и статистический анализ:
-
Визуализация данных позволяет с помощью графиков, таких как гистограммы, коробчатые диаграммы, диаграммы рассеяния и тепловые карты, увидеть распределение данных, обнаружить аномалии и выявить взаимосвязи.
-
Статистический анализ помогает вычислить основные показатели, такие как среднее, медиана, стандартное отклонение и корреляция, чтобы лучше понять структуру данных и их характеристики.
Итог: четкое описание структуры данных, особенностей и важных взаимосвязей. Это помогает решить, какие фичи использовать, как их изменить, если это необходимо, или какие новые признаки стоит создать, чтобы улучшить модель.
Этап 2. Создание новых признаков#
Один из них — агрегация данных. С его помощью вычисляются статистические показатели, такие как среднее, сумма или медиана.
Например: средний доход клиента на основе его транзакций может стать полезным признаком для предсказания его финансового поведения.
Для временных рядов можно создать признаки, такие как:
- Лаги — значения предыдущих периодов, которые могут влиять на текущие;
- Скользящие средние — сглаженные данные, которые помогают выявить тренды;
- Временные признаки — день недели или месяц, которые учитывают сезонные или временные паттерны.
Полиномиальные признаки создаются путем возведения существующих признаков в степень или их комбинирования.
Например: квадрат площади квартиры может лучше предсказывать цену, чем сама площадь.
Также можно комбинировать категориальные признаки.
Например: объединение «города» и «типа недвижимости» может учесть различия в ценах на жилье в разных регионах.
Иногда применяются знания из предметной области. Это позволяет создавать фичи, специфичные для задачи.
Например: в финансовом анализе полезен коэффициент текущей ликвидности, который учитывает соотношение активов и обязательств компании.
Этап 3. Трансформация признаков#
Этап трансформации следует за созданием новых фич и направлен на приведение данных в форму, наиболее удобную для модели. Трансформация может включать в себя несколько различных методов, которые применяются в зависимости от типа данных и модели. Этот этап может выполняться многократно, по мере необходимости в процессе разработки.
Масштабирование (Scaling)#
Масштабирование — это один из важнейших шагов трансформации, особенно для алгоритмов, чувствительных к масштабу признаков (например, линейная регрессия, метод k-ближайших соседей, SVM). Суть масштабирования в том, чтобы привести все признаки к единому диапазону значений.
Примеры методов масштабирования:#
Нормализация (Min-Max Scaling): приводит значения признака в диапазон от 0 до 1, что помогает моделям быстрее сходиться и избегать проблем с численной стабильностью.
Формула:
где:
- x — исходное значение признака;
- min(x) — минимальное значение признака;
- max(x) — максимальное значение признака;
- x′ — нормализованное значение признака.
Пример кода для нормализации с scikit-learn (класс MinMaxScaler):
from sklearn.preprocessing import MinMaxScaler
# Создание объекта MinMaxScaler с диапазоном [0, 1]
scaler = MinMaxScaler(feature_range=(0, 1))
# Обучение и преобразование данных
X_scaled = scaler.fit_transform(X)
Стандартизация (Standardization)#
Стандартизация преобразует данные так, чтобы они имели нулевое среднее значение и стандартное отклонение, равное единице. Это часто используется в алгоритмах, которые предполагают нормальное распределение данных.
Формула:
где:
- x — исходное значение признака;
- μ — среднее значение признака;
- σ — стандартное отклонение признака;
- x_{\text{std}} — стандартизованное значение признака.
Пример кода для стандартизации с использованием scikit-learn (класс StandardScaler):
from sklearn.preprocessing import StandardScaler
# Создание объекта StandardScaler
scaler = StandardScaler()
# Обучение и преобразование данных
X_scaled = scaler.fit_transform(X)
Robust Scaling (робастное масштабирование)#
Robust Scaling применяется для данных с выбросами, которые могли остаться после очистки. Этот метод минимизирует влияние выбросов, используя медиану и интерквартильный размах вместо среднего и стандартного отклонения.
Формула:
где:
- x — оригинальное значение признака;
- median — медиана признака;
- IQR (интерквартильный размах) — разница между 75-м и 25-м процентилями (Q3 − Q1);
- X_{\text{robust}} — масштабированное значение признака.
Пример кода с scikit-learn (класс RobustScaler)#
from sklearn.preprocessing import RobustScaler
# Создание объекта RobustScaler
scaler = RobustScaler()
# Обучение и преобразование данных
X_scaled = scaler.fit_transform(X)
Трансформация для числовых признаков#
Логарифмическая трансформация: применяется для признаков с сильно скошенным распределением, где существует длинный хвост справа (например, доходы, цены), чтобы сделать данные более симметричными.
Каждый элемент признака заменяется на log (x + 1), где log может быть натуральным логарифмом (по основанию e) или логарифмом по другому основанию (например, по основанию 10).
Применяется, если есть данные о доходах, которые сильно варьируются (большинство людей имеют низкие доходы, но есть несколько с очень высокими доходами). Логарифмическое преобразование может помочь нормализовать данные.
Квадратный корень: используется для сглаживания скошенного распределения данных, особенно когда значения признаков варьируются в широком диапазоне. Это помогает уменьшить влияние больших значений на модель, но менее радикально, чем логарифмическая трансформация.
Каждый элемент признака заменяется на √x.
Применяется, если есть данные о количестве товаров, проданных в разных магазинах, а значения варьируются не столь экстремально; квадратный корень может помочь уменьшить разброс данных.
Трансформация Box-Cox: используется для того, чтобы стабилизировать разброс и сделать распределение данных более нормальным.
Этот метод более гибкий, чем логарифмическое или квадратное преобразование, так как включает параметр λ (лямбда), который оптимизируется для каждого признака.
Применяется для непрерывных данных с положительными значениями, которые сильно отклоняются от нормального распределения.
Трансформация для категориальных признаков#
One-Hot Encoding (OHE)#
One-Hot Encoding (OHE): преобразует категориальные признаки в бинарные, создавая новый столбец для каждой уникальной категории. Для этого есть специальный класс OneHotEncoder в библиотеке scikit-learn.
Для каждой категории создается отдельный бинарный признак. Например, категория «Цвет» с тремя значениями «Красный», «Зеленый», «Синий» преобразуется в три столбца:
- Красный: [1, 0, 0]
- Зеленый: [0, 1, 0]
- Синий: [0, 0, 1]
OHE стоит использовать, когда категориальные признаки не имеют порядка и количество категорий не слишком велико.
Label Encoding#
Label Encoding: присваивает каждой категории уникальное числовое значение. Можно сделать с помощью класса LabelEncoder в scikit-learn.
Каждой категории присваивается целочисленное значение. Например, признак «Размер» с категориями «Маленький», «Средний», «Большой» может быть преобразован в 0, 1 и 2 соответственно.
Label Encoding стоит использовать, когда существует естественный порядок категорий или когда One-Hot Encoding может излишне увеличить размерность данных.
Target Encoding#
Target Encoding: заменяет категории числовыми значениями, основанными на целевой переменной. Для этого используют класс TargetEncoder (например, из библиотеки category_encoders).
Для каждой категории вычисляется среднее значение целевой переменной, и это значение используется как новый числовой признак.
Стоит использовать, когда количество категорий велико и есть прямая зависимость категорий от целевой переменной.
Frequency Encoding#
Frequency Encoding: преобразует категории в числовые значения, основанные на частоте их появления в данных. Для этого можно использовать библиотеку pandas.
Каждой категории присваивается числовое значение, которое соответствует частоте ее встречаемости в данных. Например, если «Красный» встречается в 50% записей, ему присваивается значение 0.5.
Стоит использовать, когда важно сохранить информацию о распределении категорий и минимизировать размерность.
Ordinal Encoding#
Ordinal Encoding: применяется для категорий, которые имеют естественный порядок (например, уровень образования). В scikit-learn для этого есть класс OrdinalEncoder.
Каждой категории присваивается числовое значение в соответствии с их порядком. Например, «Среднее» = 1, «Высшее» = 2, «Аспирантура» = 3.
Стоит использовать, когда категории имеют естественный порядок и этот порядок важен для модели.
Rare Label Encodin#
Rare Label Encoding: объединяет редкие категории в одну общую, чтобы избежать переобучения и улучшить обобщающую способность модели. Для трансформации используют библиотеку pandas.
Категории, которые встречаются реже определенного порога (например, менее 1% данных), объединяются в одну новую категорию (например, «Другое»).
Стоит использовать, когда существует большое количество категорий и некоторые из них встречаются очень редко.
Трансформация для текстовых признаков#
Текстовые данные, в отличие от числовых, требуют особого подхода, поскольку текст нужно представить в формате, подходящем для анализа и обучения моделей. Для этого используют два метода:
- Токенизация— разделение текста на отдельные элементы (токены), чтобы текст мог быть представлен в числовом формате.
- Лемматизация и стемминг — приведение слов к базовой форме для уменьшения вариативности и упрощения анализа текста. Лемматизация приводит слова к их базовой форме (лемме), а стемминг удаляет окончания для получения корня слова.
После токенизации или лемматизации и стемминга текстовые элементы преобразуют в числовые представления следующими методами:
BoW (Bag of Words)
: создается словарь всех уникальных слов из текста, а затем для каждого документа строится вектор, где подсчитывается количество вхождений каждого слова.TF-IDF
(Term Frequency-Inverse Document Frequency): учитывает не только количество вхождений слова в документе, но и его значимость в контексте всех документов.Word Embeddings
: современные методы, такие как Word2Vec, GloVe или FastText, создают плотные векторы для слов, учитывая их контекст.N-граммы
: создание признаков на основе последовательности из n слов (например, биграммы — пары слов, триграммы — тройки слов).Sentiment Analysis
: извлечение тональности текста (положительная, отрицательная, нейтральная), что может быть полезным для конкретных задач.Topic Modeling
: выявление скрытых тем в текстах с использованием моделей, таких как LDA (Latent Dirichlet Allocation).
В результате трансформации данные становятся более пригодными для использования в модели. Этот этап также может периодически повторяться.
Этап 4. Отбор признаков (Feature Selection)#
Отбор признаков — это процесс выбора наиболее значимых переменных из исходного набора для построения модели и предотвращения переобучения.
Он основан на нескольких принципах:
- влияние признаков на целевую переменную,
- минимизация мультиколлинеарности (когда признаки сильно взаимосвязаны),
- улучшение интерпретируемости модели,
- снижение риска переобучения,
- повышение общей производительности.
Основные категории методов отбора признаков:#
1. Фильтрационные методы (Filter Methods)
Оценивают признаки на основе их статистических свойств:
- Корреляционный анализ — оценивает взаимосвязь между признаками и целевой переменной; сохраняются признаки с высокой корреляцией.
- Статистические тесты (например, тест Хи-квадрат для категориальных данных) — выбирают значимые признаки.
- Ранжирование признаков — оценивает важность признаков по частоте или значимости.
2. Встроенные методы (Embedded Methods)
Отбор признаков происходит в процессе обучения модели:
- Регуляризация (например, метод Lasso) — штрафует менее значимые признаки, что приводит к их исключению.
- Деревья решений (случайные леса, градиентный бустинг) — предоставляют встроенную оценку важности признаков.
3. Оберточные методы (Wrapper Methods)
Оценивают комбинации признаков по влиянию на производительность модели:
- Вперед-набор (Forward Selection) — признаки добавляются по одному с оценкой улучшения модели.
- Назад-отбор (Backward Elimination) — начинается с полного набора признаков и удаляет менее значимые.
- Брутфорс (Exhaustive Search) — перебирает все возможные комбинации признаков для поиска оптимального набора.
Особый метод:
- Рекурсивный отбор признаков (RFE) — поэтапно удаляет менее значимые признаки, оценивая их влияние на модель. Особенно полезен для моделей с оценкой важности признаков на основе коэффициентов или деревьев.
Методы уменьшения размерности:#
- PCA (Главные компоненты) — выделяет главные компоненты для снижения размерности данных.
- LDA (Линейный дискриминантный анализ) — создает линейные комбинации признаков, повышая разделимость классов.
Инструменты для отбора признаков:#
- Scikit-learn — популярная Python-библиотека с реализациями различных методов отбора.
- XGBoost и LightGBM — градиентный бустинг с встроенной оценкой важности признаков.
- Feature-engine и FeatureSelect — специализированные библиотеки Python для продвинутого отбора и создания признаков.
- SHAP и LIME — инструменты для интерпретации модели и оценки вклада признаков.
Warning
Изучите документацию scikit-learn Извлечение признаков, Предварительная обработка данных, Восстановление пропущенных значений