Введение

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

Сопоставление с проблемой машинного обучения

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

Набор данных

Я получил набор данных от Kaggle. Набор данных для сбора SMS-спама. Набор данных состоит из примерно 5 тыс. сообщений, помеченных как спам или ветчина. Он состоит из двух столбцов, один столбец содержит весь текст SMS, а другой содержит метку, то есть помечен как спам или ветчина.

Исследовательский анализ данных (EDA)

Из приведенного выше графика мы ясно видим, что набор данных, который у нас есть, является несбалансированным, здесь всего около 747 спам-сообщений.

  • Из приведенного выше графика видно, что большая часть длины предложений находится в диапазоне от 0 до 200, поэтому мы можем рассматривать любое предложение выше 210 как выброс.

Выводы после EDA

  • Набор данных сильно несбалансирован.
  • Предложение с максимальной и минимальной длиной 925 и 2.
  • Мы можем рассматривать любые предложения, длина которых превышает 210, как выбросы.
  • Большинство предложений имеют длину от 2 до 210.

Разработка функций

  • Поскольку мы имеем дело с текстовыми данными, мы можем рассматривать длину предложения как новую функцию помимо текста.

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

  • В рамках предварительной обработки сначала мы преобразуем текст в нижний регистр, удалим знаки препинания и стоп-слова и выполним поиск корней.
  • И мы можем нормализовать длину столбцов предложений, поскольку они отличаются от [2,210], нормализовав их между [0,1].
  • Мы используем векторизатор TF-IDF для преобразования текста в числа (поскольку мы не можем передать необработанный текст в модель).

После выполнения векторизации tf idf на корпусе полученный результат будет разреженной матрицей.

Далее мы объединим вектор tf idf и нормализованную длину, используя hstack.

  • Мы будем использовать кодировщик меток для преобразования меток в числа.
  • Из EDA мы узнали, что это очень несбалансированный набор данных, поэтому мы выполняем SMOTE на тех данных, которые у нас есть.

Что такое метод передискретизации синтетического меньшинства (SMOTE)?

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

Модели машинного обучения

  • Наивная байесовская модель Сначала я попробовал наивную байесовскую модель и использовал поиск по сетке cv, чтобы найти лучшие параметры для модели. После обучения модели я получил тренировочный и тестовый f1-счет 96,17% и 94,97%.
  • Методы ансамбля Здесь мы использовали классификаторы голосования по большинству путем суммирования KNN, случайного леса и логистической регрессии.
  • Сначала я использовал поиск по сетке cv, чтобы найти лучшие гиперпараметры для KNN, случайного леса и логистической регрессии.
  • Позже я обучил эти модели доступным лучшим гиперпараметрам и, кроме того, я выбрал классификатор голосования, чтобы получить лучший результат.

. Наконец я получил поезд и тест f1 оценка около 99% и 96%.

Модель глубокого обучения.

  • Здесь я использовал модель CNN для классификации текста.
  • Вместо того, чтобы использовать векторизатор tf idf, я построил матрицу встраивания, так что вся матрица будет обучаться вместе с нейронной сетью.
  • Этапы создания матрицы внедрения
  • Сначала преобразуйте текст в токены с помощью токенизатора, а затем примените отступы к тексту, чтобы вы могли сделать весь текст одинаковой длины. Здесь я применил отступ длиной 250, т.е. если ваш текст имеет длину 215, а остальные токены дополнены нулями до длины 250.

  • После преобразования текстовых токенов нам нужно построить матрицу встраивания, поэтому я воспользовался помощью glove.6B.100d.txt.
  • Векторы для построения матрицы встраивания размерности (250X100) для каждого токена.

  • И веса в этой матрице будут обучаться по построенной нами нейронной сети.
  • Окончательная архитектура модели, которая будет обучаться.

.Наконец-то я получил поезд и тест f1 с результатом 99% и 96,02%.

Использование модели BERT

  • Вместо создания модели с нуля мы можем использовать современные модели, такие как BERT, и использовать их для выполнения задач классификации. Подробная информация об архитектуре BERT делает этот блог длинным, поэтому вы можете найти подробности в Наглядном руководстве по использованию BERT в первый раз.
  • Обычно Берт принимает 3 входа: токены, маскированные токены и токены сегментации.
  • И они передаются в BERT, и, наконец, мы получаем вектор признаков поверх него, мы создадим свой собственный классификатор.

  • Здесь X_train_pooled_output и X_test_pooled_output — это векторы признаков, которые мы будем передавать в наш собственный классификатор.
  • Окончательную архитектуру модели можно увидеть ниже.

  • Здесь мы не занимаемся тонкой настройкой или обучением всей модели BERT, вместо этого мы передаем наши данные в модель BERT и получаем вектор признаков. И поверх него мы строим классификатор.
  • Наконец я получил поезд и тест f1 с результатом 88,23% и 86,27%.
  • Поскольку доступность данных меньше, использовать BERT — не лучшая идея.

Выводы

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

Дальнейшие работы

  • Мы можем создать внешний интерфейс и написать API для предсказания модели и интегрироваться с внешним интерфейсом.
  • Мы можем использовать контейнеры Docker и разместить модель в облаке.

Исходный код



ЛинкедИн

Давайте подключимся в LinkedIn