Остатній Оцінювач
Свайпніть щоб показати меню
Pipeline раніше використовувався для попередньої обробки, але його справжнє призначення — поєднання попередньої обробки з фінальним предиктором. Останній крок у pipeline може бути будь-яким оцінювачем (зазвичай моделлю), який генерує передбачення.
Під час виклику .fit() кожен трансформер виконує .fit_transform().
Під час виклику .predict() pipeline використовує .transform() перед передачею даних фінальному оцінювачу.
Це необхідно, оскільки нові дані мають бути трансформовані точно так само, як і тренувальні дані.
Чому .transform()?
Використання .fit_transform() на нових даних може змінити кодування (наприклад, у OneHotEncoder), що призводить до невідповідності стовпців і ненадійних прогнозів.
.transform() гарантує послідовну попередню обробку, ігноруючи невідомі категорії та зберігаючи той самий порядок стовпців.
Ось початковий набір даних до будь-яких перетворень. Ці необроблені дані є відправною точкою для процесу трансформації. Жодне кодування чи попередня обробка ще не застосовувалися — кожен рядок показує екземпляр із його ознакою кольору у вигляді рядка. Саме ці дані будуть трансформовані за допомогою кроків попередньої обробки в конвеєрі.
У цій таблиці показано набір даних до застосування one-hot кодування. Стовпець Color є категоріальним — він містить рядкові значення замість числових. На наступному кроці цей стовпець буде перетворено на окремі бінарні стовпці за допомогою one-hot кодування, що є необхідним для коректної обробки категоріальних даних більшістю моделей машинного навчання.
Ось як виглядають тренувальні дані після застосування one-hot кодування:
У таблиці нижче показано набір даних після застосування one-hot кодування. Оригінальний стовпець Color було замінено окремими бінарними стовпцями — Color_Red, Color_Blue та Color_Green. Кожен стовпець вказує, чи має екземпляр відповідний колір (1) чи ні (0).
Зверніть увагу, що початковий стовпець Color було замінено трьома окремими стовпцями: Color_Red, Color_Blue та Color_Green. Кожен стовпець відображає, чи присутній певний колір для цього екземпляра, використовуючи 1 для так і 0 для ні. Така трансформація називається one-hot кодуванням.
Ця зміна є важливою для моделей машинного навчання, оскільки більшість алгоритмів не можуть працювати безпосередньо з текстовими або категоріальними даними. Перетворюючи категорії на окремі бінарні стовпці, ви надаєте моделі чіткі числові ознаки, які вона може використовувати для виявлення закономірностей і прогнозування. Такий підхід також запобігає припущенню моделі про наявність порядкових відносин між початковими категоріями, що могло б призвести до неправильних висновків.
Ось нові екземпляри для прогнозування:
Ось нові дані, для яких потрібно зробити прогноз. Це сирий вхід — стан «до» — саме так, як він виглядає до будь-яких перетворень чи попередньої обробки. Конвеєр трансформує ці дані у формат, який використовувався під час навчання, перед тим як зробити прогноз.
Наступний крок — трансформувати ці нові екземпляри за допомогою попередньо навченого енкодера. Це гарантує, що нові дані обробляються так само, як і тренувальні, забезпечуючи узгодженість та надійність прогнозів моделі.
Якщо застосувати .fit_transform() до нових екземплярів, OneHotEncoder може згенерувати стовпці в іншому порядку або навіть додати нові. Це призведе до того, що нові дані будуть трансформовані непослідовно з навчальним набором, що зробить передбачення ненадійними.
Якщо використовувати .fit_transform() для нових даних замість .transform(), енкодер буде сприймати нові дані як такі, що бачить вперше. Це призведе до:
- Повторного вивчення категорій на основі нових даних;
- Зміни порядку стовпців відповідно до нового набору категорій;
- Додавання нового стовпця для будь-якої невідомої категорії, наприклад,
'Color_Yellow'у цьому випадку.
Це створює невідповідність між навчальними та прогнозними даними, що робить передбачення ненадійними та може спричинити помилки у вашому конвеєрі.
Зверніть увагу на різницю між некоректним та коректним перетворенням. Таблиця з некоректним перетворенням містить новий стовпець (Color_Yellow) і змінює порядок стовпців порівняно з тренувальними даними. Це порушує узгодженість між тренуванням і прогнозуванням:
- Модель очікує ті самі стовпці та їх порядок, що й під час тренування;
- Нові або переставлені стовпці збивають модель з пантелику, змушуючи її використовувати неправильні ознаки;
- Прогнози стають ненадійними, оскільки структура вхідних даних більше не відповідає тій, яку вивчала модель.
Завжди переконайтеся, що нові дані перетворюються за допомогою .transform() після навчання, щоб стовпці та їх порядок залишалися незмінними. Це необхідно для точних і надійних прогнозів.
Однак використання .transform() гарантує, що нові дані кодуються точно так само, як і тренувальні дані, ігноруючи категорії, які не зустрічалися під час тренування:
Під час використання .transform() для нових даних у вихідних даних залишаються лише ті стовпці, які були під час тренування. Будь-які категорії, що не зустрічалися під час тренування, наприклад 'Yellow', ігноруються. Це гарантує, що нові дані відповідають структурі, яку очікує модель, без зайвих або відсутніх стовпців.
Порівняння трьох таблиць:
- Оригінальні тренувальні дані (після one-hot кодування) містять стовпці
Color_Red,Color_BlueтаColor_Green; - Неправильно трансформовані нові дані (з використанням
.fit_transform()) додають стовпецьColor_Yellowі видаляютьColor_Green, змінюючи порядок і структуру стовпців; - Правильно трансформовані нові дані (з використанням
.transform()) зберігають ті ж стовпці та порядок, що й у тренувальному наборі, з нулями для невідомих категорій, таких якYellow.
Використання .transform() є правильним підходом, оскільки гарантує, що нові дані обробляються точно так само, як і тренувальні. Це забезпечує надходження даних до моделі у відповідному форматі, запобігає помилкам і робить передбачення надійними.
Додавання фінального оцінювача
Достатньо додати модель як останній крок у конвеєрі:
pipe = make_pipeline(
ct,
SimpleImputer(strategy='most_frequent'),
StandardScaler(),
KNeighborsClassifier()
)
pipe.fit(X, y)
pipe.predict(X_new)
Це дозволяє виконати весь робочий процес—попередню обробку та прогнозування—одним викликом.
12345678910111213141516171819202122232425262728293031323334353637from sklearn.pipeline import make_pipeline from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import pandas as pd # Example data data = pd.DataFrame({ 'color': ['red', 'blue', 'green'], 'value': [1, 2, 3] }) labels = [0, 1, 0] # Define a simple column transformer (placeholder for real preprocessing) ct = ColumnTransformer([ ('imputer', SimpleImputer(strategy='most_frequent'), ['color']) ]) # --- Before: Pipeline with only preprocessing steps --- # This pipeline only transforms the data; it cannot make predictions. pipeline_preprocessing = make_pipeline( ct, StandardScaler() ) # pipeline_preprocessing.fit(data) # Only fits transformers, no estimator at the end # --- After: Pipeline with a final estimator --- # Now the pipeline ends with a model, so it can fit and predict. pipeline_full = make_pipeline( ct, StandardScaler(), KNeighborsClassifier() ) pipeline_full.fit(data, labels) predictions = pipeline_full.predict(data) print("Predictions:", predictions)
Додавання фінального оцінювача як останнього кроку перетворює ваш конвеєр на повний наскрізний робочий процес. Тепер, замість лише підготовки даних, конвеєр обробляє як попередню обробку, так і прогнозування в одному об'єкті. Це означає, що ви можете викликати fit() та predict() безпосередньо на конвеєрі, і всі кроки попередньої обробки будуть автоматично застосовані перед отриманням прогнозів.
Такий підхід важливий, оскільки:
- Гарантує, що всі дані обробляються однаково як під час навчання, так і під час прогнозування;
- Зменшує ризик помилок, наприклад, пропуску кроку попередньої обробки при прогнозуванні на нових даних;
- Робить код чистішим і простішим для підтримки, оскільки весь робочий процес керується в одному місці.
Об'єднуючи попередню обробку та моделювання, ви забезпечуєте послідовність, надійність і простоту у ваших проєктах машинного навчання.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат