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

Въведение

В машинното обучение смятам, че функциите на разходите са често пренебрегвана част от процеса на решаване на проблеми. Много изследователи на данни се вълнуват от използването на нов модел или настройката на хиперпараметрите точно така, за да получат възможно най-добрата производителност. Обикновено сме склонни да изберем една от общите функции на разходите, като средна квадратна грешка, и да преминем към обучение, без да се замисляме. Бих казал обаче, че отделянето на време за мислене и разбиране на това какво означава функция на разходите и как тя влияе върху представянето на даден модел може да окаже значително влияние върху резултата от даден проект. И така, за да проуча тази идея по-нататък, пуснах модифицирана версия на популярното игрално шоу The Price is Right. В този мой експеримент разгледах как различните функции на разходите влияят върху производителността на модела, включително как мога да напиша собствени функции, които са по-специфични за проблема, който исках да разреша, за да подобря още повече резултатите.

Значението на функциите на разходите

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

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

Какво е функция на разходите?

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

Ролята на функцията на разходите

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

Един начин, по който намирам за ценен да мисля за функциите на разходите, е да ги разглеждам като отражение на общата цел на модела. Каквато и математическа функция да бъде избрана да бъде минимизирана чрез градиентно спускане, трябва да бъде в съответствие с това, което искаме моделът да направи колкото е възможно повече. Нека да разгледаме шоуто за игри The Price is Rightкато пример. Целта на тази игра е да се предскаже цената на артикул възможно най-точно, без да се гадае върху действителната цена. И така, как функцията на разходите може да отрази това? Искаме нашата функция на разходите да каже на нашия модел да прави прогнози, без да прекалява с истината. Изглежда доста разбираемо, нали? Така че защо всеки учен по данни не пише винаги персонализирана функция за загуба за всеки различен проблем, който решава?

Избор на функция на разходите

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

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

Цената е правилна

Ако не сте запознати с игровото шоу The Price is Right,играта е доста проста. Четирима състезатели излизат отпред, за да се състезават помежду си. Показани са и артикул и всички трябва да познаят колко струва. Състезателят, който познае най-близо до действителната цена, без да я превишава, печели и преминава към следващия кръг. Така че очевидният въпрос, който повечето рационални хора биха задали е следният: „Мога ли да създам модел за машинно обучение, който да ми помогне да спечеля в първия кръг на Цената е правилна?“

Данните

За да обуча модел, който да ми помогне да спечеля The Price is Rightизползвах данни от Amazon Toy Dataset, който е достъпен в Kaggle. Преди да се захвана с експериментите си, направих известно почистване на данни и използвах някои основни NLP, за да създам функции за прогнозиране на цените на играчките в данните. Ако се интересувате да видите как точно го направих, можете да разгледате този бележник тук. Окончателният ми кадър с данни изглеждаше така:

Настройката на експеримента

За този експеримент реших да използвам Microsoft’s LightGBM. Това е изключително популярен модел и в момента един от любимите ми. Той също така позволява някои лесни начини за настройка на функциите на разходите и оценката. Що се отнася до функциите на разходите, реших да тествам 5 различни варианта. Използвах 2 базови линии, функциите MAE и MSE, вече внедрени от LightGBM. След това написах 3 потребителски функции, които също да тествам. Настроих хиперпараметрите на модела към MAE и ги запазих еднакви за всички итерации на модела с едно и също случайно състояние. Така че ако не друго, опитах се да дам предимството на базовата линия в моя експеримент.

Следва оценката на функциите на разходите. Реших да оценя няколко различни аспекта на представянето на модела. Първото извиках общи печалби. В опит да се повтори донякъде Цената е правилна,общите печалби бяха изчислени, както следва: Ако прогнозата беше над истината, печалбите бяха равни на нула. Ако прогнозата беше под истината, печалбите бяха равни на прогнозата. Този тип оценка придава по-голяма тежест на елементи с по-висока стойност. Поради това оцених и стандартизираните печалби, които бяха изчислени по следния начин: Ако прогнозата беше над истината, печалбите бяха равни на нула. Ако прогнозата е под истината, печалбите са равни на прогнозата, разделена на истината. Този метод дава еднаква тежест на всеки елемент в тестовия набор. В допълнение към тези методи, изчислих процента на елементите, които са свръхпредсказани от всеки модел. По-долу е класът, който създадох, за да оценя моделите.

Писане на функции на разходите

LightGBM използва два различни типа функции за обучение на модел. Първият е този, за който говорих по-горе. Това е целевата функция. Това е функцията, която изчислява градиента на функцията на разходите, за да помогне на модела да се научи. LightGBM е уникален с това, че използва както първата, така и втората производна в своето обучение. Ще видите, че имам и двете по-долу. Вторият тип функция е функция за оценка. В този експеримент използваме набор за оценка и ранно спиране, за да обучим нашите модели. Моделът използва функцията за оценка, за да определи кога определен показател спира да се подобрява. Когато достигне тази точка, моделът спира обучението за оптимизиране на този показател. За моя експеримент написах една целева функция, която използвах с три различни функции за оценка.

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

overprediction_penalty_objective: Това е нашата целева функция. Това е проста вариация от MSE. Ние изчисляваме 1-ва и 2-ра производна на MSE и умножаваме загубата по неустойка, когато прогнозата е по-голяма от истинската стойност.

overprediction_penalty_squared:Това е първата ни функция за оценка. Това също е вариант на MSE с наказание за свръхпредсказания.

overprediction_penalty_absolute:Това е вариант на MAE с наказание за свръхпрогнози.

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

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

Резултати

За всяка функция на разходите разгледах най-добрите резултати както за общи печалби, така и за стандартизирани печалби. Ето резултатите за общите печалби.

От тези резултати можем да видим, че нашата персонализирана целева функция, съчетана с нашата функция за оценка на специфичен проблем, се представи най-добре, последвана от нашата персонализирана функция за оценка на MSE. Интересно е също така да се отбележи, че функциите на разходите се представиха най-добре с различни санкции. Ще отбележа, че при всяко наказание това не е редът, в който са завършили разходните функции. В някои печели специфичната оценка на проблема, в някои печели персонализираната MSE, а в една версия печели обикновената MAE. Това предполага, че в повечето случаи ще трябва да се занимавате с наказания и хиперпараметри, за да определите най-добрия модел. Сега за стандартизираните печалби.

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

Последни мисли

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

Ако се интересувате от разглеждане на други начини за писане на персонализирани функции, scikit-learn също го поддържа. Можете също да пишете персонализирани функции за разходи както в TensorFlow, така и в PyTorch. Мисля, че си струва да отделите време, за да разберете функциите на разходите и как те могат да променят производителността на вашите модели.