Бинарная и мультиклассовая классификация текста (автоматическое обнаружение в конвейере тестирования модели)

Вступление

В моей предыдущей статье (Выбор модели в классификации текста) я представил способ выбора модели путем сравнения классического машинного обучения и глубокого обучения для задачи классификации двоичного текста.

Блокнот структурирован для автоматического запуска с перекрестной проверкой всех алгоритмов и показывает результаты для различных показателей, позволяя пользователю выбирать алгоритм в соответствии с его потребностями.

Здесь была создана записная книжка, чтобы показать различные метрики и кривые обучения для бинарной или мультиклассовой задачи. Записная книжка автоматически определит, в какой конфигурации находится набор данных.

Блокнот и скрипты доступны здесь: GitHub

Информация

Цель состоит в том, чтобы использовать разные модели и увидеть их поведение во время обучения и теста. По возможности в алгоритмах реализована ранняя остановка, чтобы избежать переобучения. Для глубокого обучения можно использовать предварительно обученную модель во время обучения, чтобы сократить время обучения.

Вначале важны две вещи:
- имя текстового столбца для классификации
- имя столбца метки

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

Записная книжка начинается со списка параметров, используемых для тестирования нужных вам моделей. Этот список показан в сути ниже. Lang определяет, нужно ли записной книжке вызывать API Translator () из Google для определения языка набор данных (по умолчанию английский).

Соответствующая функция Python:

I - Очистка данных, обработка текста

Данные, использованные в этом посте, такие же, как и в предыдущей статье, набор данных IMDB (поскольку это набор данных с открытым исходным кодом, подробнее здесь).

Набор данных не совсем чистый, и в задаче «Обработка естественного языка» вам необходимо очистить данные от возникшей у вас проблемы. Этот шаг повлияет на производительность ваших алгоритмов.

Что я сделал в отношении набора данных IMDB?

  • Удалите все заглавные буквы слова и оставьте только первое (важно для извлечения NER)
  • Удалите URL (если есть)
  • Удалите файлы html.
  • Удалить смайлы
  • Замените сокращение ‘ve на have
  • Замените сокращение n‘t на not

II - Полярность

Полярность текста оценивается библиотекой TextBlob и строится в виде диаграмм (сделанных на выборке из 5000 строк).

III - Текстовая информация

У всех обзоров разная длина и разное количество слов. Интересно изучить эту информацию:

  • Извлеките количество слов
  • Извлечь количество символов
  • Вычислить плотность (количество символов / количество слов)
  • Извлеките количество слов, у которых первая буква заглавная.

Мы можем легко изобразить количество символов с помощью диаграмм:

Рецензии в основном состоят из 550–600 знаков.

Также интересно посмотреть на распределение классов (меток).

Набор данных сбалансирован, ~ 2500 обзоров по категориям этикеток (бинарные).

VI - N-граммы

N-граммы - это техника, которая разрезает предложения на лексемы из n слов, например:

Я изучаю машинное обучение, чтобы стать специалистом по данным

  • Юниграмма: [Я, учусь, машина, учусь, для, становлюсь, данные, ученым]
  • Биграммы: [(я учусь), (изучаю машину), (машинное обучение), (учусь), (чтобы стать), (стать), (данными), (специалист по данным)]
  • Триграммы: [(я изучаю машину), (изучаю машинное обучение), (машинное обучение), (учусь, чтобы стать), (чтобы стать), (стать данными), (специалист по данным )]

Я фанат n-грамм, потому что могу показать на их основе, была ли предварительная обработка правильной. В записной книжке вы найдете значение слова для униграммы, биграммы, триграммы со стоп-словами и без них (слово без значения) и тест на 5 граммов.

Для триграмм со стоп-словами:

И без стоп-слов:

Разница очень важна. Текст, как правило, содержит множество игнорируемых слов, это не важно для таких методов, как TF-IDF или встраивание слов, но существует для горячей кодировки, потому что каждое слово будет иметь одинаковую важность в предложении.

Какие модели и показатели мы используем?

Трубопровод настроен на использование разных моделей. В таблице 1 представлены алгоритмы машинного обучения и глубокого обучения, а также используемые показатели.

Как это выглядит

Я покажу вам два примера: первый: Стохастическое усиление градиента и мелкая нейронная сеть.

Код для обучения классического классификатора следующий:

Функция принимает на вход классификатор и данные, соответствующие модели.

Для показателей создана такая же функция:

Эта функция покажет различную кривую (точный вызов, истинный ложноположительный коэффициент, ROC AUC), матрицу неточностей, каппу Коэна (сравнение модели и того, как работают два аннотатора) и точность.

