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

Контур

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

  • прочитать необработанные данные и очистить их;
  • создать набор функций, которые будут использоваться для различения разных языков;
  • визуализировать особенности и определить наиболее важные с помощью анализа главных компонентов (PCA);
  • построить три модели прогнозирования: 1) Дерево решений, 2) Случайный лес и 3) Повышение градиента;
  • оцените предсказательную силу этих моделей и выберите самую лучшую.

Полный код можно найти в этом репозитории на Github. Без лишних слов, давайте сразу перейдем к делу.

Импорт модулей Python

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

Чтение и очистка входных данных

  • Данные для этого проекта находятся в файле под названием lang_data.csv, который можно загрузить из репозитория Github.
  • Хотя можно использовать файлы на других языках, я подчеркиваю, что созданные функции (немного позже) были специально разработаны для языков, упомянутых ранее (например, английского, голландского (в файле Nederlands) и африкаанс).
  • Данные очищаются от нулевых значений и форматируются соответствующим образом для анализа.
  • Обратите внимание, что в некоторых наблюдениях в столбце «текст» есть пустое значение, но им назначен язык. Поскольку пустая строка может быть найдена на любом языке и не может быть дифференцирована по какой-либо функции, мы исключаем их из данных.

Создание функции

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

  • word_count: подсчитывает количество слов в каждом текстовом наблюдении. Если вводимый текст представляет собой предложение, то последнее в некоторых языках может иметь тенденцию состоять из большего количества слов.
  • character_count: подсчитывает количество непробельных символов. Предложения или слова на некоторых языках обычно могут содержать больше символов.
  • плотность_слова: делит число_слов на число_символов и создает среднее относительное отношение между двумя последними переменными. Эта функция стандартизирует длину слова в зависимости от количества слов и символов во вводимом тексте.
  • punc_count: подсчитывает количество знаков препинания при вводе текста. Некоторые языки могут использовать больше знаков препинания.
  • v_char_count: подсчитывает, сколько раз буква «v» используется в тексте. В африкаанс «w» и «v» сливаются, чтобы стать звонким «v». Пример: «vɛrk»: африкаанс, «wɛrk» по-голландски.
  • w_char_count: подсчитывает, сколько раз буква «w» используется в тексте.
  • ij_char_count: подсчитывает, сколько раз «ij» повторяется в тексте. Обычно встречается на голландском языке.
  • num_double_consec_vowels: подсчитывает количество одинаковых последовательных гласных в тексте. И африкаанс, и голландский, скорее всего, будут иметь одинаковые последовательные гласные.
  • num_consec_vowels: подсчитывает количество различных последовательных гласных в тексте. И африкаанс, и голландский, скорее всего, будут иметь одинаковые последовательные гласные. Более того, когда «g» или «v» появляются между гласными, в африкаансе они опускаются, а не в голландском.
  • num_vowels: количество гласных в тексте.
  • vowel_de density: нормализует количество гласных к количеству слов в тексте.
  • заглавные буквы: подсчитывает количество заглавных букв в тексте. В некоторых языках может использоваться больше заглавных букв.
  • caps_vs_length: стандартизирует количество заглавных букв, используемых для общего количества символов в тексте.
  • num_exclamation_marks: подсчитывает количество восклицательных знаков в тексте. В некоторых языках может использоваться больше восклицательных знаков.
  • num_question_marks: подсчитывает количество вопросительных знаков в тексте. Некоторые языки могут использовать больше вопросительных знаков.
  • num_punctuation: подсчитывает количество знаков препинания в тексте. В некоторых языках может использоваться больше знаков препинания.
  • num_unique_words: подсчитывает количество уникальных слов в тексте. Некоторые языки могут использовать более уникальные слова.
  • num_repeated_words: подсчитывает количество повторяющихся слов в тексте. Некоторые языки могут чаще повторять слова.
  • words_vs_unique: соответствие количества уникальных слов количеству слов в тексте.
  • encode_ascii: проверяет, можно ли закодировать текст с помощью utf-8, в котором используются английские символы. Эта функция, скорее всего, будет верна для текста на английском языке.

Обобщение характеристик

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

df.groupby('language').mean().T

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

Корреляционный анализ

Затем мы исследуем степень корреляции между созданными нами функциями. Идея состоит в том, что, если две или более функции сильно коррелированы, они будут обладать очень похожей объяснительной силой при классификации текста по языкам. Таким образом, мы можем сохранить только одну из этих функций и при этом получить (более или менее) такую ​​же предсказательную силу от нашей модели. Чтобы вычислить корреляционную матрицу, мы можем запустить следующее:

df.corr(method ='pearson')

Частичное представление результатов корреляционной таблицы показано ниже:

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

sns.pairplot(df)

Обратите внимание на положительную корреляцию между несколькими переменными. Например (как видно из таблицы корреляции), word_count и character_count имеют корреляцию около 96%, что означает, что они говорят нам примерно одно и то же с точки зрения длины текста для каждого рассматриваемого языка.

Наборы для обучения и тестирования

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

  • Я разделил набор данных на 80% наборов для обучения и 20% для тестирования. Могут использоваться и другие процентные доли, но обычно используются эти значения.
  • Обучающий набор будет использоваться для подбора моделей и хранения параметров, которые будут проверены на устойчивость на тестовом наборе.

