Через дві години і все ще працює? Як тримати ваш sklearn.fit під контролем.

Написали Габріель Лернер та Натан Тубіана

Все, що ви хотіли зробити, - це протестувати свій код, але через дві години ваш підхід Scikit-learn не показує жодних ознак закінчення. Scitime - це пакет, який передбачає час роботи алгоритмів машинного навчання, щоб вас не вразила нескінченність.

Незалежно від того, чи ви перебуваєте в процесі побудови моделі машинного навчання або впроваджуєте свій код у виробництво, знання того, скільки часу займе ваш алгоритм, є ключовим для впорядкування вашого робочого процесу. За допомогою Scitime ви зможете за лічені секунди оцінити, скільки часу має зайняти найбільш часто використовувані алгоритми Scikit Learn.

На цю тему було опубліковано кілька дослідницьких статей (таких як ця). Однак, наскільки нам відомо, практичної реалізації цього немає. Мета тут не передбачити точний час роботи алгоритму, а більше дати приблизне наближення.

Що таке Scitime?

Scitime - це пакет python, який вимагає принаймні python 3.6 із залежностями pandas, scikit-learn, psutil та joblib. Тут ви знайдете репозитарій Scitime.

Основна функція цього пакета називається “ час ”. Враховуючи матричний вектор X, передбачуваний вектор Y разом із обраною вами моделлю Scikit Learn, час виводить як розрахунковий час, так і його довірчий інтервал. Наразі пакет підтримує наступні алгоритми Scikit Learn з планами додати нові найближчим часом:

  • KM означає
  • RandomForestRegressor
  • SVC
  • Класифікатор RandomForestClassifier

Швидкий початок

Давайте встановимо пакет і запустимо основи.

Спочатку створіть новий virtualenv (це необов’язково, щоб уникнути будь-яких конфліктів версій!)

❱ virtualenv env❱ source env/bin/activate

а потім запустіть:

❱ (env) pip install scitime

або з конда:

❱ (env) conda install -c conda-forge scitime

Після успішного встановлення ви готові оцінити час першого алгоритму.

Скажімо, ви, наприклад, хотіли навчити кластеризацію kmeans. Спочатку потрібно імпортувати пакет scikit-learn, встановити параметри kmeans, а також вибрати вхідні дані (вони ж X) , створені тут випадково для простоти.

Запуск цього перед тим, як зробити справжню підгонку, дасть приблизний час виконання:

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

Подивившись уважніше на останній рядок вищевказаного коду, перший результат ( оцінка: 15 секунд у цьому випадку) - це передбачуваний час виконання, який ви шукаєте. Scitime також видасть його з довірчим інтервалом ( нижній і верхній межі: 10 і 30 секунд у цьому випадку) Ви завжди можете порівняти його з фактичним часом тренування, пробігшись:

У цьому випадку на нашій локальній машині оцінка становить 15 секунд, тоді як фактичний час навчання становить 20 секунд (але ви можете отримати не ті самі результати, як ми пояснимо пізніше).

Як короткий посібник із використання:

Клас оцінювача (meta_algo, багатослівний, впевнений):

  • meta_algo : Оцінювач, який використовується для прогнозування часу, або 'RF', або 'NN' (див. деталі в наступному абзаці) - за замовчуванням 'RF'
  • детальний : Контроль за сумою журналу (або 0, 1, 2 або 3) - за замовчуванням 0
  • впевненість : Довіра для інтервалів - за замовчуванням 95%

функція estimator.time (algo, X, y):

  • algo : algo, час виконання якого користувач хоче передбачити
  • X : масив вхідних даних, який потрібно навчити
  • y : numpy масив вихідних даних, які потрібно навчити (встановити значення None, якщо algo не контролюється)

Коротке зауваження: щоб уникнути плутанини, варто підкреслити, що algo та meta_algo - це дві різні речі: algo - це алгоритм, час виконання якого ми хочемо оцінити, meta_algo - це алгоритм, який використовується Scitime для прогнозування часу виконання.

Як працює Scitime

Ми можемо передбачити час виконання відповідно до власного оцінювача, ми називаємо його мета-алгоритмом ( meta_algo ), ваги якого зберігаються у виділеному файлі засолу в метаданих пакета. Для кожної моделі Scikit Learn ви знайдете відповідний файл розсіву meta algo у базі коду Scitime.

Ви можете подумати:

Чому б не вручну оцінити складність часу за допомогою великих позначень O?

Це справедливо. Це дійсний спосіб підійти до проблеми та те, про що ми думали на початку проекту. Однак одне полягає в тому, що нам би потрібно було чітко сформулювати складність для кожного альго та набору параметрів, що в деяких випадках є досить складним, враховуючи кількість факторів, що відіграють певну роль під час виконання. Meta_algo в основному виконує всю роботу за вас, і ми пояснимо, як це зробити.

Два типи мета-алгоритмів навчені оцінювати час, який відповідає (обидва від Scikit Learn):

  • РФ мета алго, оцінювач RandomForestRegressor.
  • NN мета алго, основний MLPRegressor оцінювач.

