Как правильно использовать 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 повторов. Но вам может понадобиться написать код, чтобы сделать это.
user2149631

Ответы:


22

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


1
Как это применимо к мультиклассовому набору данных? Как насчет 28 классов? Это не ясно для меня
Габриэль Циглер

1
@ Габриэль Я думаю, тогда было бы лучше пойти на весы класса. Вы можете использовать scale_pos_weight, используя подход один против остальных. Например, создать манекены для 28 классов. Затем вы можете использовать каждый из них в качестве проблемы двоичной классификации. Таким образом, вы будете иметь дело с 28 различными моделями.
Харшит Мехта

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

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

Я привык использовать onevsrest для multilabel, но я попробую! Благодарность!
Габриэль Циглер

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 с помощью выбора функции, а затем дополнительно настроить scale_pos_weight между 0 и 1.0. O.9, кажется, работает хорошо, но как и все, YMMV в зависимости от ваших данных. Вы также можете взвешивать каждую точку данных отдельно при отправке ее в XGboost, если вы просматриваете их документы. Вы должны использовать их API, а не оболочку sklearn. Таким образом, вы можете взвесить один набор точек данных намного выше, чем другой, и это повлияет на используемый им алгоритм повышения.


0

Я также наткнулся на эту дилемму и все еще ищу лучшее решение. Тем не менее, я бы посоветовал вам использовать такие методы, как Grid Search (GridSearchCV в sklearn) для лучшей настройки параметров для вашего классификатора. Однако, если ваш набор данных сильно несбалансирован, стоит рассмотреть методы выборки (особенно методы случайной избыточной выборки и SMOTE) и ансамбль модели на выборках данных с различными соотношениями примеров положительного и отрицательного классов. Вот один хороший и полезный (почти полный) учебник по работе с несбалансированными наборами данных.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.