"Обработка естественного языка"

Классификация текста с помощью простых преобразователей

Решение проблемы классификации двоичного текста с помощью простых преобразователей

Использование моделей Transformer никогда не было проще! Да, именно это говорит Simple Transformers автор Тилина Раджапаксе, и я согласна с ним, и вы должны. Возможно, вы видели длинный код с сотнями строк для реализации моделей трансформаторов, таких как BERT, RoBERTa и т. Д. Как только вы поймете, как использовать Simple Transformers, вы поймете, насколько легко и просто использовать модели трансформаторов.

БиблиотекаSimple Transformers построена на основе библиотеки Hugging Face Transformers. Библиотека transformers предоставляет ряд предварительно обученных моделей, таких как BERT, RoBERTa, XLNET и т. Д., Которые можно использовать для решения многих задач НЛП.

Простые преобразователи можно использовать для классификации текста, распознавания именованных сущностей, ответов на вопросы, моделирования языков и т. Д. В этой статье мы решим проблему двоичной классификации с помощью простых преобразователей в НЛП с набором данных катастрофических твитов от Kaggle. Давайте начнем.

Импорт библиотек и наборов данных

Загрузите набор данных из Kaggle в Colab. В своем профиле Kaggle перейдите к My Account > API и нажмите Create New API Token.. Будет загружен файл kaggle.json. Получив этот файл, запустите приведенный ниже код. Во время выполнения вам будет предложено загрузить файл JSON, чтобы вы могли загрузить файл kaggle.json.

from google.colab import files
files.upload()
!pip install -q kaggle
!mkdir ~/.kaggle
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json
!kaggle competitions download -c nlp-getting-started

Google Colab поставляется с предустановленными трансформаторами. Здесь мы обновляем библиотеку трансформаторов, поэтому у нас будет ее последняя версия, а затем мы установим Simple Transformers:

!pip install --upgrade transformers
!pip install simpletransformers

Теперь импортируйте все необходимые библиотеки:

import numpy as np
import pandas as pd
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split
from simpletransformers.classification import ClassificationModel, ClassificationArgs

Предварительная обработка

Теперь мы загрузим наборы данных train и test в фреймы данных pandas, а именно train & test. Всего в наборе поездов 7613 записей, а в тестовой - 3263 записи.

train = pd.read_csv(‘/content/train.csv’)
test = pd.read_csv(‘/content/test.csv’)
print(‘Shape of train set {}’.format(train.shape))
print(‘Shape of test set {}’.format(test.shape))
>>> Shape of train set (7613, 5) 
>>> Shape of test set (3263, 4)

Поскольку нам не нужны столбцы ‘id’, ‘keyword’ и ‘location’, мы удалим эти столбцы как из обучающих, так и из тестовых данных.

train.drop([‘id’, ‘keyword’, ‘location’], axis=1, inplace=True)
test.drop([‘id’, ‘keyword’, ‘location’], axis=1, inplace=True)

В обоих наборах данных нет нулевых значений. Поэтому нам не нужно беспокоиться об обработке пропущенных значений.

train.isnull().sum().sum()
>> 0
test.isnull().sum().sum()
>> 0

Давайте посмотрим на целевое распределение.

Мы будем использовать разделение тестов на поезд и использовать 80% данных для построения модели классификации.

train.columns = ['text', 'labels']
train_df, valid_df = train_test_split(train, test_size=0.2, stratify=train[‘labels’], random_state=42)

Инициализировать ClassificationModel

Поскольку мы пытаемся решить двоичную классификацию текста, нам придется использовать ClassificationModel согласно этой таблице.

Для ClassificationModel нам нужно передать model_type и model_name. Мы будем использовать roberta и roberta_base. Однако вы можете выбрать любую модель из этого списка и поэкспериментировать.

Модели глубокого обучения, такие как трансформаторы, работают на графическом процессоре с поддержкой CUDA. По умолчанию CUDA включен. Перед использованием Simple Transformers убедитесь, что в вашей системе включен графический процессор. Поскольку мы имеем дело с двоичной классификацией, num_labels следует установить на 2.

Есть несколько параметров, которые мы можем настроить для модели классификации, которую можно найти здесь. Здесь мы используем всего три параметра: num_train_epochs, overwrite_output_dir & manual_seed. Некоторые из других важных и наиболее часто используемых параметров - learning_rate, train_batch_size и т. Д.

model_args = ClassificationArgs(num_train_epochs=1, overwrite_output_dir=True, manual_seed=42)
model = ClassificationModel(model_type='roberta', model_name='roberta-base', use_cuda=True, num_labels=2, args=model_args)

Обучите модель

Метод train_model() обучает модель с использованиемtrain_df фрейма данных. Это будет работать в течение одной эпохи, поскольку мы установили num_train_epoch в 1.

model.train_model(train_df)

Оцените модель

Метод eval_model() оценивает модель с использованием фрейма данных valid_df и возвращает 3 результата.

result, model_outputs, wrong_preds = model.eval_model(valid_df)

Поскольку оценочная метрика для этого конкурса - f1_score, давайте рассчитаем f1_score с помощью sklearn.

predictions = []
for x in model_outputs:
    predictions.append(np.argmax(x))
print(‘f1 score:’, f1_score(valid_df[‘labels’], predictions))
>>> f1 score: 0.8134044173648134

Прогноз на тестовой выборке

Метод predict() будет использоваться для прогнозирования невидимых данных. Сделав прогноз на тесте и отправив его в Kaggle, дал f1_score из 0.81949 в таблице лидеров.

test_predictions, raw_outputs = model.predict(test[‘text’])
sample_sub[‘target’] = test_predictions
sample_sub.to_csv(‘submission.csv’,index=False)
files.download(‘submission.csv’)

Это действительно хороший результат, учитывая, что мы экспериментировали только с одной моделью трансформатора на 80% данных поездов, а также не исследовали оптимизацию гиперпараметров, раннюю остановку и перекрестную проверку k-кратных значений. Если мы сможем попробовать все это, мы сможем еще больше улучшить результат.

Полный код можно найти здесь на Colab. Вы также можете просмотреть тот же код ниже:

Вот еще одна статья, которую вам может быть интересно прочитать:



Заключение

Надеюсь, вам понравилось читать это руководство и вы поняли, как использовать простые преобразователи для задач классификации.

Ссылки



Чтобы читать больше таких интересных статей о Python и Data Science, подпишитесь на мой блог www.pythonsimplified.com. Вы также можете связаться со мной в LinkedIn.