Веса для несбалансированной классификации - PullRequest
1 голос
/ 10 марта 2020

Я работаю с несбалансированной классификационной проблемой, в которой целевая переменная содержит:

np.bincount(y_train)
array([151953,  13273])

т.е. 151953 нули и 13273 единицы.

Для решения этой проблемы Я использую параметр XGBoost weight при определении DMatrix:

dtrain = xgb.DMatrix(data=X_train, 
                     label=y_train,
                     weight=weights)

Для весов, которые я использовал:

bc = np.bincount(y_train)
n_samples = bc.sum()
n_classes = len(bc)
weights = n_samples / (n_classes * bc)
w = weights[y_train.values]

Где weights array([0.54367469, 6.22413923]), и с последней строкой кода я просто индексирую ее, используя двоичные значения в y_train. Это похоже на правильный подход к определению весов, поскольку он представляет фактическое соотношение между количеством значений одного класса по сравнению с другим. Однако это, кажется, благоприятствует классу меньшинства, что можно увидеть, проверив матрицу путаницы:

array([[18881, 19195],
       [  657,  2574]])

Так что, просто попробовав различные значения веса, я понял, что с довольно близким отношением веса, в частности array([1, 7]), результаты кажутся гораздо более разумными:

array([[23020, 15056],
       [  837,  2394]])

Поэтому мой вопрос:

  • Почему использование фактических весов каждого класса дает плохие показатели?
  • Как правильно установить вес для несбалансированной задачи?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Внутренне xgboost использует входные веса для увеличения вклада выборок из класса меньшинства в функцию потерь посредством умножения вычисленных градиентов и гессианов на веса [ref] .

Хотя это многообещающе и популярно, нет никаких доказательств того, что упомянутый вами метод приведет к наилучшей производительности (это также зависит от того, как заданы другие гиперпараметры, распределения данных и метри c используемый); это просто heuristi c. Вы можете также использовать RO C -AU C для оценки (как рекомендуется от xgboost). Как и большинство других гиперпараметров, более систематическим c методом оптимизации весов является поиск по сетке. Здесь - это реализация.

0 голосов
/ 11 марта 2020

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

scale_pos_weight = сумма (отрицательные экземпляры) / сумма (положительные экземпляры)

Этот параметр может быть настроен так, что вы можете использовать методы, такие как GridSearchCV, чтобы найти лучшие параметры.

...