Повышение стохастического градиента:

Наилучший результат для алгоритма SGD (функция 1) был получен с методом TF-IDF.

if sgd: # does the computation if sgd = True
    print("\nStochastic Gradient Descent with early stopping for TF-IDF\n")
    print("Early Stopping : 10 iterations without change")
    metrics_ML(SGDClassifier(loss='modified_huber', max_iter=1000, tol=1e-3,   n_iter_no_change=10, early_stopping=True, n_jobs=-1 ),xtrain_tfidf, train_y, xvalid_tfidf, valid_y, gb=True)

Функция metrics_ML () вызовет функцию classifier_model () для обучения модели и вычисления показателей. Самый простой способ обучить классификатор и метрики.

Результаты следующие:

Stochastic Gradient Descent with early stopping for TF-IDF

Early Stopping : 10 iterations without change
Execution time : 0.060 s
Score : 84.7 %

Classification Report

              precision    recall  f1-score   support

    negative       0.87      0.81      0.84       490
    positive       0.83      0.88      0.85       510

    accuracy                           0.85      1000
   macro avg       0.85      0.85      0.85      1000
weighted avg       0.85      0.85      0.85      1000

Model: f1-score=0.855 AUC=0.923

ROC AUC=0.919

Не так уж и плохо, с результатом 84,7%. Могли бы мы сделать лучше?

Мелкая нейронная сеть:

Код для мелкой нейронной сети был представлен в предыдущей статье. Снова здесь:

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

Как это использовать:

es = tf.keras.callbacks.EarlyStopping(monitor='val_loss', mode='auto', patience=3)
if shallow_network:
    model_shallow = shallow_neural_networks(word_index, pre_trained=pre_trained)
    history = model_shallow.fit(train_seq_x, train_y,
                    epochs=1000, callbacks=[es],
                    validation_split=0.2, verbose=True)
    results = model_shallow.evaluate(valid_seq_x, valid_y)

Выход:

Train on 3200 samples, validate on 800 samples
Epoch 1/1000
3200/3200 [==============================] - 2s 578us/sample - loss: 0.7117 - accuracy: 0.4837 - val_loss: 0.7212 - val_accuracy: 0.5175
...
Epoch 98/1000
3200/3200 [==============================] - 1s 407us/sample - loss: 0.4991 - accuracy: 0.9991 - val_loss: 0.5808 - val_accuracy: 0.8850
1000/1000 [==============================] - 0s 383us/sample - loss: 0.5748 - accuracy: 0.8590

Показатели:

                precision    recall  f1-score   support

    negative       0.86      0.85      0.86       490
    positive       0.86      0.87      0.86       510

    accuracy                           0.86      1000
   macro avg       0.86      0.86      0.86      1000
weighted avg       0.86      0.86      0.86      1000


The balanced accuracy is : 85.88%


The Zero-one Loss is : 14.1%


Explained variance score: 0.436


ROC AUC=0.931

Model: f1-score=0.863 AUC=0.932

Cohen's kappa: 71.78%

Так что с нейросетью результат лучше. Однако сравнение не может быть выполнено для одного запуска каждого метода. Для правильного выбора моделей необходимо использовать такие методы оценки, как перекрестная проверка (см .: Выбор модели в текстовой классификации).

Заключение

Конвейер является автоматическим, вам просто нужно настроить параметры в начале, выбрать различные алгоритмы, которые вы хотите протестировать, и дождаться результатов.

Цель состоит в том, чтобы показать различные метрики с помощью алгоритмов и методов (одноразовое кодирование, TF-IDF, n-граммы TF-IDF, n-граммы символов TF-IDF и вложения слов) и выберите класс алгоритмов, который вы хотите использовать для решения своей задачи. Следующим шагом будет настройка гиперпараметров и получение результатов.

Эта работа может помочь быстро протестировать варианты использования НЛП для классификации текста, бинарной или мультиклассовой без знания классов. Пайплайн может принимать тексты на французском или английском языках.

Блокнот и классы доступны на GitHub.

Следующие шаги

  • Реализуйте несбалансированные методы для автоматической балансировки набора данных
  • Реализуйте модель классификации трансформаторов
  • Реализуйте предварительно обученные трансформаторы
  • Тестирование НЛП с обучением с подкреплением
  • Сеть знаний
  • Используйте распределенное глубокое обучение
  • Используйте TensorNetwork для ускорения нейронных сетей
  • Выберите класс моделей с помощью правильного метода и выполните настройку гиперпараметров.
  • Используйте квантовое НЛП (QNLP)