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

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

Однажды я узнал о Udacity и решил запустить программу Data Scientist Nanodegree. Это была любовь с первого взгляда. Степень нано предлагает полный курс с классами, упражнениями, онлайн-инструктором, реальными проектами, оцениваемыми профессионалами, и карьерным тренером.

У Udacity есть нано-степени и бесплатные курсы по разным темам. Ознакомьтесь с каталогом здесь.

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

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

Если вы хотите увидеть мое решение полностью, загляните в мой Github. Udacity также создал частный конкурс Kaggle, и мое решение в настоящее время входит в 9% лучших.

С самого начала проблема благотворительной компании.

Деловое понимание

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

Понимание данных

Набор данных переписи, предоставленный Udacity, содержит 45 222 записей с 14 столбцами. Столбцы можно разделить на категориальные переменные, непрерывные переменные и цель, это то, что мы попытаемся предсказать.

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

Давайте посмотрим на эти столбцы.

Категориальные переменные

  • рабочий класс: Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked.
  • уровень образования: Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool.
  • семейное положение: Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse.
  • род занятий: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces.
  • отношения: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried.
  • раса: Black, White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other.
  • пол: Female, Male.
  • родная страна: United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam , Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands.

Непрерывные переменные

  • age: возраст.
  • education-num: количество завершенных лет обучения.
  • прирост капитала: денежный прирост капитала.
  • Убыток капитала: потери денежного капитала.
  • часов в неделю: среднее количество отработанных часов в неделю.

Мы видим, что capital-gain и capital-loss сильно искажены. Мы исправим эти особенности позже.

Цель

  • доход: ≤50K, ›50K.

Глядя на распределение классов (те, кто зарабатывает не более $50,000, и те, кто зарабатывает больше), становится ясно, что большинство людей не зарабатывают больше, чем $50,000. Это может сильно повлиять на точность, поскольку мы могли бы просто сказать «этот человек не зарабатывает больше, чем $50,000» и в целом оказаться правыми, даже не глядя на данные! Такое заявление было бы наивным, поскольку мы не рассматривали какую-либо информацию в обоснование претензии.

Individuals making more than $50,000: 11208
Individuals making at most $50,000: 34014
Percentage of individuals making more than $50,000: 24.78%

Машинное обучение ожидает, что ввод будет числовым, и я расскажу об этом позже, но пока, чтобы упростить наш анализ, нам нужно преобразовать целевой income в числовые значения. Поскольку для цели есть только две возможные категории (<=50K и >50K), мы можем просто закодировать эти две категории как 0 и 1 соответственно.

Анализ ранних данных

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

Люди с высшим образованием с большей вероятностью будут зарабатывать более 50 000 долларов в год?

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

Еще одна переменная, на которую мы можем найти ответы, - это education-num, которая представляет общее количество лет обучения, завершенных кем-либо. Если мы сгруппируем по education_level или education-num и вычислим среднее значение для каждого income класса, мы увидим, что для каждого значения в education_level у нас есть эквивалентное значение в education-num.

education-num работает так же, как преобразование с числовым рейтингом, применяемое к значениям education_level. Помещая гистограмму, получаем следующее:

Наша гипотеза почти полностью верна, всего несколько неверных оценок education-level, возможно, из-за некоторого шума данных. Обратите внимание, что порядок ранжирования по годам начальной школы немного запутан, и Prof-school имеет более высокий средний income класс >50K, но это более низкий уровень, чем Doctorate.

Люди, которые работают больше часов в неделю, с большей вероятностью будут зарабатывать более 50 000 долларов в год?

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

На первый взгляд, глядя на среднее количество часов, отработанных в неделю в каждом income классе, кажется, что люди из >50K группы на самом деле работают больше часов в неделю, чем другая группа. Если немного углубиться, на изображении ниже показано среднее значение класса theincome в разбивке по отработанным часам в неделю.

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

Как опыт связан с зарабатыванием более 50 000 долларов в год?

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

Если посмотреть на средний возраст каждого income класса, оказывается, что люди в >50K группе в среднем старше, чем в другой группе. Давайте посмотрим на возрастное распределение каждого income класса.

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

  • Пики разные, и группа >50K в среднем старше другой группы.
  • Групповое распределение >50K похоже на нормальное распределение, и большинство данных относятся к периоду от 37 до 50 лет.
  • Распределение группы <=50K смещено вправо.

Таким образом, мы можем сделать вывод, что возраст и опыт, похоже, коррелируют с классом income. Молодые люди обычно начинают карьеру и, следовательно, имеют тенденцию зарабатывать менее $50,000 в год. По мере того, как человек становится старше и опытнее, зарплата начинает расти.

Также важно отметить, что после 60 лет распределения снова встречаются.

Подготовка данных

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

