Python - Що таке sklearn.pipeline.Pipeline?


118

Я не можу зрозуміти, як саме sklearn.pipeline.Pipelineпрацює.

Є кілька пояснень в доці . Наприклад, що вони означають:

Трубопровід перетворень з кінцевим оцінкою.

Щоб моє питання було зрозумілішим, що таке steps? Як вони працюють?

Редагувати

Завдяки відповідям я можу зробити своє питання зрозумілішим:

Коли я викликаю трубопровід і проходжу, як кроки, два трансформатори та один оцінювач, наприклад:

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

Що відбувається, коли я це закликаю?

pipln.fit()
OR
pipln.fit_transform()

Я не можу зрозуміти, як оцінювач може бути трансформатором і як трансформатор може бути встановлений.


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

Відповіді:


180

Трансформатор у scikit-learn - деякий клас, який має метод підгонки та перетворення, або метод fit_transform.

Predictor - деякий клас, який має методи підгонки та прогнозування, або метод fit_predict.

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

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

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

Просто:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

За допомогою конвеєрів ви можете легко здійснити пошук по сітці за набором параметрів для кожного кроку цього метаоцінювача. Як описано у посиланні вище. Усі кроки, крім останнього, повинні бути перетвореннями, останній крок може бути трансформатором або предиктором. Відповідь на редагування : Коли ви телефонуєте pipln.fit()- кожен трансформатор всередині трубопроводу буде встановлений на виведеннях попереднього трансформатора (Перший трансформатор вивчається на необробленому наборі даних). Останній оцінювач може бути трансформатором або предиктором, ви можете викликати fit_transform () на конвеєрі лише у тому випадку, якщо ваш останній оцінювач є трансформатором (який реалізує fit_transform, або методами перетворення та підгонки окремо), ви можете викликати fit_predict () або передбачати () на конвеєрі лише у випадку, якщо ваш останній оцінювач - це предиктор. Таким чином, ви просто не можете викликати fit_transform або трансформувати на конвеєрі, останній крок якого - предиктор.


1
Що ви маєте на увазі під predicted = pipeline.fit(Xtrain).predict(Xtrain)?
farhawa

@farhawa, прогнозуючи заняття на навчальному наборі.
Ібраїм Ганьєв

4
Чому у цього немає більше голосів? Це має бути повідомлення в блозі.
R Клавен

1
@iamgin, Інтерфейс більшості науковців-трансформерів не дозволяє вибирати потрібні стовпці, які ми хочемо перетворити. Але ви можете написати власний "Селектор елементів", який допоможе вам живити трансформатор лише потрібними стовпцями. Ось хороший приклад із ItemSelector та FeatureUnion scikit-learn.org/stable/auto_examples/…
Ганієв

1
У першому прикладі ви не хочете уникати повторного встановлення тестового набору? Чи не слід це лише викликати перетворення замість fit_transform? І так само, чи передбачає трубопровід внутрішньо викликати fit_transform або просто трансформувати? Чи можна це контролювати?
Стівен

18

Я думаю, що M0rkHaV має правильну ідею. Клас конвеєра Scikit-learn є корисним інструментом для інкапсуляції декількох різних трансформаторів поряд з оцінкою в один об’єкт, так що вам потрібно буде лише один раз викликати важливі методи ( fit(), predict()і т.д.). Давайте розбимо два основні компоненти:

  1. Трансформери - це класи, які реалізують і fit()та, і transform(). Можливо, ви знайомі з деякими інструментами попередньої обробки sklearn, як-от TfidfVectorizerі Binarizer. Якщо ви подивитеся на документи цих інструментів попередньої обробки, то побачите, що вони реалізують обидва ці методи. Що мені здається досить цікавим, це те, що деякі оцінки можуть також використовуватися як етапи трансформації, наприклад LinearSVC!

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

Щодо редагування: давайте переглянемо текстовий приклад. За допомогою LabelBinarizer ми хочемо перетворити список міток у список бінарних значень.

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

