текст перекладу
Вступ:
Під час роботи з машинним навчанням обробка відсутніх значень у даних є поширеною проблемою. XGBoost, широко використовуваний алгоритм градієнтного бустингу, має унікальний спосіб обробки відсутніх значень під час навчання. У цій статті ми пояснимо, як XGBoost обробляє відсутні значення та продемонструємо поведінку в різних сценаріях.
Я знаю, що ви всі зайняті і хочете одразу побачити висновок, тому я перелічив ключові моменти тут:
Ключові моменти:
- Адаптивне оброблення: Коли в навчальних даних є відсутні значення, XGBoost динамічно навчається оптимальній гілці (лівої чи правої) для цих прикладів.
- Обробка за замовчуванням: Якщо в навчальних даних немає відсутніх значень, то відсутні значення під час інференсу направляються за замовчуванням до правої гілки.
Якщо вас цікавить доказ концепції, будь ласка, перейдіть безпосередньо до розділу доказ концепції. Якщо вас цікавлять деталі, прочитайте решту цього посту!
Чи завжди відсутні значення — це погано?
Правильна обробка відсутніх даних є критично важливою у науці про дані, оскільки відсутні значення можуть безпосередньо вплинути на цілісність і ефективність моделей машинного навчання. Неправильна обробка може призвести до таких проблем, як упередженість моделі, втрата інформації, перенавчання чи недонавчання.
Однак є ситуації, коли імпутація спеціальних або стандартних значень (наприклад, 99999
) як відсутніх може бути корисною. Наприклад, при підвищенні інтерпретованості моделі через накладення монотонних обмежень на предиктори, імпутація стандартних значень як відсутніх може спростити процес.
Розглянемо змінну, таку як "роки освіти", де допустимі значення варіюються від 0 до 25, а спеціальні флагові значення, такі як 999
або 998
, вказують на різні типи відсутніх даних. Якщо застосувати позитивне монотонне обмеження, залишення 999
як числового значення зробить модель неправильною, передбачаючи вищі значення для 999
, ніж для 25
. Це неправильно відображатиме основні взаємозв'язки і знижуватиме надійність моделі.
Потенційні рішення:
- Групування флагових значень: Призначте флагові значення, такі як
999
або998
, на мінімальне (0) або максимальне (25) значення. Хоча це ефективно, цей підхід може бути трудомістким, коли потрібно працювати з великою кількістю предикторів. - Імпутація як відсутні значення: Простішою альтернативою є обробка цих стандартних значень як відсутніх і дозволити алгоритму машинного навчання визначити відповідну групу для них. Цей підхід використовує вбудовану обробку відсутніх даних в алгоритмі, заощаджуючи час і зусилля.
Почекайте хвилину! Щось бракує…
З'являється слушне питання, коли модель, навчена без відсутніх значень, стикається з відсутніми значеннями в даних виробництва. Як XGBoost обробляє цей сценарій? У таких випадках забувайте про XGBoost, ваші перші кроки повинні включати:
- Перевірте конвеєр даних: Перевірте свій код, щоб переконатися, що процес завантаження даних працює правильно.
- Зверніться до джерел даних: Перевірте з постачальниками даних або верхніми системами, чи змінилися методи створення змінних.
- Оцінка необхідності перенавчання моделі: Розгляньте, чи потрібно перенавчити модель з оновленими даними, щоб врахувати цю нову поведінку.
Повертаючись до нашої попередньої дискусії щодо XGBoost, на цей момент залишаються два неясних питання:
- Як XGBoost обробляє відсутні значення на етапі навчання?
- Як моделі XGBoost обробляють відсутні значення, якщо вони не з'являлись в навчальних даних?
Доказ концепції
Кейс 1: Навчальні дані містять відсутні значення
XGBoost спроектовано так, щоб обробляти відсутні значення коректно. Під час навчання алгоритм визначає, яку гілку (ліву чи праву) призначити для прикладів з відсутніми значеннями на кожному розподілі. Така поведінка дозволяє алгоритму максимально використовувати неповні дані.
Для ілюстрації ми використали набір даних Breast Cancer і навмисно ввели відсутні значення в одну з ознак. Після навчання моделі XGBoost ми візуалізували одне з дерев рішень.
текст перекладу
У графіку дерева ви помітите, як XGBoost явно обробляє відсутні дані, направляючи їх або на ліву, або на праву гілку залежно від того, що оптимізує ефективність моделі (див. фіолетову коробку на рисунку нижче).
Кейс 2: Навчальні дані без відсутніх значень
У цьому випадку набір даних не містить жодних відсутніх значень. XGBoost все одно зберігає поведінку за замовчуванням для обробки відсутніх даних. За замовчуванням, якщо відсутнє значення з'являється під час інференсу або тестування, воно завжди йде на праву гілку поділу. Це забезпечує узгодженість і надійність обробки несподіваних відсутніх даних під час розгортання моделі.
Ось код, який я використовував для створення цих прикладів:
import numpy as np
import pandas as pd
from xgboost import XGBClassifier, plot_tree
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
# Завантажити набір даних про рак молочної залози
def load_data(case):
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
if case == 1:
# Ввести відсутні значення в навчальних даних
X.iloc[100:1500, 0] = np.nan
return X, y
# Функція для навчання та побудови дерева
def train_and_plot(case):
# Завантажити дані для конкретного випадку
X, y = load_data(case)
# Розділити дані на навчальні та тестові набори
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Навчити модель XGBoost
model = XGBClassifier(use_label_encoder=False, eval_metric='logloss')
model.fit(X_train, y_train)
# Побудувати одне з дерев
plt.figure(figsize=(16, 12), dpi=600)
plot_tree(model, num_trees=0)
plt.title(f"Кейс {case}: {'З відсутніми значеннями' if case == 1 else 'Без відсутніх значень'}")
plt.savefig(f"xgboost_tree_case_{case}.jpg", format="jpg", dpi=600)
plt.show()
# Кейс 1: Навчальні дані містять відсутні значення
train_and_plot(case=1)
# Кейс 2: Навчальні дані не містять відсутніх значень
train_and_plot(case=2)
Сподіваюся, вам сподобався цей пост!
Джерела:
- https://xgboost.readthedocs.io/en/stable/faq.html
- https://towardsdatascience.com/xgboost-is-not-black-magic-56ca013144b4
- https://stackoverflow.com/questions/77000845/xgboost-model-predicting-with-nan-input-values
- https://datascience.stackexchange.com/questions/15305/how-does-xgboost-learn-what-are-the-inputs-for-missing-values
Перекладено з: How XGBoost Handles Missing Values? A Proof of Concept