Ці мета-алгоритми розраховують час на пристосування за допомогою масиву мета-функцій. Ось короткий зміст того, як ми будуємо ці функції:

По-перше, ми отримуємо форму вашої вхідної матриці X і вихідного вектора y. По-друге, враховуються параметри, які ви подаєте до моделі Scikit Learn, оскільки вони також вплинуть на час навчання. Нарешті, враховується також ваше конкретне обладнання, унікальне для вашої машини, наприклад, доступна пам’ять і кількість процесорів.

Як було показано раніше, ми також надаємо довірчі інтервали для прогнозування часу. Спосіб їх обчислення залежить від обраного мета альго:

  • Для РФ , оскільки будь-який випадковий лісорегресор є комбінацією декількох дерев (також званих оцінювачами ), довірчий інтервал буде базуватися на розподілі набору прогнозів, обчислених кожним оцінювачем.
  • Для NN процес трохи менш простий: спочатку ми обчислюємо набір MSE разом із кількістю спостережень на тестовому наборі, згрупованому за прогнозованими бінами тривалості (тобто від 0 до 1 секунди, 1 до 5 секунд і так далі on), а потім ми обчислюємо t-stat, щоб отримати нижню та верхню межі оцінки. Оскільки у нас немає багато даних для дуже довгих моделей, довірчий інтервал для таких даних може стати дуже широким.

Як ми його побудували

Ви можете подумати:

Як ви отримали достатньо даних про час навчання всіх цих наукових підходів за різними параметрами та апаратними конфігураціями?

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

У той час, як файл yield.py обробляє прогноз виконання, файл _model.py допоміг нам генерувати дані для навчання наших мета-алгоритмів, використовуючи наш виділений клас Model. Ось відповідний зразок коду для kmeans:

Зверніть увагу, що ви також можете використовувати файл _data.py безпосередньо з командним рядком для створення даних або підготовки нової моделі. Відповідні інструкції можна знайти у файлі репо-файлу Readme.

При генерації точок даних ви можете редагувати параметри моделей Scikit Learn, на яких ви хочете тренуватися. Ви можете перейти до scitime / _config.json і редагувати параметри моделей, а також кількість рядків і стовпців, з якими ви хочете тренуватися.

Ми використовуємо функцію itertool, щоб прокручувати всі можливі комбінації, а також швидкість падіння, встановлену між 0 і 1, щоб контролювати, наскільки швидко цикл буде переходити через різні можливі ітерації.

Наскільки точний Scitime?

Нижче ми підкреслимо ефективність наших прогнозів для конкретного випадку kmeans. Створений нами набір даних містить ~ 100 тис. Точок даних, які ми розділяємо на поїзд та тестові набори (75% - 25%).

Ми згрупували прогнозований час навчання за різними часовими сегментами та обчислили MAPE та RMSE по кожному з цих сегментів для всіх наших оцінювачів, використовуючи мета-альго РФ та мета-альго НН.

Зверніть увагу, що ці результати були виконані на обмеженому наборі даних, тому вони можуть відрізнятися в невивчених точках даних (таких як інші системи / екстремальні значення певних параметрів моделі). Для цього конкретного навчального набору коефіцієнт R-квадрата становить близько 80% для NN і 90% для RF.

Як бачимо, не дивно, що точність на поїзді постійно вища, ніж на випробуванні, як для NN, так і для RF. Ми також бачимо, що РФ, здається, працює набагато краще, ніж NN загалом. MAPE для РФ становить близько 20% на поїзному комплекті та 40% на тестовому комплекті. NN MAPE напрочуд дуже високий.

Давайте наріжемо MAPE (на тестовому наборі) за кількістю передбачуваних секунд:

Важливо пам’ятати про те, що в деяких випадках прогнозування часу є чутливим до обраного мета альго (РФ чи НН). З нашого досвіду, РЧ показала себе дуже добре в межах діапазону вводу даних, як показано вище. Однак для точок, що виходять за межі діапазону, NN може працювати ефективніше, як пропонується в кінці наведеної вище таблиці. Це пояснювало б, чому NN MAPE досить високий, тоді як RMSE пристойний: він погано працює на малих значеннях.

Як приклад, якщо ви спробуєте передбачити час виконання kmeans із параметрами за замовчуванням і з вхідною матрицею в кілька тисяч рядків, мета-алгоритм RF буде точним, оскільки наш навчальний набір даних містить подібні точки даних. Однак для прогнозування дуже конкретних параметрів (наприклад, дуже великої кількості кластерів) NN може працювати ефективніше, оскільки екстраполює з навчального набору, тоді як RF - ні. NN працює гірше на вищезазначених діаграмах, оскільки ці графіки базуються лише на даних, близьких до набору входів навчальних даних.

Однак, як показано на цьому графіку, значення, що виходять за межі діапазону (тонкі лінії), екстраполюються оцінювачем NN, тоді як RF-оцінювач прогнозує вихід поступово.

Тепер давайте розглянемо найважливіші мета-функції на прикладі kmeans:

Як бачимо, лише на 6 функцій припадає понад 80% відхилення моделі. Серед них найважливішим є параметр самого класу scikit-learn kmeans (кількість кластерів), але багато зовнішніх факторів мають великий вплив на час виконання, такі як кількість рядків / стовпців та доступна пам'ять.

