xgboost: выборочные веса для несбалансированных данных? - PullRequest
0 голосов
/ 13 марта 2020

У меня очень несбалансированный набор данных из 3 классов. Чтобы решить эту проблему, я применил массив sample_weight в XGBClassifier, но я не заметил каких-либо изменений в результатах моделирования? Все показатели в отчете о классификации (матрица путаницы) одинаковы. Есть ли проблема с реализацией?

Класс крыса ios:

military: 1171 
government: 34852 
other: 20869

Пример:

pipeline = Pipeline([
    ('bow', CountVectorizer(analyzer=process_text)), # convert strings to integer counts
    ('tfidf', TfidfTransformer()), # convert integer counts to weighted TF-IDF scores
    ('classifier', XGBClassifier(sample_weight=compute_sample_weight(class_weight='balanced', y=y_train))) # train on TF-IDF vectors w/ Naive Bayes classifier
])

Образец Набор данных:

data = pd.DataFrame({'entity_name': ['UNICEF', 'US Military', 'Ryan Miller'], 
                     'class': ['government', 'military', 'other']})

Классификационный отчет

enter image description here

1 Ответ

1 голос
/ 13 марта 2020
  1. Во-первых, самое важное: использовать мультикласс eval_metric. eval_metric=merror или mlogloss, а затем отправьте нам результаты. Вы показали нам ['precision','recall','f1-score','support'], но это неоптимально или явно не работает, если вы не вычислили их с учетом мультикласса и дисбаланса.
  2. Во-вторых, вам нужно весов . Ваше соотношение классов military: government: other 1:30:18 или в процентах 2: 61: 37%.
    • Вы можете вручную установить веса для каждого класса с помощью xgb.DMatrix..., weights)
    • Заглянуть в свой конвейер (использовать параметры печати или подробности, значения дампа), а не просто слепо полагаться на шаблон, как sklearn.utils.class_weight.compute_sample_weight('balanced', ...) чтобы получить оптимальные веса.
    • Поэкспериментируйте с ручной настройкой весов для каждого класса, начиная с 1 : 1/30 : 1/18, и попробуйте более экстремальные значения. Взаимные ссылки, чтобы более редкий класс получал больший вес.
    • Также попробуйте установить min_child_weight намного выше, поэтому для него требуется несколько образцов (из классов меньшинств) . Начните с min_child_weight >= 2 (* вес редчайшего класса) и попробуйте подняться выше. Остерегайтесь подгонки к очень редкому классу меньшинства (именно поэтому люди используют перекрестную проверку StraifiedKFold для некоторой защиты, но ваш код не использует CV).
  3. Мы можем ' не вижу других ваших параметров для классификатора xgboost (сколько оценок? ранняя остановка или выключение? что такое learning_rate / eta? et c et c.). Похоже, вы использовали значения по умолчанию - они будут ужасны . Или вы не показываете свой код. Не доверять значениям по умолчанию для xgboost, особенно для мультикласса не ожидайте, что xgboost даст хорошие готовые результаты. Прочтите do c и поэкспериментируйте со значениями.
  4. Сделайте все эти эксперименты, опубликуйте результаты, проверьте, прежде чем заключить, что "это не работает". Не ожидайте оптимальных результатов от вне коробки. Не доверяйте или перепроверяйте утилиты sklearn util, попробуйте ручные варианты. (Часто то, что у sklearn есть функция для выполнения чего-либо, не означает, что это хорошо или лучше, или подходит для всех случаев использования, таких как несбалансированный мультикласс)
...