Сейчас я извлекаю информацию с помощью NER. Моя область набора данных (в основном) связана с информатикой. Он содержит метку/тег: «TUJUAN», «METODE» и «TEMUAN». Проблема в том, что почти 80-90% данных помечены буквой O, что означает, что у них нет значимого тега. Точность и полнота модели равны 0, а точность составляет около 0,78. Я использую IndoBERT в качестве модели для задачи NER.

Я подозреваю, что это происходит потому, что мой набор данных крайне несбалансирован. Сначала я хочу изменить функцию потерь, основанную на документации BertForTokenClassification, на Dice Loss или Focal Loss, как упоминалось здесь, но я не знаю, как это сделать, поскольку мои знания Python все еще очень слабы.
класс BertForTokenClassification(BertPreTrainedModel): def __init__(self, config): супер().__init__(конфигурация) self.num_labels = config.num_labels self.bert = BertModel(config, add_pooling_layer=False) classifier_dropout = ( config.classifier_dropout, если config.classifier_dropout не равен None else config.hidden_dropout_prob ) self.dropout = nn.Dropout(classifier_dropout) self.classifier = nn.Linear(config.hidden_size, config.num_labels) # Инициализируем веса и применяем окончательную обработку self.post_init() @add_start_docsstrings_to_model_forward(BERT_INPUTS_DOCSTRING.format("размер_пакета, длина_последовательности")) @add_code_sample_docsstrings( контрольная точка = _CHECKPOINT_FOR_TOKEN_CLASSIFICATION, output_type = TokenClassifierOutput, config_class=_CONFIG_FOR_DOC, ожидаемый_выход=_TOKEN_CLASS_EXPECTED_OUTPUT, ожидаемая_потеря=_TOKEN_CLASS_EXPECTED_LOSS, ) вперед вперед( себя, input_ids: Необязательный[torch.Tensor] = Нет, Внимание_маска: Необязательный[torch.Tensor] = Нет, token_type_ids: Необязательный[torch.Tensor] = Нет, Position_ids: Необязательно[torch.Tensor] = Нет, head_mask: Необязательно[torch.Tensor] = Нет, inputs_embeds: Необязательный[torch.Tensor] = Нет, метки: Необязательный[torch.Tensor] = Нет, output_attentions: Необязательный[bool] = Нет, output_hidden_states: Необязательный[bool] = Нет, return_dict: Необязательный[bool] = Нет, ) -> Union[Tuple[torch.Tensor], TokenClassifierOutput]: р""" метки (`torch.LongTensor` формы `(batch_size, Sequence_length)`, *необязательно*): Метки для расчета потерь классификации токенов. Индексы должны находиться в `[0, ..., config.num_labels - 1]`. """ return_dict = return_dict, если return_dict не равен None else self.config.use_return_dict выходные данные = self.bert( входные_ид, внимание_маска = маска_внимания, token_type_ids=token_type_ids, Position_ids=position_ids, head_mask=head_mask, inputs_embeds = inputs_embeds, output_attentions=output_attentions, output_hidden_states=output_hidden_states, return_dict=return_dict, ) последовательность_выход = выходы [0] последовательность_выход = self.dropout(sequence_output) logits = self.classifier(sequence_output) потеря = нет если метки не None: loss_fct = CrossEntropyLoss() loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)) если не return_dict: вывод = (логиты,) + выходы[2:] return ((loss,) + вывод), если потеря не равна Нету другого вывода вернуть TokenClassifierOutput( потеря = потеря, логиты = логиты, скрытые_состояния = выходные данные.скрытые_состояния, внимания = выходные данные. внимания, ) Мой полный код здесь
Могу ли я получить помощь, как справиться с набором данных о дисбалансе, исходя из моих проблем?