Обмеження

Як вже згадувалося раніше, перше обмеження пов'язане з довірчими інтервалами: вони можуть бути дуже широкими, особливо для NN, та для важких моделей (це займе щонайменше годину).

Крім того, НН може погано працювати при малих та середніх прогнозах. Іноді для невеликої тривалості NN може навіть передбачити негативну тривалість, і в цьому випадку ми автоматично переключаємось назад на ВЧ.

Ще одне обмеження оцінювача виникає, коли використовуються "спеціальні" значення параметрів альго. Наприклад, у сценарії RandomForest, коли для max_depth встановлено значення None , глибина може приймати будь-яке значення. Це може призвести до набагато більш тривалого часу для пристосування, що важче підібрати мета-альго, хоча ми докладали максимум зусиль, щоб пояснити їх.

При запуску estimator.time (алго, X, Y) ми вимагаємо від користувача ввести фактичний X і у вектора , який , здається непотрібним, так як ми просто могли б запросити форму даних для оцінки часу навчання. Причиною цього є те, що ми насправді намагаємось відповідати моделі перед тим, як прогнозувати час роботи, щоб негайно викликати помилки. Ми запускаємо algo.fit (X, y) в підпроцесі протягом однієї секунди, щоб перевірити наявність помилок підгонки, після чого переходимо до частини передбачення. Однак бувають випадки, коли algo (та / або вхідна матриця) настільки великі, що запущений algo.fit (X, y) в кінцевому підсумку видасть помилку пам'яті, яку ми не можемо врахувати.

Майбутні вдосконалення

Найефективнішим і очевидним способом покращення продуктивності наших поточних прогнозів було б створення більше точок даних у різних системах для кращої підтримки широкого кола апаратних засобів / параметрів.

Найближчим часом ми розглянемо можливість додавання більше підтримуваних алгоритмів Scikit Learn. Ми могли б також застосувати інші алгоритми, такі як lightGBM або xgboost. Не соромтеся зв’язуватися з нами, якщо є алгоритм, який ви хотіли б реалізувати в наступних ітераціях Scitime!

Іншими цікавими шляхами для покращення роботи оцінювача було б включення більш детальної інформації про вхідну матрицю, таку як дисперсія або кореляція з результатом. В даний час ми генеруємо дані абсолютно випадково, для яких час придатності може бути вищим, ніж для реальних наборів даних. Тому в деяких випадках це може переоцінити час тренувань.

Крім того, ми могли відстежувати більш точну інформацію про обладнання, таку як частота процесора або поточне використання процесора.

В ідеалі, оскільки алгоритм може змінюватись з версії scikit-learn на іншу і, таким чином, впливати на час роботи, ми також будемо це враховувати, наприклад, використовуючи версію як функцію "мета".

Оскільки ми отримуємо більше даних, щоб відповідати нашим мета-алгоритмам, ми могли б подумати про використання більш складних мета-алгоритмів, таких як складні нейронні мережі (з використанням методів регуляризації, таких як відсівання або нормалізація партії). Ми навіть могли б подумати про використання tensorflow для відповідності мета альго (і додати його як необов’язковий): це не тільки допомогло б нам отримати кращу точність, але й створило б більш надійні інтервали довіри за допомогою відсіву.

Внесок у Scitime та надсилання нам ваших відгуків

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

Як вже обговорювалося раніше, ви можете використовувати наш репо для створення власних точок даних, щоб навчити власний мета-алгоритм. Роблячи це, ви можете допомогти покращити Scitime, поділившись своїми точками даних, знайденими в результаті csv ( ~ / scitime / scitime / [algo] _results.csv ), щоб ми могли інтегрувати його до нашої моделі.

Щоб створити власні дані, ви можете запустити команду, подібну до цієї (з джерела пакета repo):

❱ python _data.py --verbose 3 --algo KMeans --drop_rate 0.99

Примітка: якщо запускати безпосередньо з використанням джерела коду (з класом Model ), не забудьте встановити write_csv на true, інакше створені точки даних не будуть збережені.

Ми використовуємо проблеми GitHub для відстеження всіх помилок та запитів на функції. Не соромтеся відкривати випуск, якщо ви виявили помилку або хочете побачити нову функцію. Більше інформації можна знайти про те, як взяти участь у репозиторії Scitime.

Що стосується проблем із прогнозами часу навчання, то, надсилаючи відгуки, включаючи повний словник параметрів, які ви вписуєте у свою модель, може допомогти, щоб ми могли діагностувати, чому ефективність є нижчою для вашого конкретного випадку використання. Для цього просто встановіть детальний параметр на 3 і скопіюйте вставте журнал параметра dic в опис проблеми.

Знайдіть джерело коду

Знайдіть документацію

Кредити

  • Габріель Лернер та Натан Тубіана є головними учасниками цього пакету та співавторами цієї статті
  • Особлива подяка Філіппу Мізрахі за допомогу на цьому шляху
  • Дякуємо за всю допомогу, яку ми отримали від ранніх оглядів / бета-тестування