Яке правильне використання scale_pos_weight в xgboost для незбалансованих наборів даних?


26

У мене дуже незбалансований набір даних. Я намагаюся дотримуватися порад щодо налаштування та користуватися, scale_pos_weightале не знаю, як слід його настроїти.

Я бачу, що RegLossObj.GetGradientце:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

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

  1. в контексті вузла, щоб оцінити зменшення втрат кандидата на розкол
  2. у контексті листового вузла, щоб оптимізувати вагу, надану цьому вузлу

Тож немає можливості заздалегідь дізнатися, що було б добре scale_pos_weight- це зовсім інше число для вузла, який закінчується співвідношенням 1: 100 між позитивними та негативними екземплярами, а також для вузла зі співвідношенням 1: 2.

Якісь підказки?


Можливо, ви можете налаштувати параметр у CV з 5-ти кратним 5 повторенням. Але для цього вам може знадобитися написати код.
користувач2149631

Відповіді:


22

Як правило, Scale_pos_weight - відношення числа негативного класу до позитивного класу. Припустимо, у наборі даних є 90 спостережень за негативним класом та 10 спостережень за позитивним класом, то ідеальне значення scale_pos_Weight має бути 9. Ви можете перевірити наступне посилання. http://xgboost.readthedocs.io/en/latest/parameter.html


1
Як би це застосувати для набору даних багатокласового? Як щодо 28 класів? Це мені незрозуміло
Габріель Циглер

1
@Gabriel Я вважаю, що тоді було б краще піти на вагові класи. Ви можете використовувати scale_pos_weight, використовуючи один підхід проти відпочинку. Наприклад, створити муляжі для 28 класів. Тоді ви можете використовувати кожну як проблему бінарної класифікації. Таким чином ви матимете справу з 28 різними моделями.
Харшит Мехта

Я бачу, але коли я використовую onevsrest, класифікатор також не дає мені багатозначного виводу, правда? Не один клас із 28
Габріель Циглер

Як ?. Наприклад: Класи - це A, B, C. Таким чином, ви можете мати двійковий класифікатор для класифікації (A / Not A), інший - (B / Not B). Це можна зробити для 'n' кількості класів. Тоді серед усіх ймовірностей, що відповідають кожному класифікатору, ви повинні знайти спосіб призначення класів.
Харшит Мехта

Я звик використовувати onevsrest для багатозначних, але спробую! Спасибі!
Габріель Циглер

3

Уся документація говорить, що це має бути:

scale_pos_weight = count(negative examples)/count(Positive examples)

На практиці це працює досить добре, але якщо ваш набір даних є вкрай незбалансованим, я рекомендую використовувати щось більш консервативне, як-от:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Це корисно для обмеження ефекту від множення позитивних прикладів на дуже високу вагу.


1

Я розумію ваше запитання і розчарування, але я не впевнений, що це може бути обчислено аналітично, швидше вам доведеться емпірично визначити хороший параметр для своїх даних, як це робиться для більшості гіпер параметрів, використовуючи перехресну перевірку як @ user2149631 запропонував. Я мав певний успіх із використанням SelectFPR з Xgboost та API sklearn, щоб знизити FPR для XGBoost за допомогою вибору функцій, а потім додатково настроїти шкалу_pos_weight між 0 і 1,0. O.9, здається, працює добре, але як і будь-що, YMMV залежно від ваших даних. Ви також можете зважувати кожну точку даних окремо, надсилаючи її до XGboost, якщо переглядати їх документи. Ви повинні використовувати їх API, а не обгортку sklearn. Таким чином ви можете набрати один набір точок даних набагато вище, ніж інший, і це вплине на алгоритм прискорення, який він використовує.


0

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

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

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