XGBoost — это широко используемая библиотека машинного обучения с открытым исходным кодом, которая обеспечивает эффективную и масштабируемую реализацию алгоритмов повышения градиента. В последние годы он приобрел огромную популярность благодаря своей высокой производительности в широком спектре приложений, таких как классификация, регрессия и ранжирование. XGBoost часто хвалят за его гибкость, поскольку он позволяет пользователям настраивать модель в соответствии со своими конкретными потребностями.

Одним из ключевых компонентов алгоритмов повышения градиента является функция потерь, которая измеряет разницу между предсказаниями модели и истинными целевыми значениями. Минимизируя эту потерю, модель стремится делать более точные прогнозы на невидимых данных. В XGBoost функциями потерь по умолчанию для задач классификации нескольких классов являются Softmax для классификации меток и Softprob для оценки распределения вероятностей. Хотя эти функции потерь хорошо работают во многих сценариях, они не всегда могут быть лучшим выбором, особенно при работе со сложными распределениями данных или порядковыми данными.

В этом сообщении блога мы представляем альтернативную функцию потерь под названием Earth Mover’s Distance (EMD), которую можно использовать в XGBoost для потенциального повышения эффективности прогнозирования. EMD, также известное как расстояние Вассерштейна, является мерой несходства между двумя распределениями вероятностей. Используя потери EMD, мы можем лучше учитывать различия между прогнозируемым и истинным распределениями вероятностей, что может привести к более точным и надежным моделям.

Справочная информация о расстоянии движения Земли:

Расстояние Earth Mover’s Distance (EMD), также известное как расстояние Вассерштейна, является мощной и интуитивно понятной метрикой расстояния, которая количественно определяет несходство между двумя распределениями вероятностей. EMD берет свое начало в теории транспорта, где он был первоначально введен для представления минимальных затрат на транспортировку товаров между двумя пунктами. В контексте распределений вероятностей EMD можно рассматривать как минимальный объем «работы», необходимый для преобразования одного распределения в другое.

Чтобы использовать EMD в качестве функции потерь в машинном обучении, нам сначала нужно вычислить EMD между прогнозируемым распределением вероятностей и истинным целевым распределением для каждого экземпляра в наборе данных. Общие потери EMD затем рассчитываются как среднее этих отдельных значений EMD. Минимизируя эту потерю EMD, модель стремится изучить функцию, которая дает прогнозы, максимально приближенные к истинным целевым распределениям.

EMD предлагает несколько преимуществ по сравнению с другими показателями расстояния, такими как расхождение Кульбака-Лейблера (KL) или расхождение Дженсена-Шеннона (JS), при использовании в качестве функции потерь в машинном обучении:

  1. Чувствительность к структуре данных: EMD учитывает базовую геометрию распределения вероятностей, что делает его более подходящим для фиксации нюансов сложных распределений данных.
  2. Надежность: EMD менее чувствителен к небольшим отклонениям в данных, что делает его более устойчивым к шуму и выбросам, чем другие показатели расстояния.
  3. Обработка порядковых данных. EMD особенно полезен для порядковых данных, поскольку он естественным образом учитывает порядок категорий, позволяя модели фиксировать относительную важность различных категорий в целевая переменная.
  4. Интерпретируемость. Потери EMD легче интерпретировать, чем другие показатели расстояния, поскольку они напрямую отражают объем работы, необходимый для преобразования одного распределения в другое. Это может помочь практикам лучше понять производительность своих моделей и определить области для улучшения.

Реализация пользовательских функций потерь в XGBoost:

XGBoost предоставляет гибкую структуру, которая позволяет пользователям реализовывать свои собственные функции потерь, тем самым позволяя исследовать альтернативные цели оптимизации, адаптированные к конкретным проблемам. В этом разделе мы расскажем о процессе реализации пользовательской функции потерь в XGBoost и приведем пример реализации функции потерь EMD.

  1. Определение пользовательской функции потерь. Первым шагом в реализации пользовательской функции потерь в XGBoost является определение самой функции потерь. Это должна быть функция Python, которая принимает два входных аргумента: истинные целевые значения и прогнозируемые значения. Функция должна возвращать вычисленное значение потерь для заданных входных данных.
  2. Вычислить градиент и гессиан: чтобы использовать пользовательскую функцию потерь с XGBoost, нам также необходимо предоставить производные первого и второго порядка (градиент и гессиан) функция потерь по отношению к прогнозам. Эти производные необходимы для процесса оптимизации при повышении градиента. Создайте две дополнительные функции Python, которые вычисляют градиент и гессиан для пользовательской функции потерь с учетом истинных целевых значений и прогнозируемых значений.
  3. Упаковать функцию потерь и ее производные. После определения пользовательской функции потерь и ее производных упакуйте их в одну функцию Python, которая принимает два входных аргумента: истинные целевые значения. и прогнозируемые значения. Эта функция должна возвращать вычисленный градиент и гессиан для заданных входных данных.
  4. Использование пользовательской функции потерь в XGBoost. Наконец, чтобы использовать пользовательскую функцию потерь в XGBoost, просто передайте упакованную функцию в качестве «целевого» параметра при создании модели XGBoost. Например:
