Введение
В общем, мы получим много текстовых сообщений на наш мобильный. Итак, здесь я собираюсь построить модель машинного обучения, которая будет классифицировать наши текстовые сообщения, являются ли они спамом или нет.
Сопоставление с проблемой машинного обучения
Таким образом, как правило, вы будете получать входные данные в виде текстового сообщения, и ваша конечная цель — классифицировать, является ли это спамом или нет. Так что это своего рода проблема бинарной классификации. Итак, нам нужно создать классификатор, который принимает входной текст и классифицирует его.
Набор данных
Я получил набор данных от 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