Руки вверх

Классификация имен с помощью наивного Байеса

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

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

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

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

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

В этом проекте я

  1. собраны и созданы данные о поддельных именах, связанных с национальностями
  2. загружены, вычищены и векторизованы имена (текстовые данные)
  3. обучить и оценить модель
  4. Мысли и заключение

Давайте начнем!

Сбор и создание данных об именах

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

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

Взглянув на различные имена

Я пытался создать модель для классификации имени по национальности, так что важно знать? Есть множество имен из разных культур и стран со всего мира, но в этом проекте я сосредоточусь в основном на названиях стран первого мира. Так какие примеры имен из разных культур ?? Давайте загрузим данные, используя Pandas в качестве фрейма данных, и посмотрим на них.

Здесь импортируется пара библиотек для предварительной обработки данных, и данные загружаются с использованием Pandas в качестве объекта DataFrame. Code столбец содержит названия стран, а name содержит строки названий, соответствующие стране.

Как видите, некоторые имена написаны на английском алфавите, некоторые - нет, другие используют китайские иероглифы, хангыль или японские хираганы / кандзи. Каждое имя Last, (Среднее) и First (возможно, большее количество компонентов зависит от культуры) разделено пробелами между ними. Теперь большой вопрос, как их скормить в модель… ??

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

Как компьютерный алгоритм, модель машинного обучения не может интерпретировать данные имени как текстовые данные. Имена необходимо сначала преобразовать в числовое представление, и для этого есть ряд методов. Здесь я использовал модель Bag-of-Words.

Мешок слов

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

Есть несколько методов для дальнейшего представления документа отсюда в модели мешка слов, но в этом проекте я использовал CountVectorizer из библиотеки scikit-learn. Этот метод создает вектор с длиной всего словаря, причем каждая позиция индекса, представляющая уникальное слово, появляется в документе, а значение в позиции индекса выражает частоту появления слова в документе / тексте. Таким образом, порядок слов в документе не сохраняется, но это простой и интуитивно понятный способ представления документа целыми числами. Давайте посмотрим на это в действии.

Здесь я инициализировал CountVectorizer и поместил в него список имен, каждое из которых разделено на фамилию и имя пробелом. В процессе подбора имена разбиваются на компоненты фамилии и имени, и создается сопоставление / словарь слов - ›целых чисел. После этого данные имени преобразуются в векторы-строки с помощью .transform() с информацией о частоте слов. Результатом является scipy разреженная матрица (матрица с большим количеством нулей и маленьких чисел, поскольку большинство имен не включают в себя другие фамилию и имя).

Кодирование меток стран

Как и данные об имени, модель не может интерпретировать метки как текст. Поскольку существует 10 меток классов, они могут быть закодированы в целые числа от 0 до 9 в векторе-столбце. Это можно сделать с помощью класса OrdinalEncoder scikit-learn.

Во-первых, мы инициализируем класс OrdinaryEncoder и используем метод fit, чтобы подогнать / обучить кодировщик. В этом процессе вы создаете сопоставление для преобразования уникальной метки в назначенные целые числа. После этого с помощью метода .transform() вы используете кодировщик для кодирования всех данных в вектор-столбец целых чисел. Обратите внимание, что этот экземпляр кодировщика можно повторно использовать для кодирования / декодирования этикеток позже.

Наконец, данные будут разделены на обучающий и тестовый набор (несправедливо тестировать модель с теми же данными, на которых она была обучена). Обычно соотношение разделения составляет около 70%: 30% для набора для обучения и тестирования. Мы делаем это .train_test_split() методом в sklearn.model_selection.

test_size - это значение с плавающей запятой в диапазоне от 0 до 1, определяющее соотношение данных тестового набора по сравнению с исходными предоставленными данными для метода. x и y каждый представляет данные и метки.

Обучите и оцените модель

Полиномиальный наивный байесовский классификатор

Теперь у нас есть данные, приступим к обучению модели. Я использовал scikit-learn Полиномиальный наивный байесовский класс. В библиотеке доступно несколько типов наивного байесовского классификатора, но этот подходит для классификации текста в соответствии с документацией.

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

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

Оценка и прогноз

Теперь у нас есть обученная модель, давайте посмотрим, как работает наша модель. Мы будем использовать тестовый набор данных, созданный на этапе загрузки данных. Для моделей классификации существует несколько показателей оценки, и здесь использовалась точность. Для целей проекта для обучения и прогнозирования использовался класс-оболочка python NameClassifier. В остальной части статьи этот класс используется для демонстрации и анализа результатов.

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

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

Мысли и заключение

Матрица путаницы представляет собой квадратную таблицу с количеством элементов ^ 2 в ней. Строка таблицы представляет собой истинное значение метки, а столбец - это прогнозируемая метка, и это отличный инструмент для анализа производительности модели. Давайте взглянем на одну для этой модели. Взгляните на мой пост здесь, чтобы узнать, как построить матрицу путаницы.

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

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

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

Локализация Faker - это постоянный процесс, в котором нам нужна ваша помощь. Не стесняйтесь создать локализованного поставщика для вашего собственного региона и отправить запрос на вытягивание (PR).

Я предполагаю, что египетский языковой стандарт еще не готов, поэтому он возвращает имя по умолчанию на английском языке (США).

Работа с невидимыми именами

Набор для тестирования модели также был заимствован из пакета Faker. Что произойдет, если модель встретит имена, которых она не увидела в данных обучения / тестирования? А как насчет разных представлений имени в разных типах персонажей?

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

Настройка прогнозов

Есть также несколько других вопросов, касающихся настройки модели / прогноза. Например, как увеличение количества классификационных меток модели влияет на ее точность? Этот проект заимствован из японского языка или нет (просто бинарная классификация с точностью тестирования 90% +). Таким образом, чем больше классов, тем труднее правильно предсказать. Это очевидно интуитивно, потому что чем больше у вас выбора, тем сложнее выбрать правильный. Вероятность выбора правильного ответа (на основе случайного предположения) составляет 50%, в то время как в случае классификации по 10 классам она снижается до 10%.

Эта модель против другой модели

  • каковы преимущества и недостатки использования модели Наивного Байеса?

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

К недостаткам можно отнести то, что он не может классифицировать невидимые имена, для которых нет компонента фамилии / имени, включенного в обучающий набор. Это означает, что он не изучает шаблон / структуру имени, а «запоминает» обучающий набор данных. (Это из-за того, как работает Наивный Байес, что он возвращает возможность появления определенных компонентов имени при заданной метке класса; или используемый метод векторизации, который просто подсчитывает частоту появления слов).

  • возможен лучший выбор модели классификатора, такой как нейронные сети (RNN, CNN или модель внимания или преобразователь)

Также возможно, что модель Bag of Word (в данном случае - CountVectorizer) не извлекает необходимую информацию из текста имени, чтобы различать названия стран. Что еще можно сделать?

  • Другие модели в мешке слов, такие как хеширование, N-грамм и т. Д.
  • Различные модели, помимо пакета слов, вложения слов, такие как word2vec, GloVe

Важно понимать, как все они работают, и, следовательно, уметь использовать их с учетом их плюсов и минусов. Другие модели или техники нлп будут продемонстрированы в другом посте. Также ознакомьтесь с записной книжкой jupyter для этого проекта NameClassifier. Надеюсь, что это было по крайней мере полезным или интересным, и не стесняйтесь задавать вопросы или вносить предложения. Спасибо за прочтение!