Изграждане и оптимизиране на модел е важна стъпка при решаване на цялостна задача чрез средствата на машинното обучение. Различните алгоритми имат редица параметри, които могат да се настроят така, че да се подобри работата на модела. Посоките на подобрение са 2 – получаване на по-добри резултати и по-бърза скорост на работа.
В зависимост от модела и параметрите му, предприетите подходи могат да бъдат различни – емпиричен, при който правим множество опити, като сами задаваме различни стойности и сравняваме получените резултати, или чрез изчисления търсим оптимално решение.
3 начина за оптимизация
Оптимизацията на модели е обширна тема и различните методи, които можем да приложим са много. Обикновено в началото се започва с ръчни настройки, като това позволява да добием представа как работи самият алгоритъм, който стои зад модела. Можем да оставим някои параметри със стойностите им по подразбиране, а други да ги променим в зависимост от това какво искаме да постигнем. Има обаче по-ефективен начин за оптимизация на моделите – използване на специални средства за автоматизация, така че търсенето да не е случайно налучкване на стойности, а да има системен подход за подбора им.
Съществуват множество библиотеки, които съдържат методи за оптимизация на моделите. Те дават много възможности и варианти за тест с най-различни комбинации от параметри и техните стойности. В тази статия ние ще разгледаме 3 от тях:
- Решетъчно и рандомизирано търсене
- Бейсова оптимизация с библиотеката Hyperopt
- Оптимизация с библиотеката Optuna
Всеки от тях се използва по сходен начин, като се изгражда пространство с конкретни параметри и списък с техните възможни стойности, през които да минава алгоритъмът и да търси най-добрата комбинация. Разликите се състоят в това по какъв начин се подбират стойностите.
За някои параметри можем да определим стойностите от естеството на данните, но за други, при които няма ориентир, е добре да използваме някой от начините за оптимизация.
Решетъчно и рандомизирано търсене (Grid Search & Randomized Search)
Решетъчното и рандомизирано търсене са лесни за разбиране и прилагане методи за оптимизация на модел. Те използват кръстосано валидиране, като броят отделните части се задава от нас като параметър. По подразбиране стойността му е 5.
- Решетъчно търсене (sklearn.model_selection.GridSearchCV)
При този метод моделът се обучава с всичките възможни комбинации от параметри и техните стойности докато не открие най-добрите на базата на конкретен оценител (обща точност, средна абсолютна грешка и т.н.). Например имаме модел, който класифицира продукти и искаме да го оптимизираме така, че общата точност на да е най-висока.
Решетъчното търсене е подходящо да се използва, когато броят на параметрите и стойностите им е малък, тъй като този метод преминава през всички техни комбинации и ако стойностите са много, е бавен и е възможно да отнеме много дълго време за оптимизация на модела.
- Рандомизирано търсене (sklearn.model_selection.RandomizedSearchCV)
Този метод работи по подобен начин на решетъчното търсене, като разликата е в това, че при обучението се преминава само през част от възможните комбинации на параметрите, което го прави и по-бърз. Ние задаваме колко на брой да са те, като алгоритъмът след това ги избира на случаен принцип и накрая получаваме тези, при които резултатите са най-добри, като това е отново на базата на определен оценител.
Двата метода са доста ефективни, особено ако се използват заедно. Например ако имаме голям брой параметри и дълъг списък от стойности може да се направят няколко итерации с рандомизирано търсене, след което върху приложените резултати да се използва решетъчно търсене. Тук обаче има един недостатък – не се взимат под внимание предишните итерации при подбора на оптимални стойности, както е при следващите 2 начина за оптимизация, които ще разгледаме.
Бейсова оптимизация с библиотеката Hyperopt
Hyperopt е библиотека, която е създадена специално за оптимизация на модели. При нея подходът е вероятностен и в центъра ѝ стои Бейсовата оптимизация като метод за откриване на оптималните параметри. Базирана е на теоремата на Бейс и се търси минимума на конкретна функция. Това например може да е функция на загуба (loss function), показваща колко добре се справя моделът (средна квадратична грешка, средна абсолютна грешка и т.н.). При този метод се взимат под внимание предишни итерации и се откриват тези стойности на параметрите, които са дали най-добри резултати (функцията на загуба има най-ниски стойности).
Бейсовата оптимизация се прилага чрез функцията fmin().
За използване ѝ са необходими:
- целева функция – търси се нейният минимум
- пространство с параметри и техните стойности
- обект, в който се съхраняват резултати от търсенето (Trials object)
- оптимизационен алгоритъм – търси в пространството от параметри
Пространството с параметри се дефинира преди оптимизация и извън целевата функция, като има възможност за задаване на числови (цели и дробни) и нечислови стойности.
По подразбиране оптимизационният алгоритъм е Tree Parzen Estimator (TPE).
При TPE получените резултати се разделят на 2 групи на база на определен праг, като се взимат под внимание и предишни итерации. След последващи изчисления се предлагат стойностите на параметрите, които да се използват в следващата итерация. С всеки опит, алгоритъмът прави по-добро предложение.
Оптимизация с библиотеката Optuna
Optuna също е специална библиотека за оптимизация на модели. При нея се създава целева функция, пространство с параметри и техните стойности, оптимизационен алгоритъм и обект, в който се съхраняват резултатите (study object). Стойностите на параметрите могат да бъдат числови (цели и дробни) и нечислови.
За разлика от Hyperopt обаче, пространството с параметри се дефинира вътре в тялото на целевата функция, а не преди това, като това е доста по-удобно. Също така можем да изберем дали да се търси минимума или максимума на целевата функция. В Hyperopt, ако искаме например да оптимизираме модела така, че общата точност да е най-висока, е необходимо да сменим знака на получения резултат от целевата функция с отрицателен.
Оптимизационният алгоритъм по подразбиране за Optuna също e TPE, но освен него можем да изберем и други алгоритми за оптимизация, като например решетъчно и рандомизирано търсене. При Hyperopt опциите за оптимизационен алгоритъм са по-ограничени.
Кой начин да изберем?
Библиотеката Optuna предлага най-много възможности, когато става въпрос за избор на оптимизационен алгоритъм и е по-гъвкава за разлика от останалите методи. При Hyperopt различните типове параметри са малко повече отколкото при Optuna, което дава възможност за създаване на пространство с по-сложна структура. Двете библиотеки предлагат по-ефективно откриване на оптималните параметри на модел за разлика от решетъчно и рандомизираното търсене. По-бързи са и можем да получим по-добри резултати при тест на модела. Разбира се начините за оптимизация не се изчерпват до тук. Има още много възможности, които предоставя езикът Python и неговите библиотеки за оптимизация.
Искате да научите повече за машинното обучение?
Включете се в курса по машинно обучение и анализ на данни с Python.
Автор: Десислава Христова