Feature Store
Хранилище признаков задаёт, хранит и предоставляет признаки ML, чтобы при обучении и предсказаниях в реальном времени использовались одни и те же значения. Предусмотрены офлайн- и онлайн-хранилища.
Хранилище признаков — это система данных, которая определяет, вычисляет, хранит и предоставляет входные признаки для моделей машинного обучения, чтобы во время обучения модель видела те же значения признаков, что и при прогнозировании в реальном времени. Признак — это один вход модели, например количество операций по карте за последний час, средний рейтинг товара или векторное представление изображения. Хранилище содержит определение каждого признака и всю его историю в офлайн-хранилище для формирования обучающих выборок, а также последнее значение в онлайн-хранилище для быстрого получения во время прогнозирования. Uber описала общее хранилище признаков в публикации 2017 года о платформе машинного обучения Michelangelo. Затем появились Feast — хранилище признаков с открытым исходным кодом, созданное Gojek совместно с Google Cloud, — а также управляемые хранилища признаков в Amazon SageMaker, Google Vertex AI, Azure Machine Learning и Databricks.
Как работает хранилище признаков#
Признаки начинаются с исходных событий и таблиц, а конвейеры преобразуют их во входные данные модели с помощью проектирования признаков, например подсчёта операций по карте за скользящий часовой интервал, или извлечения признаков с помощью нейронной сети. Хранилище признаков организует эту работу в несколько компонентов:
- Реестр признаков: имя каждого признака, ключ сущности (клиента, карты, товара или камеры, которые он описывает), тип данных, код преобразования, владелец и версия. Реестр поддерживает поиск, чтобы команды могли повторно использовать признаки, а не создавать их заново.
- Офлайн-хранилище: все исторические значения с временными метками событий, хранящиеся в хранилище данных или озере данных и используемые для создания обучающих выборок и пакетной оценки.
- Онлайн-хранилище: последнее значение для каждой сущности в базе данных «ключ — значение», например Redis или DynamoDB. Значение считывается за несколько миллисекунд во время инференса.
- Материализация: пакетные задания или задания потоковой обработки, которые вычисляют новые значения и копируют самые свежие из офлайн-хранилища в онлайн-хранилище.
Во время прогнозирования такая служба, как проверка на мошенничество, отправляет идентификатор карты, получает её текущие признаки из онлайн-хранилища и передаёт их модели. Это позволяет поддерживать задержку инференса достаточно низкой для инференса в реальном времени при оплате.
Корректность на момент времени#
Каждая строка обучающей выборки должна содержать значения признаков, актуальные на момент события, для которого указана метка. Значение, вычисленное позже, содержит информацию из будущего — это разновидность утечки данных, из-за которой модель выглядит точной при офлайн-оценке, но не справляется в production. Хранилища признаков предотвращают это с помощью соединений с учётом момента времени: для каждой метки они выбирают последнее значение признака для той же сущности, полученное не позже временной метки метки. Функция pandas merge_asof выполняет такое же соединение:
import pandas as pd
# Офлайн-хранилище: количество транзакций по каждой карте за последний час с записью во времени
features = pd.DataFrame(
{
"card_id": ["A", "B", "A", "A"],
"time": pd.to_datetime(["2026-10-01 09:00", "2026-10-01 10:00", "2026-10-01 12:00", "2026-10-01 15:00"]),
"txn_count_1h": [1, 2, 4, 9],
}
)
# События с метками для обучения: была ли каждая транзакция мошеннической?
labels = pd.DataFrame(
{
"card_id": ["B", "A"],
"time": pd.to_datetime(["2026-10-01 11:00", "2026-10-01 13:30"]),
"is_fraud": [0, 1],
}
)
# Соединение с учётом момента времени: для каждой метки выбирается последнее значение признака карты, полученное не позже времени события
training_rows = pd.merge_asof(labels, features, on="time", by="card_id")
print(training_rows)Метка мошенничества для карты A в 13:30 получает значение 4, записанное в 12:00, а значение 9, записанное в 15:00 после транзакции, не попадает в обучающую выборку. Метка карты B в 11:00 получает собственное значение 2, поскольку аргумент by сопоставляет строки по ключу сущности.
Расхождение между обучением и обслуживанием#
Расхождение между обучением и обслуживанием — это различие между признаками, на которых обучали модель, и признаками, которые она получает в production. Оно возникает, когда пакетное SQL-задание вычисляет признаки для обучения, а отдельно написанный код приложения — признаки для обслуживания, и эти два варианта различаются часовыми поясами, границами временных окон, единицами измерения или способом заполнения пропущенных значений. В правилах машинного обучения Google этому расхождению посвящён отдельный раздел; там рекомендуется записывать признаки, использованные во время обслуживания, чтобы при последующем обучении можно было использовать именно эти значения. Хранилище признаков устраняет дублирующий путь обработки: оно вычисляет каждый признак один раз по единому определению для обоих сценариев. Кроме того, оно фиксирует актуальность данных, пропуски и дрейф данных для каждого признака, чтобы мониторинг модели мог связать падение точности с проблемой входных данных.
Хранилище признаков и смежные системы#
- Озеро данных: Хранит исходные и обработанные файлы в любых форматах. Многие офлайн-хранилища находятся внутри озера данных, а хранилище признаков добавляет поверх него ключи сущностей, временные метки, извлечение с учётом момента времени и онлайн-обслуживание.
- Векторная база данных: Находит сохранённые эмбеддинги, наиболее похожие на вектор запроса. Хранилище признаков извлекает значения по идентификатору сущности и может хранить эмбеддинги как один из признаков наряду с количествами, средними значениями и категориями.
- Реестр моделей: Хранит версии обученных моделей и их метаданные, а хранилище признаков — версии входных данных, которые используют эти модели.
- Обслуживание моделей: Запускает модель за API и обращается к онлайн-хранилищу, чтобы получать признаки для каждого запроса.
Признаки из компьютерного зрения#
Видеоаналитика преобразует видеопотоки с камер в признаки для прогнозирования, обнаружения аномалий и предиктивного моделирования: почасовое количество посетителей у входа в магазин, длина очередей на кассе или доля дефектов на производственной линии — каждый показатель привязан к идентификатору камеры или линии и временной метке. В розничной торговле подсчёт людей помогает моделям планировать персонал и спрос, а в производстве количество дефектов за смену используется моделями обслуживания оборудования. Подсчёт объектов Ultralytics YOLO напрямую формирует такие значения: он отслеживает каждый обнаруженный объект между кадрами и возвращает накапливаемые итоги in_count и out_count, а также количество объектов каждого класса при пересечении линий или областей. Эти значения готовы к записи в хранилище признаков с временными метками для каждой камеры.