Тепер, коли бінарізатор встановлений на деяких даних, він буде мати структуру, яка називається, classes_що містить унікальні класи, про які трансформатор «знає». Без виклику fit()бінарнізатора поняття не має, як виглядають дані, тому дзвінки transform()не мали б сенсу. Це справедливо, якщо ви надрукували список класів перед тим, як спробувати вписати дані.

print bin.classes_  

При спробі цього я отримую таку помилку:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

Але коли ви поміщаєте бінарізатор у vecсписок:

bin.fit(vec)

і спробуйте ще раз

print bin.classes_

Я отримую наступне:

['cat' 'dog']


print bin.transform(vec)

І тепер, після виклику перетворення на vecоб'єкт, ми отримуємо наступне:

[[0]
 [1]
 [1]
 [1]]

Що стосується оцінювачів, які використовуються як трансформатори, то скористаємося DecisionTreeкласифікатором як приклад функції екстрактора. Дерева рішень чудові з багатьох причин, але для наших цілей важливо те, що вони мають можливість ранжувати функції, які дерево вважає корисними для прогнозування. Коли ви зателефонуєте transform()до дерева рішень, воно візьме ваші вхідні дані та знайде те, що, на його думку, є найважливішими характеристиками. Таким чином, ви можете подумати про те, що перетворює вашу матрицю даних (n рядків за m стовпцями) в меншу матрицю (n рядків за k стовпцями), де k стовпців є k найважливішими особливостями, які знайдено Дерево рішення.


У чому різниця між Трансформаторами fit()і чи transform()є це? , як оцінювачі можуть бути використані як трансформатори?
farhawa

2
fit()- це метод, який ви закликаєте підходити або тренувати трансформатор, як ви використовуєте класифікатор або регресійну модель. Що стосується transform(), це метод, який ви закликаєте фактично перетворити вхідні дані у вихідні дані. Наприклад, дзвінок Binarizer.transform([8,2,2])(після встановлення!) Може призвести до [[1,0],[0,1],[0,1]]. Що стосується використання оцінювачів як трансформаторів, я відредагую короткий приклад у своїй відповіді.
NBartley

9

Алгоритми ML зазвичай обробляють табличні дані. Ви можете заздалегідь обробити ці дані та обробити ці дані до та після алгоритму ML. Трубопровід - це спосіб ланцюга цих етапів обробки даних.

Що таке трубопроводи ML та як вони працюють?

Трубопровід - це ряд етапів, на яких дані перетворюються. Він походить від старої схеми дизайну "труба і фільтр" (наприклад, ви можете подумати команди Unix bash з трубами "|" або операторами переадресації ">"). Однак трубопроводи - це об'єкти в коді. Таким чином, у вас може бути клас для кожного фільтра (також кожен крок конвеєра), а потім ще один клас для об'єднання цих кроків у кінцевий конвеєр. Деякі трубопроводи можуть поєднувати інші трубопроводи послідовно або паралельно, мати кілька входів або виходів тощо. Ми любимо розглядати трубопроводи машинного навчання як:

  • Труби та фільтри . Етапи трубопроводу обробляють дані, і вони управляють своїм внутрішнім станом, про який можна дізнатися з даних.
  • Композити . Трубопроводи можуть бути вкладені: наприклад, цілий трубопровід може розглядатися як один крок трубопроводу в іншому трубопроводі. Крок трубопроводу не обов'язково є трубопроводом, але сам трубопровід є щонайменше кроком трубопроводу за визначенням.
  • Направлені ациклічні графіки (DAG) . Вихідний крок трубопроводу може бути надісланий на багато інших етапів, і тоді отримані результати можуть бути рекомбіновані тощо. Побічна примітка: незважаючи на те, що трубопроводи є ациклічними, вони можуть обробляти декілька елементів по одному, і якщо їх стан змінюється (наприклад, використовуючи метод fit_transform кожен раз), то їх можна розглядати як періодично розгортаються протягом часу, зберігаючи свої стани (думайте, як RNN). Це цікавий спосіб бачити трубопроводи для навчання в Інтернеті, коли їх випускати у виробництво та навчати їх на більшій кількості даних.

Методи трубопроводу Scikit-Learn

