Как мне узнать порядок классов в весах классификатора CatBoost?

#python #nlp #catboost #imbalanced-data

Вопрос:

Это довольно глупый вопрос, но я нигде не смог найти, поэтому я рискну здесь…

Я создаю классификатор с использованием CatBoost. Поскольку это проблема NLP, моими функциями являются слова / токены в твите, а целью является классификация. В принципе, у меня есть что-то вроде этого:

 tweet                       target
I was looking at her...     happy
It's really hot today       mad
Last Friday night was...    sad
.
.
.
 

Из-за соответствия требованиям компании я не могу поделиться набором данных, но я думаю, вы, ребята, поймете и даже можете попробовать использовать другой фрейм данных (этот очень похож https://www.kaggle.com/datatattle/covid-19-nlp-text-classification ). У меня есть 5 классов в качестве цели, и набор данных несбалансирован. Веса:

 happy: 0.80
neutral: 0.11
mad: 0.080
sad: 0.005
confused: 0.005
 

Итак, после разделения на обучение и тестирование, стратифицированные по цели, я использовал этот конвейер:

 pipe = Pipeline([
            (
                "tokenizer",CountVectorizer(analyzer= 'word',
                                            ngram_range=(1, 2),
                                            token_pattern=r"w ",
                                            stop_words="english"
                                        )),
            ("feature_selection", SelectKBest(SelectKBest, k=90)),
            ("clf",  CatBoostClassifier())
])

pipe.fit(X_train, y_train)
 

Поскольку набор данных несбалансирован, как я могу использовать class_weights здесь?
Я видел учебник, делающий что-то похожее на это:

 CatBoostClassifier(class_weights=[1-0.8, 1-0.11, 1-0.08, 1-0.005, 1-0.005])
 

Но как мне узнать, какой из них является правильным порядком?

Я попытался использовать имя, например class_weights={‘happy’: 1-0.8 …}, но это тоже не сработало.

Ответ №1:

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

Ваш второй пример — это то, как вы устанавливаете веса классов для метки, которая не состоит из последовательных целых чисел (например, class_weights={'a': 1.0, 'b': 0.5, 'c': 2.0} ). Смотрите документацию CatBoost по class_weights .

Вы также можете попробовать auto_class_weights='Balanced' , поскольку вы пытаетесь установить веса, обратные балансу классов. Смотрите документацию CatBoost по auto_class_weights .