parameters = {"objective": custom_loss_function,
              ...
              }
    
model = xgboost.XGBRegressor(**parameters)

Пример: реализация EMD Loss в XGBoost

В случае потери EMD мы можем выполнить описанные выше шаги, чтобы реализовать ее как пользовательскую функцию потери в XGBoost:

Определите функцию потерь EMD. Напишите функцию Python, которая вычисляет потери EMD между истинным целевым распределением и прогнозируемым распределением.

def cdf_emd(x, y):
    """Compute the CDF-EMD loss between two probability distributions."""
    n = x.shape[0]
    A = np.tril(np.ones((n, n)))
    res = A @ (x - y)
    res = (1 / n) * np.dot(res, res)
    return res

Вычислить градиент и гессиан. Реализуйте две дополнительные функции Python, которые вычисляют градиент и гессиан потерь EMD относительно прогнозируемых распределений.

def cdf_emd_grad(x, y):
    """Compute the gradient of the CDF-EMD loss."""
    n = x.shape[0]
    A = np.tril(np.ones((n, n)))
    res = (2 / n) * A.T @ A @ (x - y)
    return res

def cdf_emd_hess(x, y):
    """Compute the Hessian of the CDF-EMD loss."""
    n = x.shape[0]
    A = np.tril(np.ones((n, n)))
    res = (2 / n) * A.T @ A
    return res

Упакуйте функцию потерь EMD и ее производные: объедините функцию потерь EMD и ее производные в одну функцию Python, которая возвращает вычисленный градиент и гессиан.

def CDF_EMD_LOSS(data: np.ndarray, predt: np.ndarray):
    data = data.reshape(predt.shape)
    kRows, kClasses = predt.shape
    grad = np.zeros((kRows, kClasses), dtype=float)
    hess = np.zeros((kRows, kClasses), dtype=float) 
    
    for r in range(kRows):
        x = predt[r].copy()
        y = data[r].copy()
        grad[r, :] = cdf_emd_grad(x, y)
        hess[r, :] = np.diag(cdf_emd_hess(x, y))

    grad = grad.reshape((kRows * kClasses, 1))
    hess = hess.reshape((kRows * kClasses, 1))
    return grad, hess

Использовать функцию потерь EMD в XGBoost. Передайте упакованную функцию потерь EMD в качестве «целевого» параметра при создании модели XGBoost, как показано в предыдущем примере кода.

# Model Parameters
parameters = {"objective": CDF_EMD_LOSS,
              "n_estimators": 100,
              "eta": 0.3,
              "lambda": 1,
              "gamma": 0.1,
              "max_depth": None,
              "verbosity": 0}

# Model Training
model_emd = xgboost.XGBRegressor(**parameters)
model_emd.fit(X_train, y_train_prob)

# Model Prediction
prediction_vector = model_emd.predict(X_valid)

# Evaluation
error_default = np.linalg.norm(prediction_vector - y_valid_prob)

Реализуя функцию потерь EMD в XGBoost, мы можем использовать ее преимущества в различных задачах машинного обучения, особенно при работе с порядковыми или структурированными данными.

Практический пример: сравнение потерь EMD с Softprob в игрушечном наборе данных

В этом разделе мы сравним производительность моделей XGBoost с использованием функции потерь EMD и функции потерь Softprob по умолчанию в игрушечном наборе данных. Цель этого тематического исследования — проиллюстрировать потенциальные преимущества использования функции потерь EMD в определенных сценариях.

Игрушечный набор данных: игрушечный набор данных состоит из 1000 точек данных, каждая из которых содержит 10 признаков, сгенерированных с помощью процесса, имитирующего порядковые или структурированные данные. Набор данных разделен на четыре квадранта, при этом каждая точка данных назначается квадранту в зависимости от ее расстояния от центров квадрантов. Вероятность того, что точка данных принадлежит квадранту, рассчитывается с использованием экспоненциальной функции на основе расстояния. Наконец, целевые метки назначаются на основе наивысшего значения вероятности.