Уменьшение корреляции между функциями

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

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

  • PCA преобразует набор коррелированных переменных в набор линейно некоррелированных переменных, называемых главными компонентами, которые затем могут использоваться в моделях без потенциального нарушения предположений о мультиколлинеарности.
  • Чтобы использовать PCA, я сначала масштабирую данные, поскольку на PCA влияет масштаб.
  • Я устанавливаю скейлер в набор обучающих функций и трансформирую как обучающие, так и тестовые наборы функций.
  • Затем я подгоняю PCA к масштабируемым функциям обучения, а затем преобразую масштабированные наборы функций обучения и тестирования.
  • Я требую, чтобы основные компоненты, сгенерированные PCA, сохраняли 95% дисперсии исходного набора функций.

Обратите внимание, что PCA сократило количество функций с 20 до 13, преобразовав исходные функции в новый набор компонентов, которые сохраняют 95% дисперсии информации, содержащейся в исходном наборе.

Модель 1: дерево решений

Деревья решений просты, но очень эффективны при решении задач классификации.

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

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

Преимущества моделей дерева решений в задачах классификации:

  • Легко понять;
  • низкая вычислительная мощность;
  • дать четкое указание на наиболее важные параметры для классификации.

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

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

Для этого запускаем:

# Calculate accuracy of the Decision Tree Model
accuracy_score_dt = accuracy_score(y_test, y_pred)

Это возвращает оценку точности модели дерева решений на тестовом наборе = 89,15%.

Неплохо!

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

Это можно сделать, запустив следующее:

labels = [‘English’, ‘Afrikaans’, ‘Nederlands’]
# Confusion Matrix
cm_Model_dt = confusion_matrix(y_test, y_pred, labels)

Мы можем построить приведенную выше матрицу путаницы следующим образом:

На приведенном выше графике показано, сколько текстов было правильно классифицировано на каждом из языков, при этом ось Y представляет фактический или истинный результат, а ось X представляет собой прогнозируемый результат. Это говорит нам о том, что модель хорошо предсказывает тексты на английском языке в дополнение к текстам на языке африкаанс. Однако он не работает так хорошо с текстовыми данными на голландском языке (Нидерланды).

Я также вычисляю точность, отзыв, F-меру и поддержку, где tp - количество истинных срабатываний, fp - количество ложных срабатываний, fn - количество ложноотрицательных результатов, таких что:

  • точность = tp / (tp + fp)
  • отзыв = tp / (tp + fn)
  • Оценка F-бета: средневзвешенное гармоническое значение точности и запоминания, где F-бета, близкая к 1, указывает на хорошее соответствие, а значение, близкое к 0, указывает на плохое соответствие.
  • support = количество вхождений каждого класса в y_test.

Для этого запускаем:

print(classification_report(y_test,y_pred))

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

Модель 2: Случайный лес

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

Мы подбираем модель случайного леса, выполнив следующее:

Мы рассчитываем показатель точности и матрицу неточностей, используя следующее:

Обратите внимание, что оценка точности модели случайного леса составляет 90,42%, что немного лучше, чем у модели дерева решений.

Мы также вычисляем Точность, Напоминание, F-меру и Поддержку, выполнив:

print('Random Forest Model Output')
print(classification_report(y_test,y_pred))

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

Модель 3: Gradient Boost

  • Повышение квалификации - это метод превращения слабых учеников в сильных.
  • При усилении каждое новое дерево соответствует модифицированной версии исходного набора данных.
  • Gradient Boosting обучает множество моделей постепенно, аддитивно и последовательно.
  • Повышение градиента определяет недостатки модели с помощью градиентов в функции потерь (y = ax + b + e). Функция потерь - это мера, показывающая, насколько хорошо коэффициенты модели соответствуют базовым данным.
  • Основным преимуществом модели градиентного повышения является то, что она позволяет нам оптимизировать определяемую пользователем функцию стоимости вместо функции потерь, которая дает меньше контроля и может не соответствовать реальным проблемам.

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

Основываясь на результатах, я использую learning_rate = 1, так как он предлагает наивысшую оценку точности для обучающего набора.

Мы рассчитываем оценку точности и матрицу неточностей, используя следующее:

Оценка точности модели Gradient Boost составляет 88,79%, что немного хуже, чем у модели случайного леса.

Мы также вычисляем Точность, Напоминание, F-меру и Поддержку, выполнив:

print('Gradient Boost Model Output')
print(classification_report(y_test,y_pred))

Заключение

  • В целом модель классификации, основанная на случайном лесу, предлагает лучший прогнозный результат с показателем точности более 90%.
  • В частности, модель хорошо подходит для классификации английского языка и африкаанс с учетом высокой точности, запоминаемости и показателей f1 для этих двух языков.
  • Прогностическая сила моделей может быть улучшена за счет использования дополнительных функций и предварительной обработки, которые больше ориентированы на голландский язык.
  • Более того, использованная выборка не сбалансирована, как показано значениями параметра поддержки в таблицах выше. Это означает, что очень мало наблюдений, относящихся к голландскому языку. Таким образом, более сбалансированный набор данных может позволить нам улучшить предсказательную силу моделей.