Может ли машина определять пол?

Использование matplotlib для изучения 100-летнего существования имен в США и создание модели машинного обучения для классификации гендерной принадлежности по именам.

Предисловие

Наши имена не всегда определяют нас, но они дают нам чувство идентичности. Обозначение себя набором букв и слов придает некую структуру нашему самоощущению и закрепляет наше присутствие в этом мире.

«Это не то, что они называют вас, это то, на что вы отвечаете». - У. К. Филдс

Мотивация

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

Мы можем или не можем быть правильными (в основном неверными в моем случае) в сопоставлении личности с именем, но мне было интересно, может ли машина работать лучше меня.

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

Можете ли вы предсказать пол человека по его или ее имени?

Странно просто, не правда ли? Однако это не так просто, как кажется. Культурные и языковые различия усложняют задачу.

И это побудило меня построить голую модель машинного обучения и посмотреть, сможет ли она предсказать пол человека лучше меня.

Весь код можно найти в моем репозитории GitHub.

Источник данных

Так где же машина может получить тонну жизненного опыта? Конечно, с помощью исторических, тщательно сопоставленных данных! Одним из таких источников является каталог детских имен в США, доступный на сайте data.gov.

Эти данные находятся в свободном доступе и публикуются Управлением социального обеспечения. Он содержит имена и частоту их появления в заявках на получение карты социального страхования в каждом штате с 1919 года по 2018 год.

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

Я загрузил эти данные, и это набор текстовых файлов для каждого состояния. Каждый текстовый файл содержит все имена, которые встречались не менее 5 раз в течение года. Я немного очистил данные, и окончательный объединенный набор данных занимает почти 320 МБ памяти!

<class 'pandas.core.frame.DataFrame'>
Int64Index: 6028151 entries, 0 to 28019
Data columns (total 6 columns):
 #   Column  Dtype 
---  ------  ----- 
 0   yob     int64 
 1   name    object
 2   gender  object
 3   number  int64 
 4   state   object
 5   chk     int64 
dtypes: int64(3), object(3)
memory usage: 321.9+ MB

(Примечание: пол, присвоенный здесь каждому имени, соответствует данным, представленным в текстовом файле. Полезный файл README также присутствует в загружаемом zip-файле и объясняет некоторые особенности набора данных)

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

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

1) 100 самых распространенных и необычных имен за последние 100 лет

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

Например, девочек часто называли Элизабет, Кэтрин или Маргарет (, чтобы назвать несколько), в то время как Джеймс, Уильям или Джон - популярные имена для мальчиков. Помимо общих имен, также интересно узнать немного о необычных именах.

Некоторые действительно интересные и необычные имена для девочек - Бэлин, Селда и Демани, а для мальчиков - Родариус , Джамаул и Кельвон!

2) Топ-5 имён 2018 года

В пятерку лучших имен 2018 года вошли Эмма, Оливия, Ава, Изабелла и София среди девушек. Лиам, Ной, Уильям, Джеймс и Оливер были самыми популярными именами мальчиков.

3) История топовых имен 2018 года

Чтобы узнать прошлую популярность этих имен, я построил временные ряды каждого из пяти лучших имен 2018 года. Интересно отметить, что Эмма и Оливия исторически были популярные имена для девочек, а Ава, Изабель и София приобрели популярность после 1980-х годов.

Аналогичная тенденция наблюдается и среди имен мальчиков. Джеймс и Уильям неизменно пользовались популярностью на протяжении многих лет и входили в 10 лучших имен. Лиам, Ной и Оливер становятся все более популярными после 1980 года.

4) Визуализация популярности имен в каждом штате в 2018 г.

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

(Это также дало мне возможность поиграть с Imageio, простой библиотекой для создания гифок. Этот пост Йонг Цуй, доктор философии был действительно полезен)

5) Длина имен

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

6) Последняя буква имени - гласная.

У меня было такое странное ощущение, что у девочек десять лет имена заканчиваются на гласные, а у мальчиков - нет. Чтобы проверить это, я построил круговую диаграмму. Я был прав в своем предположении. Имена девочек обычно оканчиваются на гласные, особенно на «а» и «е», тогда как имена мальчиков преимущественно заканчиваются на «е» или «о».

Предсказание пола по именам

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

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

Преобразование имен в значения ASCII

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

ascii_mean('Albert')
>>> 100.33333333333333
ascii_mean('Amelia')
>>> 97.5

Длина имени

Я создал новую функцию, которая содержала длину каждого имени, то есть общее количество букв в каждом имени.

Количество гласных и согласных

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

Последняя буква имени

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

С помощью этих 4 функций я хотел, чтобы мой двоичный классификатор классифицировал имя как «мужской» или «женский» класс.

(Это проблема 2-го класса, чисто по причине наличия данных. В наборе данных определены только эти 2 пола)

2) Классификация полов по именам

Я построил две очень простые модели - классификатор логистической регрессии и классификатор опорных векторов. Я разделил данные на обучающий набор (24245 имен) и тестовый набор (10392 имени) разбиением 70:30.

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

Классификатор логистической регрессии

Модель логистической регрессии имеет чувствительность (или отзыв) 67,8% и специфичность около 68,3%, что относительно лучше, чем случайный прогноз. Точность прогноза для женщин составляет 76%, а для мужчин - 58%.

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

Классификатор опорных векторов

SVC с линейным ядром дает более низкую чувствительность (64,5%), чем модель логистической регрессии. Специфичность 72,5% лучше, чем у предыдущей модели. Точность предсказания женского пола составляет почти 78%, а точность предсказания мужского пола - 57%.

Другими словами, SVC может правильно предсказать, что имя принадлежит мужчине, намного лучше, чем он может предсказать имя как женское. Но он делает гораздо меньше ошибок при предсказании имени как женского, чем при предсказании мужского.

Я против машины

Теперь настало время настоящего испытания - могу ли я предсказать пол лучше, чем машина, которую я построил?

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

Результаты игры показаны ниже -

Выступления игроков можно понять, задав серию вопросов -

Q1: Если имена на самом деле принадлежат женщинам, как часто игрок прав ( с технической точки зрения: отзыв или чувствительность )?

Я: 83% случаев

Машина (оба): 83% времени

Q2: Когда игрок предсказывает имя как Женское, как часто игрок правильно ( с технической точки зрения: точность )?

Я: 100% времени

Машина (оба): 71% времени

Q3: Если имена на самом деле принадлежат мужчинам, как часто игрок прав ( в технических терминах: отзыв или чувствительность )?

Я: 100% времени

Машина (оба): 50% времени

Q4: Когда игрок предсказывает имя как Male, как часто игрок правильно ( с технической точки зрения: точность )?

Я: 80% времени

Машина (оба): 67% времени

Кто выиграл ?? Вы решаете.

Вот и все!

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

Чао!