# Generate 2 initial target values
n_samples = 1000
data_points = np.random.rand(n_samples, 2)

# Split data points into 4 quadrants
quadrants = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

# Compute the average distance from each data point to the closest 10 data points in each quadrant
distances = np.zeros((n_samples, 4))
for i, q in enumerate(quadrants):
    quadrant_points = data_points[(data_points[:, 0] >= 0.5 * q[0]) & (data_points[:, 1] >= 0.5 * q[1]) &
                                  (data_points[:, 0] < 0.5 * (q[0] + 1)) & (data_points[:, 1] < 0.5 * (q[1] + 1))]
    for j, p in enumerate(data_points):
        point_distances = cdist(p[np.newaxis, :], quadrant_points)
        distances[j, i] = np.mean(np.sort(point_distances)[:, :10])

# Calculate the probability of belonging to a quadrant
probabilities = np.exp(-distances) / np.sum(np.exp(-distances), axis=1, keepdims=True)

# Generate a 10-feature dataset X related to the probabilities
n_features = 10

# Assign target labels based on the highest probability
labels = np.argmax(probabilities, axis=1)

# Define means for target-related features and noise features
means_target_1 = np.arange(1, n_features*2, 2)
means_target_2 = np.arange(2, n_features*2+1, 2)
means_noise = np.array([0]*n_features)

# Standard deviations for all features
std_devs = np.array([1]*n_features)

# Generate target1-related features
features_target_1 = np.repeat(data_points[:,0:1], n_features, axis=1) * means_target_1
features_target_1 += np.random.normal(0, std_devs, size=(n_samples, n_features))

# Generate target2-related features
features_target_2 = np.repeat(data_points[:,0:1], n_features, axis=1) * means_target_2
features_target_2 += np.random.normal(0, std_devs, size=(n_samples, n_features))

# Generate noise features
features_noise = np.random.normal(means_noise, std_devs, size=(n_samples, n_features))

# Combine all features
X = features_target_1 + features_target_2 + features_noise

Настройка эксперимента. Набор данных разделен на обучающий и проверочный наборы, что обеспечивает сохранение распределения целевых меток в обоих наборах. Функции генерируются на основе целевых меток с разными средними значениями и стандартными отклонениями для каждого квадранта. Этот процесс имитирует реальные сценарии, в которых функции генерируются из распределения, связанного с базовой целевой меткой.

# Shuffle and split the data into training and validation sets
X, y_prob = shuffle(X, probabilities, random_state=42)
X_train, X_valid, y_train_prob, y_valid_prob = train_test_split(X, y_prob, test_size=0.2, random_state=42)
y_true = np.argmax(y_valid_prob, axis=1)

Процесс обучения с потерями EMD и Softprob. Две модели XGBoost обучаются на игрушечном наборе данных, одна с использованием пользовательской функции потерь EMD, а другая с использованием функции потерь Softprob по умолчанию. Обе модели обучаются с использованием одних и тех же гиперпараметров, что обеспечивает справедливое сравнение. Процесс обучения контролируется, а производительность моделей оценивается на проверочном наборе.

# Model Training
model_emd = xgboost.XGBRegressor(**parameters)
model_emd.fit(X_train, y_train_prob)

# Model Prediction
prediction_vector = model_emd.predict(X_valid)

# Evaluation
error_default = np.linalg.norm(prediction_vector - y_valid_prob)
mse_default = mean_squared_error(y_valid_prob, prediction_vector)
# Convert probabilities to categorical labels
labels = np.argmax(y_train_prob, axis=1)

# Train the model
model_default = xgboost.XGBClassifier(**parameters)
model_default.fit(X_train, labels)

# Make predictions
prediction_vector = model_default.predict_proba(X_valid)

# Evaluate the model
error_default = np.linalg.norm(prediction_vector - y_valid_prob)
mse_default = mean_squared_error(y_valid_prob, prediction_vector)

Результаты. Производительность моделей сравнивается на основе результатов набора проверки с использованием соответствующих показателей оценки, таких как точность и потеря журнала. Ожидается, что модель потерь EMD продемонстрирует лучшую производительность в сценариях, где важна порядковая или структурированная природа данных, поскольку она учитывает базовую структуру целевых меток. Модель потерь Softprob, с другой стороны, может работать не так хорошо в таких сценариях, поскольку она явно не учитывает структуру меток.

