У меня очень несбалансированный набор данных. Я пытаюсь следовать советам по настройке и использовать, scale_pos_weight
но не знаю, как мне его настроить.
Я вижу, что RegLossObj.GetGradient
делает:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
таким образом, градиент положительного образца будет более влиятельным. Однако, согласно статье xgboost , статистика градиента всегда используется локально = в экземплярах определенного узла в определенном дереве:
- в контексте узла, чтобы оценить снижение потерь разделения кандидата
- в контексте конечного узла, чтобы оптимизировать вес, данный этому узлу
Таким образом, невозможно заранее узнать, что было бы хорошо scale_pos_weight
- это совсем другое число для узла, который заканчивается соотношением 1: 100 между положительными и отрицательными экземплярами, и для узла с соотношением 1: 2.
Есть намеки?
unbalanced-classes
xgboost
ihadanny
источник
источник
Ответы:
Обычно Scale_pos_weight - это отношение числа отрицательного класса к положительному классу. Предположим, что в наборе данных содержится 90 наблюдений отрицательного класса и 10 наблюдений положительного класса, тогда идеальное значение scale_pos_Weight должно быть 9. Вы можете проверить следующую ссылку. http://xgboost.readthedocs.io/en/latest/parameter.html
источник
Вся документация гласит, что это должно быть:
На практике это работает довольно хорошо, но если ваш набор данных крайне несбалансирован, я бы рекомендовал использовать что-то более консервативное, например:
Это полезно, чтобы ограничить эффект умножения положительных примеров очень большим весом.
источник
Я понимаю ваш вопрос и разочарование, но я не уверен, что это что-то, что можно вычислить аналитически, скорее вам придется определять хорошие настройки эмпирически для ваших данных, как вы делаете для большинства гиперпараметров, используя перекрестную проверку как @ user2149631 предложил. У меня был некоторый успех, используя SelectFPR с Xgboost и API sklearn, чтобы вместо этого снизить FPR для XGBoost с помощью выбора функции, а затем дополнительно настроить scale_pos_weight между 0 и 1.0. O.9, кажется, работает хорошо, но как и все, YMMV в зависимости от ваших данных. Вы также можете взвешивать каждую точку данных отдельно при отправке ее в XGboost, если вы просматриваете их документы. Вы должны использовать их API, а не оболочку sklearn. Таким образом, вы можете взвесить один набор точек данных намного выше, чем другой, и это повлияет на используемый им алгоритм повышения.
источник
Я также наткнулся на эту дилемму и все еще ищу лучшее решение. Тем не менее, я бы посоветовал вам использовать такие методы, как Grid Search (GridSearchCV в sklearn) для лучшей настройки параметров для вашего классификатора. Однако, если ваш набор данных сильно несбалансирован, стоит рассмотреть методы выборки (особенно методы случайной избыточной выборки и SMOTE) и ансамбль модели на выборках данных с различными соотношениями примеров положительного и отрицательного классов. Вот один хороший и полезный (почти полный) учебник по работе с несбалансированными наборами данных.
https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/
источник