
Эта статья описывает пример как можно с помощью публичных Python библиотек быстро улучшить качество вашей ML модели за счет обогащения релевантными внешними данными.
Введение
Данные — это топливо для всех моделей машинного обучения. Чем больше у нас есть данных, тем более точные и стабильные модели мы можем получить. Даже если нам удалось построить хороший алгоритм машинного обучения, модели отразят только то что содержится во входных данных. Таким образом, неудивительно, что главная рекомендация при необходимости улучшить любую модель — это всегда, по возможности, добавить больше релевантных данных.
Получение большего объема данных — задача не из легких, и нам, возможно, придется потратить часы на создание новых информативных признаков. Но они скорее всего будут иметь высокую корреляцию с уже имеющимися признаками. Как же найти новый класс данных, который не будет скоррелирован с имеющимися данными? Именно для этой задачи пригодится библиотека Upgini.
Python библиотека для поиска внешних данных
Upgini — это библиотека для поиска и обогащения признаков (feature search and enrichment) которая работает в Python среде. Она выполняет поиск по тысячам публичных и общедоступных источников данных, а затем создаёт новые признаки, которые увеличивает точность ML моделей. Эти новые признаки повышают точность и предсказательную силу моделей.
Upgini охватывает широкий спектр источников данных — как открытых, так и предоставленных DS: исторические погодные данные, международные праздники, уровень инфляции по раличным товарным группам, цены на жильё, данные публичных профилей в социальных сетях и многое другое. Несмотря на огромный объём обрабатываемой информации, результаты появляются достаточно быстро.
У нас есть типовая задача - найти дополнительные данные, чтобы улучшить качество модели, но не все данные полезны. Они должны быть релевантными и обладать информативной ценностью. Если просто добавлять в модель любые данные без оценки их значимости, это принесёт больше вреда, чем пользы: повысит вычислительные затраты и может снизить точность.
Поэтому при добавлении новых признаков важно следить, чтобы они не были избыточными. К счастью, Upgini делает это за нас: она не только создаёт признаки, но и оценивает их с помощью SHAP-значений — популярной метрики, используемой для интерпретации и объяснения моделей машинного обучения. Таким образом, вам не нужно беспокоиться о том, насколько релевантен новый признак. Более того, библиотека также вычисляет SHAP-значения для признаков, уже присутствующих в наборе данных, что делает её особенно полезной.
В этой статье мы разберём процесс поиска релевантных внешних данных на реальном примере. Вы будете удивлены, насколько просто можно улучшить метрики точности модели.

Процесс поиска внешних данных на самом деле довольно прост.
Мы передаём в Python библиотеку ключи для поиска данных, собственные признаки (при их наличии) и целевую переменную — и библиотека находит новые признаки, генерирует производные признаки с единственным критерием - новые признаки должны улучшать качество предсказания вашего целевого события относительно уже имеющихся у вас данных.
Прежде чем перейти к практическому примеру, стоит упомянуть два важных понятия: Search Keys (ключи поиска) и SHAP-значения.
Search Keys (ключи поиска)
При запуске поиска данных нам необходимо указать столбцы, которые содержат ключи поиска. Ключ поиска в Upgini определяет, какие столбцы будут использоваться для сопоставления записей с потенциальными внешними источниками данных.
На данный момент поддерживаются следующие типы ключей поиска:
Date / datetime — дата или временная метка
Postal / ZIP code — почтовый индекс
Country — страна
Phone number — номер телефона
Hashed email — хэшированный адрес электронной почты
IP-address — IP-адрес
Например, если в наборе данных есть столбец с датами и мы определим его как search key, Upgini будет использовать значения из этого столбца для поиска записей во внешних источниках данных.
SHAP values
Когда Upgini находит признаки, которые потенциально могут повысить точность модели, она также вычисляет SHAP-значения — метод, основанный на теории игр.
SHAP (SHapley Additive exPlanations) часто используется в моделях машинного обучения для объяснения того, насколько каждый признак влияет на предсказания модели.
Кроме того, Upgini вычисляет SHAP-значения и для уже существующих признаков, чтобы можно было сравнить их вклад с новыми признаками. Таким образом, вы получаете наглядное представление о том, какие признаки действительно улучшают качество модели.
Поиск новых фичей для ML модели
В качестве примера мы будем использовать задачу из соревнования Kaggle — Store Item Demand Forecasting Challenge. Задача заключается в прогнозировании ежедневных продаж пар «магазин–товар». В этой статье мы разберём основные моменты, однако подробный туториал можно найти в соответствующем ноутбуке на GitHub.
Перед запуском поиска данных необходимо предварительно подготовить данные с помощью Pandas.
Вот как выглядит набор данных в виде DataFrame в Pandas:

Признаки в нашем наборе данных: date, store и item, а целевая переменная — sales.
Мы разделяем DataFrame на обучающую и тестовую выборки, а затем отделяем признаки от целевой переменной следующим образом:
# train-test split
train = df[df[“date”] < “2017–01–01”]
test = df[df[“date”] >= “2017–01–01”]
# separate features from the target
train_features = train.drop(columns=[“sales”])
train_target = train[“sales”]
test_features = test.drop(columns=[“sales”])
test_target = test[“sales”]
Теперь мы можем приступить к поиску новых данных.
Шаг 1. Установить библиотеку Upgini и подключить нужные модули
pip install -Uq upgini
from upgini import FeaturesEnricher, SearchKey
from upgini.metadata import CVType
Шаг 2. Создать объект FeaturesEnricher для поиска данных.
enricher = FeaturesEnricher(
search_keys = {
"date": SearchKey.DATE,
},
cv = CVType.time_series
)
Мы создали объект FeaturesEnricher, называемый enricher
. Ключи для поиска данных (search keys) были заданы в виде пар «ключ–значение» внутри словаря Python. Ключом является название столбца, а значением — тип поискового ключа Upgini. В этом примере используется только поисковый ключ типа "дата".
Затем мы задаём кросс-валидацию через параметр cv
. Поскольку данные представляют собой временной ряд, мы используем специальный тип кросс-валидации для временных рядов — CVType.time_series
.
Шаг 3. Запустить поиск данных.
Следующий шаг — запустить поиска через вызов объекта enricher
на обучающем наборе данных и получить список релевантных внешних данных, которые подходят для нашего эталона. Обе эти операции можно выполнить одним шагом, как показано ниже:
enricher.fit(train_features,
train_target,
eval_set=[(test_features, test_target)]
)
Upgini автоматически определит тип задачи, который в данном случае является регрессией.
И найдет релевантные внешние данные. Для этой задачи нашлось 25 признаков. Вот топ-5 из них: на первых двух местах стоят признаки из моего датасета. Далее идут найденные внешние данные.

Если вы хотите увидеть все признаки и их значения SHAP, вы можете посмотреть их тут. По ссылке доступен полный ноутбук запуска, обогащения с результатами.
Метрика, используемая в этом соревновании на Kaggle — это симметричная средняя абсолютная процентная ошибка (SMAPE). Значения SMAPE до и после обогащения новыми признаками:
До обогащения: 37.65
После обогащения: 14.86
Мы видим значительное сокращение ошибки. Следовательно, можно сделать вывод, что признаки, найденные с помощью Upgini, улучшили точность модели.
Прогнозирование продаж имеет ключевое значение для любого ритейлера. Это также известно как прогнозирование спроса и влияет на весь рабочий процесс ритейлера, включая закупки, ценообразование и управление запасами. Поэтому предоставление информативных признаков, которые помогают лучше предсказывать продажи, имеет высокую ценность.
Другие ключи поиска
В примере выше мы использовали поиск по дате. Upgini также поддерживает следующие ключи поиска:
Почтовый индекс / ZIP-код
Страна
Номер телефона
Хешированный email
IP-адрес
Процесс поиска полезных фичей такой же, как при использовании даты. Нужно указать название столбца и тип ключа поиска.
Рассмотрим пример: у нас есть размеченный датасет, содержащий адреса электронной почты и пол их владельцев. Мы хотим создать модель, которая предсказывает пол по email. Вот как можно искать новые признаки с помощью объекта enricher
:
enricher = FeaturesEnricher(
search_keys = {'email': SearchKey.EMAIL}
)
enricher.fit(X_train, y_train, calculate_metrics=True)
X_train
содержит признак — адрес электронной почты, а y_train
— информацию о поле в тренировочном наборе.
Итого
Python библиотеку Upgini можно использовать во множестве задач для поиска новых полезных фичей, улучшающих качество модели. Учитывая огромное количество времени, которое тратится на настройку гиперпараметров для незначительного увеличения точности, добавление новых признаков с помощью Upgini определённо стоит попробовать каждому Дата Саинтисту и ML разработчику.