"Обработка естественного языка"
Классификация текста с помощью простых преобразователей
Решение проблемы классификации двоичного текста с помощью простых преобразователей
Использование моделей 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.