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

Въведение

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

„Хранилището на функции“ е общ слой данни за ML рамки, така че поддръжката на типове функции в магазините на функции изисква ясни и недвусмислени операции, поддържани от възможно най-много ML рамки на по-високо ниво.

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

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

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

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

Типове функции

В таблицата по-горе всяка характеристика съдържа количествена или качествена информация. Количествените данни са числени. Например количеството на валежите или температурата. Качествените данни са дискретни, с краен брой добре известни стойности, като описание_на_времето в таблицата по-горе.

Понякога преобразувате количествени данни в качествени, така че машинното обучение да може по-лесно да намира модели в данните. Например, може да решите, че стойностите на характеристиките на валежите и температурата са оскъдни и нямате достатъчно данни за обучение, така че ги трансформирате в категорични променливи. Например вашите примери за обучение може да имат различни стойности за температурата и валежите и за вашия модел става по-трудно да научи модели във вашите данни. Ако обаче преобразувате валежите в категории — [сухи, влажни, влажни, проливни], вашият модел може по-лесно да се научи да прогнозира дали количеството на валежите ще бъде в една от тези категории.

Таксономия на типовете характеристики е показана на фигурата по-долу, където функцията може да бъде дискретна променлива (категорична), непрекъсната променлива (числова) или масив (много стойности). Точно като тип данни, всеки тип функция има набор от валидни трансформации. Например, можете да нормализирате числова променлива (но не и категорична променлива) и можете да кодирате еднократно категорична променлива (но не и числена променлива). За масиви можете да върнете максималната, минималната или средната стойност от списък със стойности (ако приемем, че тези стойности са числени). Типът функция ви помага да разберете какви агрегации и трансформации можете да приложите към променлива.

Категориалните характеристики се основават на дискретни данни. Ако категориален признак няма естествено подреждане (като функцията време от таблицата по-горе), ние го наричаме номинална променлива. Една често срещана операция върху номинални променливи е да се преброи честотата на възникване на различните им дискретни стойности, често през прозорци от време. Можете също така да идентифицирате „режима“ или най-честата дискретна стойност във вашата номинална променлива, но не можете да изчислите медианата за номинална променлива.

Ако обаче категоричният признак има естествен ред, той се нарича ординална променлива. Например нашата трансформирана характеристика за валеж от по-рано (сухо, влажно, влажно, проливно) може да се счита за ординална променлива, тъй като можете да подредите стойностите въз основа на количеството на валежите. За порядковите променливи обаче разликата между които и да е две стойности няма математическо значение. Например добавянето на „сухо“ към „влажно“ няма никакъв математически смисъл. Медианата често може да бъде изчислена за номинални променливи. Например „влажно“ е средният валеж за Ирландия.

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

Интервална променлива е числова променлива, която няма концепцията за истинска нула. Тоест няма налично измерване на „нулево“ ниво за нашата функция. Например интервална променлива може да бъде weather_score (по скала от 1 до 5). Можем да изчислим полезна статистика, като средния weather_score, но няма понятие за истинска нула — липса на нещо, което се опитвате да измерите.

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

Нашата таксономия на типовете функции обаче не е пълна. Последният клас функции, с които работим по различен начин в магазините за функции, е масив от променливи. Докато масивите традиционно не се считат за тип функция, наборът от валидни математически операции и трансформации, които можете да извършите върху тях, е такъв.

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

Вграждането също е масив - масив от числа, често плаващи. По-формално, вграждането е картографиране от дискретно множество към векторно пространство, наречено пространство за вграждане. Това означава, че вграждането е по-нискоизмерно представяне на някои входни характеристики, което се изчислява с помощта на алгоритъм за вграждане на характеристики. Например в таблицата по-горе има функция, нареченаweather_photo_embed. Ако имате снимки на времето, алгоритъм за вграждане ще трансформира и компресира снимките в малък масив с фиксирана дължина от числа с плаваща запетая - функциите за вграждане. Вграждането може да се използва за търсене на сходство. С нашите метеорологични снимки потенциално бихте могли да използвате вграждането, за да намерите времето, подобно на времето на снимката. Вгражданията могат също да се използват за обучение на модел, който се основава на разредена категорична променлива. Вграждането може да компресира вашата разредена категорична променлива, така че моделът да може да се учи от функцията с по-ниско измерение. Важен хиперпараметър на вгражданията е тяхната дължина - дали ще бъдат 4 или 16 или 32 или 200 float?

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

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

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

Типове характеристики като типове данни

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

Типове функции и агрегати

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

Типове характеристики, изгледи на функции и трансформации

В Hopsworks пишете характеристики в групи характеристики (където се съхраняват функциите) и четете характеристики от изгледи на функции. Изгледът на функции е логичен изглед върху функции, съхранени в групи функции, а изгледът на функции обикновено съдържа функциите, използвани от конкретен модел. По този начин изгледите на функции позволяват функции, съхранени в различни групи функции, да бъдат повторно използвани в много различни модели.‍

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

Изгледът на функции е логичен изглед върху (или интерфейс към) набор от функции, които може да идват от различни групи функции.

Изгледът на функции е логичен изглед на функции, които се използват от модел (за обучение и обслужване). Функциите в изглед на характеристики съдържат както типа данни, така и всички функции за трансформация, приложени към характеристиката. Като такъв, изгледът на функции разширява типа на функцията от група функции, като добавя незадължителна функция за трансформация към типа.

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

Изводи

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