TL;DR Программисты знают типы данных. Тип данных для переменной в языке программирования определяет набор допустимых операций с этой переменной — недопустимые операции вызовут ошибку либо во время компиляции, либо во время выполнения. Но что такое тип функции для программиста, плохо знакомого с машинным обучением, учитывая, что ни один из основных языков программирования не имеет встроенной поддержки для них? В этом посте мы определяем тип функции и обсуждаем, что означает тип функции в контексте магазина функций Hopsworks.

Введение

Новоиспечённые программисты знакомы со строками, целыми числами и логическими значениями. Языки программирования поддерживают типы данных на уровне языка. Но когда вы начинаете программировать с помощью платформ машинного обучения (ML), отсутствие поддержки типов объектов на уровне языка означает, что не существует такого же четко определенного набора операций над категориальными переменными, числовыми переменные и вложения. Например, в Python вы можете использовать инфраструктуру машинного обучения, такую ​​как Scikit-Learn, TensorFlow, XGBoost или PyTorch, и в каждой инфраструктуре существует свой набор допустимых операций для этих разных типов функций.

Хранилище функций — это общий уровень данных для платформ ML, поэтому поддержка типов функций в хранилищах функций требует четких и недвусмысленных операций, поддерживаемых как можно большим числом платформ ML более высокого уровня.

Магазин функций 101

Мы можем начать с определения того, что такое функция (для вас, инженеров данных).Функция – это просто переменная, которая является входными данными для модели машинного обучения. Хранилище функций. , такие как Hopsworks, помогает вычислять и сохранять функции. Функции обычно обрабатываются пакетами — DataFrames — когда вы обучаете модели и когда у вас есть пакетная программа, которая делает прогнозы с моделью.

Когда у вас есть онлайн-приложение, которое делает прогнозы с помощью модели машинного обучения, вам обычно требуется ряд (или вектор) функций. Например, чтобы порекомендовать пользователю ваш розничный веб-сайт, вы можете вычислить характеристики на основе его текущего сеанса (посещенные страницы, товары в корзине), а также исторические характеристики предыдущих посещений и контекстные характеристики — какие продукты в тренде прямо сейчас. Ваше веб-приложение, вероятно, не имеет состояния, а исторические и контекстные функции были предварительно вычислены и сохранены в хранилище функций. Ваше веб-приложение без сохранения состояния извлекает их в виде строк (векторов признаков), когда это необходимо для прогнозирования. В платформах Python ML вектор признаков, который используется моделью для прогнозирования, часто представляет собой массив NumPy или n-мерный тензор.‍

Функции сохраняются в вашем хранилище функций в виде табличных данных в виде строк/столбцов, где столбцы — это функции, а строки содержат значения функций вместе с сущностным (или первичным) ключом. strong> и необязательный столбец event_time, указывающий, когда наблюдались значения признаков.

Особенности Типы

В приведенной выше таблице каждый признак содержит либо количественную, либо качественную информацию. Количественные данные являются числовыми. Например, количество осадков или температура. Качественные данные являются дискретными, с конечным числом общеизвестных значений, таких как weather_description в приведенной выше таблице.

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

Таксономия типов объектов показана на рисунке ниже, где объектом может быть дискретная переменная (категориальная), непрерывная переменная (числовая) или массив (множество значений). Как и тип данных, каждый тип объекта имеет набор допустимых преобразований. Например, вы можете нормализовать числовую переменную (но не категориальную переменную) и можете сразу закодировать категориальную переменную (но не числовую переменную). Для массивов вы можете вернуть максимальное, минимальное или среднее значение из списка значений (при условии, что эти значения являются числовыми). Тип объекта помогает понять, какие агрегаты и преобразования можно применять к переменной.

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

Однако, если категориальный признак имеет естественный порядок, он называется порядковой переменной. Например, преобразованный ранее объект осадков (сухой, влажный, влажный, проливной) можно рассматривать как порядковую переменную, поскольку вы можете упорядочить значения в зависимости от количества осадков. Однако для порядковых переменных разница между любыми двумя значениями не имеет математического смысла. Например, добавление «сухого» к «влажному» не имеет никакого математического смысла. Медиану часто можно вычислить для номинальных переменных. Например, «влажно» — это среднее количество осадков в Ирландии.

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

Интервальная переменная — это числовая переменная, не имеющая понятия истинного нуля. То есть для нашей функции недоступно измерение «нулевого» уровня. Например, переменной интервала может быть weather_score (по шкале от 1 до 5). Мы можем рассчитать полезную статистику, такую ​​как среднее значение weather_score, но нет понятия истинного нуля — это отсутствие того, что вы пытаетесь измерить.

Переменная отношения — это числовая переменная со значащим нулевым значением, например функция температура выше. Интервальные переменные не имеют истинного нуля, поэтому вы можете складывать и вычитать значения только вместе со значением. Переменные отношения, благодаря истинному нулю, также можно делить и умножать, получая значимые результаты. Например, если мы говорим, что количество осадков за месяц удвоилось со 100 мм, мы знаем, что результат равен 200 мм, потому что удвоение относительно нуля.

Однако наша таксономия типов объектов не завершена. Последний класс функций, которые мы по-разному обрабатываем в хранилищах функций, — это массив переменных. Хотя массивы традиционно не считаются типом объекта, набор допустимых математических операций и преобразований, которые вы можете выполнять с ними, является таковым.

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