Трубопроводи (або сходинки в трубопроводі) повинні мати два способи :

  • " Підходить " для вивчення даних та отримання стану (наприклад: нейронні ваги нейронної мережі є таким станом)
  • " Перетворити " (або "передбачити"), щоб фактично обробити дані та створити прогноз.

Також цей метод можна викликати ланцюжком обох:

  • " Fit_transform " для встановлення та перетворення даних, але за один прохід, що дозволяє здійснити потенційну оптимізацію коду, коли два способи потрібно робити один за одним безпосередньо.

Проблеми класу sklearn.pipeline.Pipeline

Шаблон дизайну "труби і фільтри" Scikit-Learn - просто красивий. Але як використовувати його для глибокого навчання, AutoML та складних трубопроводів рівня виробництва?

Scikit-Learn вперше вийшов у 2007 році, що було до глибокої епохи навчання . Однак це одна з найвідоміших і прийнятих машинобудівних бібліотек, і все ще зростає. Крім того, він використовує модель дизайну Pipe and Filter як архітектурний стиль програмного забезпечення - саме це робить Scikit-Learn таким казковим, додається до того, що він пропонує алгоритми, готові до використання. Однак у нього виникають масові проблеми, коли потрібно зробити наступне, що ми повинні мати можливість вже в 2020 році:

  • Автоматичне машинне навчання (AutoML),
  • Трубопроводи глибокого навчання,
  • Більш складні трубопроводи машинного навчання.

Рішення, які ми знайшли для цих проблем Scikit-Learn

Напевно, Scikit-Learn дуже зручний і добре побудований. Однак воно потребує оновлення. Ось наші рішення з Neuraxle, щоб зробити Scikit-Learn свіжим та корисним у сучасних обчислювальних проектах!

Додаткові трубопровідні методи та функції, пропоновані через Neuraxle

Примітка: якщо для кроку конвеєра не потрібно застосовувати один з методів підгонки або перетворення, він може успадкувати від NonFittableMixin або NonTransformableMixin, щоб йому було надано реалізацію за замовчуванням одного з цих методів, щоб нічого не робити.

На початку, трубопроводи або їх кроки також можуть необов'язково визначати ці методи :

  • " Setup ", який буде викликати метод "setup" на кожному його кроці. Наприклад, якщо крок містить нейронну мережу TensorFlow, PyTorch або Keras, кроки можуть створити свої нейронні графіки та зареєструвати їх до GPU методом "setup" перед придатністю. Не рекомендується створювати графіки безпосередньо в конструкторах кроків з кількох причин, наприклад, якщо кроки копіюються перед тим, як багато разів виконувати різні параметри в межах алгоритму автоматичного машинного навчання, який шукає найкращі для вас гіперпараметри.
  • " Схід ", який є протилежним методу "налаштування": він очищує ресурси.

У наступних методах надаються за замовчуванням для забезпечення управління гіперпараметрамі:

  • " Get_hyperparams " поверне вам словник гіперпараметрів. Якщо ваш трубопровід містить більше трубопроводів (вкладених трубопроводів), то клавіші гіперпараметра пов'язані між собою подвійними розділовими знаками "__".
  • " Set_hyperparams " дозволить вам встановити нові гіперпараметри в тому ж форматі, коли ви їх отримаєте.
  • " Get_hyperparams_space " дозволяє отримати простір гіперпараметра, який не буде порожнім, якщо ви його визначили. Отже, єдина відмінність "get_hyperparams" тут полягає в тому, що ви отримаєте статистичні розподіли як значення замість точного значення. Наприклад, один гіперпараметр для кількості шарів може бути а, RandInt(1, 3)що означає 1 - 3 шари. Ви можете закликати .rvs()цей дикт, щоб вибрати значення випадковим чином і надіслати його до "set_hyperparams", щоб спробувати його тренування.
  • " Set_hyperparams_space " можна використовувати для встановлення нового простору, використовуючи ті ж класи розподілу гіперпараметрів, що й у "get_hyperparams_space".

Для отримання додаткової інформації про запропоновані рішення прочитайте записи у великому списку із посиланнями вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.