Посмотрим, есть ли в наших данных пропущенные значения:

age               0
workclass         0
education-num     0
marital-status    0
occupation        0
relationship      0
race              0
sex               0
capital-gain      0
capital-loss      0
hours-per-week    0
native-country    0
income            0

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

Преобразование наклонных непрерывных элементов

Набор данных может иногда содержать по крайней мере одну функцию, значения которой обычно лежат около одного числа, но также будет иметь нетривиальное количество значительно больших или меньших значений, чем это единственное число. Алгоритмы могут быть чувствительны к такому распределению значений и могут работать хуже, если диапазон не нормализован должным образом. С набором данных переписи этому описанию подходят две характеристики: capital-gain и capital-loss.

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

Одно горячее кодирование

Обычно алгоритмы обучения ожидают, что входные данные будут числовыми, что требует преобразования нечисловых функций (категориальных переменных). Один из популярных способов преобразования этих переменных - использование схемы горячего кодирования. Быстрое кодирование создает «фиктивную» переменную для каждой возможной переменной категории. Например, предположим, что someFeature имеет три возможных записи: A, B или C. Затем мы кодируем эту функцию в someFeature_A, someFeature_B и someFeature_C.

Разделение данных при обучении и проверке

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

Training set has 31655 samples.
Testing set has 13567 samples.

Нормализация числовых характеристик

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

Применение масштабирования к данным не меняет форму распределения каждой функции (например, 'capital-gain' или 'capital-loss' выше); однако нормализация гарантирует, что каждая функция обрабатывается одинаково при применении контролируемых учащихся и изменяет значение необработанных данных, как показано ниже.

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

Мы будем использовать для этого sklearn.preprocessing.MinMaxScaler.

Моделирование данных

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

Исследование моделей

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

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

Имея это в виду, мы выберем XGBoost как лучшую модель для этой проблемы и проведем еще несколько исследований.

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

XGBoost

XGBoost (e X treme G radient Boost ing) в основном генерирует несколько деревьев решений в последовательности, где цель следующего дерева - уменьшить ошибка из предыдущего.

Мы не будем объяснять, как именно работает эта модель, но на Medium у нас есть отличные статьи по этому поводу. Например, если вы хотите узнать больше о XGBoost, прочтите эту статью здесь.

Важность функций

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

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

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

Оценка результатов

CharityML помогает точно предсказать, кто зарабатывает больше $50,000. Казалось бы, использование точности в качестве метрики для оценки производительности конкретной модели было бы уместным.

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

Следовательно, способность модели точно предсказать тех, кто заработает больше 146_, важнее, чем способность модели вспомнить этих людей. Здесь можно использовать несколько показателей, но мы будем использовать ROC AUC, потому что это показатель, выбранный в качестве метода оценки Udacity в конкурсе Kaggle.

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

Оптимизация модели

Теперь, когда мы знаем, что конкуренты будут оценивать нашу модель на основе метрики ROC AUC, мы можем использовать это в качестве руководства для оптимизации модели.

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

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

После запуска поиска по сетке, вот результаты для неоптимизированной и оптимизированной модели:

Unoptimized model
Accuracy on the testing data: 0.8680
F-score on the testing data: 0.7440
ROC/AUC on the testing data: 0.9150
Optimized Model
Final accuracy on the testing data: 0.8722
Final F-score on the testing data: 0.7534
Final ROC/AUC on the testing data: 0.9291

Возможно, вы думаете, что улучшение минимальное, но 1% по каждому показателю, не тратя много времени на этап подготовки данных, это отличный результат.

Развертывание

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

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

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

Мое текущее решение набрало 0,94937 по метрике ROC AUC и в настоящее время входит в 9% лучших.

Финальные миры

Спасибо, что прочитали это, и Аманде Ферраболи, замечательному специалисту по анализу данных, за просмотр этой публикации.

Я надеюсь, что вы нашли это хорошим примером того, как применять науку о данных на благо общества. Не стесняйтесь комментировать ниже любые вопросы или отзывы. Вы также можете найти меня на Kaggle, GitHub или Linkedin.

И последнее, но не менее важное: я хотел бы сказать #stayhome, и если вы можете, уделите немного времени спонсированию любой из этих бразильских благотворительных организаций:

ChildFundBrazil
«С 1966 года в стране Детский фонд Бразилии, Международное агентство по развитию детей, принес пользу тысячам людей, включая детей, подростков, молодых людей и их семьи».

Сделайте пожертвование здесь.

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

Сделайте пожертвование здесь.

SOS Mata Atlântica
«Он способствует государственной политике сохранения Атлантического леса посредством мониторинга биома, проведения исследований, демонстрационных проектов, диалога с государственными и частными организациями. секторов, совершенствование экологического законодательства, коммуникации и вовлечение общества ».

Сделайте пожертвование здесь.