Вложение также является массивом — массивом чисел, часто с плавающей запятой. Более формально вложение — это отображение дискретного множества в векторное пространство, называемое пространством вложения. То есть встраивание — это низкоразмерное представление некоторых входных признаков, которое вычисляется с использованием алгоритма встраивания признаков. Например, в приведенной выше таблице есть функция под названием weather_photo_embed. Если у вас есть фотографии погоды, алгоритм встраивания преобразует и сожмет фотографии в небольшой массив фиксированной длины чисел с плавающей запятой — функции встраивания. Вложения можно использовать для поиска сходства. С нашими погодными фотографиями вы потенциально можете использовать вложение, чтобы найти погоду, похожую на погоду на фотографии. Встраивания также можно использовать для обучения модели, основанной на разреженной категориальной переменной. Встраивание может сжать вашу разреженную категориальную переменную, чтобы модель могла учиться на признаке более низкого измерения. Важным гиперпараметром вложений является их длина — будут ли они 4, 16, 32 или 200 поплавков?

Хранилище функций также может поддерживать списокзначений функций в виде одной функции, чтобы сократить затраты на разработку и оптимизировать затраты на хранение. Doordash поддерживает списки функций для снижения затрат на хранение, применяя сжатие перед сохранением списков в хранилище функций. Другой пример использования списка в качестве типа объекта — замена 10 отдельных объектов с 10 лучшими погодными местоположениями вчера одним объектом, содержащим все 10 местоположений. Затем разные пользователи списка могут преобразовывать его по-разному — получать лучшее местоположение, среднюю погоду в топ-10 местоположениях и т. д.

Хотя это и не особый тип функции, также может случиться так, что некоторые функции, используемые для обучения модели, не имеют предсказательной силы. Такие функции не имеют отношения к делу, и их следует идентифицировать, а затем удалять из обучающих данных, поскольку они замедляют обучение, затрудняют сходимость моделей и делают модели излишне большими. Хранилище функций может помочь вам определить бесполезные функции, анализируя данные обучения, например, определяя сильно коррелированные (избыточные) функции.

Учитывая различные типы функций, определенных здесь, интересно отметить, что функции в хранилище функций можно повторно использовать в контролируемых, неконтролируемых и самоконтролируемых моделях машинного обучения. Для контролируемого машинного обучения метка может быть функцией в хранилище функций или может поступать из внешнего хранилища данных. То есть метка в одной модели может быть функцией в другой модели. Данные обучения с самоконтролем могут быть большими по объему, и вместо копирования большого количества данных в хранилище функций некоторые хранилища функций поддерживают внешние таблицы, в которых функции могут быть зарегистрированы в хранилище функций, но сохранены в разных внешних источниках (таких как файлы parquet в озере данных или таблицы в хранилище данных, таком как Snowflake, BigQuery или Redshift).

Типы объектов как типы данных

На этом этапе важно отметить, что определенные здесь типы объектов являются абстрактными, и вы работаете с конкретными типами данных, когда программируете с массивами Numpy, фреймами данных Pandas или Spark или SQL-запросами. Типы данных, поддерживаемые вашим хранилищем функций, должны точно соответствовать платформам, которые вы используете для разработки функций. Все типы данных должны быть преобразованы в числовые данные, прежде чем они будут переданы в качестве обучающих данных или данных логического вывода. Модели машинного обучения принимают числа в качестве входных данных и предсказывают числа в качестве выходных данных, а типы объектов определяют набор допустимых функций преобразования, которые можно применять к типу данных. Без типа объекта хранилище объектов не всегда может знать, какие допустимые преобразования можно применить к объекту. Затем вам, программисту, остается решить, как преобразовать функцию в числовой формат, который будет принят вашей моделью.

Типы объектов и агрегаты

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

Типы элементов, представления элементов и преобразования

В Hopsworks вы записываете функции в группы функций (где функции хранятся) и считываете функции из представлений функций. Представление функций — это логическое представление функций, хранящихся в группах функций, и представление функций обычно содержит функции, используемые конкретной моделью. Таким образом, представления функций позволяют повторно использовать функции, хранящиеся в разных группах функций, во многих разных моделях.‍

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

Представление функций – это логическое представление (или интерфейс) набора функций, которые могут поступать из разных групп функций.

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

На приведенном выше рисунке мы видим, что функции для представления функций объединены из двух групп функций: weather_feature_group и surf_feature_group. Вы также можете видеть, что функции в представлении функций наследуют не только тип функций из своих групп функций, но и то, являются ли они первичным ключом и/или event_time. На рисунке также показаны функции преобразования, которые применяются к отдельным функциям после их считывания из групп функций. Функции преобразования являются частью типов объектов, включенных в представление объектов. Функции преобразования применяются как (1), когда объекты считываются как кадры данных с использованием автономного API (для создания обучающих данных или для пакетной оценки), так и (2) когда объекты считываются как векторы признаков с использованием онлайн-API. То есть функция в представлении функций определяется не только своим типом данных (целое число, строка и т. д.) или типом функции (категориальный, числовой, встраивание), но и любой применяемой к ней функцией преобразования. Представление функций гарантирует последовательное применение функции преобразования при создании пакетов данных для обучения и отдельных строк (векторов) для онлайн-прогнозов. Это решает проблему перекоса при обучении, когда функции преобразования, используемые для создания обучающих данных и используемых для онлайн-обработки векторов признаков, могут иметь разные реализации, что затрудняет диагностику ошибок производительности модели.‍

Выводы

Типы объектов — это полезное расширение типов данных для понимания набора допустимых операций над переменной в машинном обучении. Хранилище функций может использовать тип функции, чтобы помочь определить допустимые преобразования (нормализация, горячее кодирование и т. д.) для функций и при визуализации метрик функций. Вложения являются относительно новым типом функций и представляют собой массивы, и мы считаем, что старые примеры из учебников, где функции являются только категориальными или числовыми, нуждаются в обновлении, чтобы отразить первоклассный статус вложений в хранилищах функций, таких как Hopsworks.