# Convert probabilities to class labels
y_true = np.argmax(y_valid_prob, axis=1)
y_pred = np.argmax(prediction_vector, axis=1)

# Calculate accuracy
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# Calculate the Mean Absolute Error
mae = mean_absolute_error(y_true, y_pred)
print("Mean Absolute Error:", mae)

Реальные приложения и преимущества потери EMD в XGBoost

В этом разделе мы рассмотрим некоторые реальные приложения, в которых использование функции потерь EMD в XGBoost может привести к повышению эффективности прогнозирования. Мы также подчеркнем преимущества использования потерь EMD в этих сценариях, такие как улучшенная обработка несбалансированных или порядковых данных.

Возможные варианты использования потери EMD:

  1. Прогнозирование порядковых или структурированных данных. Потери EMD могут быть особенно полезны при работе с данными, которые имеют неотъемлемую порядковую или структурированную связь между целевыми метками. Примеры включают прогнозирование уровней удовлетворенности клиентов, оценку рисков или классификацию качества продукции. В таких случаях потеря EMD может помочь зафиксировать естественный порядок целевых меток и улучшить прогностическую эффективность модели.
  2. Задачи классификации с несколькими метками. Потеря EMD может быть полезной в задачах классификации с несколькими метками, где каждый экземпляр может принадлежать нескольким целевым меткам. Функция потерь EMD может помочь модели лучше оценить распределение вероятностей целевых меток, что приведет к более точным прогнозам.
  3. Проблемы с несбалансированными данными. Потеря EMD может быть полезной в сценариях, когда набор данных сильно несбалансирован. Принимая во внимание расстояния между целевыми метками, потеря EMD может помочь модели больше сосредоточиться на классе меньшинства и улучшить ее прогностические характеристики.

Преимущества потери EMD в XGBoost:

  1. Улучшенная обработка порядковых данных. Потеря EMD может эффективно фиксировать порядковые отношения между целевыми метками, что повышает эффективность прогнозирования в задачах, связанных с порядковыми или структурированными данными.
  2. Улучшенная производительность при несбалансированных данных. Принимая во внимание базовую структуру целевых меток, потеря EMD может помочь модели сфокусироваться на классе меньшинства, потенциально повышая ее производительность при проблемах с несбалансированными данными. .
  3. Более надежные прогнозы. Потери EMD могут обеспечить более надежные прогнозы за счет учета взаимосвязей между метками целей, которые могут не учитываться другими функциями потерь, такими как Softprob.

В заключение, функция потерь EMD может предложить значительные преимущества в некоторых реальных приложениях, особенно при работе с порядковыми или структурированными данными. Принимая во внимание базовую структуру целевых меток, потеря EMD может привести к повышению эффективности прогнозирования в различных задачах машинного обучения. Его реализация в XGBoost открывает перед исследователями и практиками новые возможности для изучения альтернативных функций потерь и повышения производительности их моделей.

Заключение

В этом сообщении блога мы рассмотрели преимущества использования потери расстояния Earth Mover’s Distance (EMD) в качестве альтернативы функции потери Softprob по умолчанию в XGBoost. Мы подробно рассмотрели концепцию EMD, ее преимущества как функции потерь и привели пример ее реализации в XGBoost. С помощью тематического исследования с игрушечным набором данных мы продемонстрировали потенциальные улучшения в прогнозировании при использовании потерь EMD.

Подводя итоги основных выводов:

  1. Потеря EMD может фиксировать порядковые отношения и базовую структуру в целевых метках, что приводит к повышению эффективности прогнозирования в определенных задачах.
  2. Реализация потерь EMD в XGBoost проста, что позволяет практикам экспериментировать с этой альтернативной функцией потерь.
  3. Реальные приложения, такие как прогнозирование порядковых данных, классификация с несколькими метками и проблемы с несбалансированными данными, могут выиграть от использования потерь EMD в XGBoost.

Мы рекомендуем читателям поэкспериментировать с потерями EMD в своих собственных моделях XGBoost и изучить потенциальные улучшения производительности прогнозирования. Будущая работа в этой области может включать дальнейшее уточнение функции потерь EMD, разработку более эффективных алгоритмов для вычисления EMD и изучение использования потерь EMD в других структурах повышения градиента. Постоянно совершенствуя наше понимание функций потерь и их влияния на модели машинного обучения, мы можем продолжать расширять границы прогнозной производительности и запускать новые приложения в различных областях.