В настоящее время мы находимся на седьмом месяце глобальной пандемии. Думаю, я могу с уверенностью сказать, что никому это не нравится. Чем быстрее это закончится, тем лучше. Одним из наиболее важных инструментов, которыми располагает медицина, когда речь идет о смягчении последствий распространения вируса, является вакцинация. Однако прививки не работают, если никто не привит. Теперь я понимаю, что это звучит как очевидное утверждение, и во многом так оно и есть. Тем не менее, это чрезвычайно важный факт. Это основная идея «коллективного иммунитета», и жизненно важно иметь возможность идентифицировать членов сообщества, которые вряд ли будут вакцинированы.

К счастью для нас, начинающих специалистов по данным, это не первая наша пандемия. В ответ на грипп H1N1 в 2009 году Центры по контролю и профилактике заболеваний (CDC) провели опрос для мониторинга и оценки усилий по вакцинации против гриппа среди взрослых и детей. В ходе этого телефонного опроса людей спрашивали, получали ли они вакцины против H1N1 и сезонного гриппа, а также сообщали информацию о своей жизни, мнениях и поведении. DrivenData предоставил большую часть этого набора данных и поставил вопрос: используя результаты опроса, можете ли вы создать модель, предсказывающую, кто получит ту или иную вакцину? Я решил, что попробую (каламбур).

Для моего последнего проекта я создал модель линейной регрессии, чтобы предсказать общее количество побед бейсбольной команды. Целевое значение (победы) – это непрерывное значение, поэтому оно идеально подходит для регрессионной модели. Эта задача не так проста (а может, проще?). Здесь наше целевое значение является бинарным, независимо от того, получил ли участник вакцину. Поэтому для этой проблемы мы будем рассматривать модели классификации, а не модели регрессии. Это модели, которые предсказывают вероятность того или иного результата, а не пытаются предсказать непрерывную переменную.

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

Очистка данных

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

Набор данных состоял из 35 различных вопросов. Двадцать три вопроса имели числовые ответы либо с диапазоном по шкале мнений (1–5), либо с простым двоичным числом «да» (1) или «нет» (0). Однако на двенадцать вопросов были даны категоричные ответы, т. е. уровень дохода, уровень образования, раса, город и т. д. Большинство моделей классификации не будут работать с чистыми категориальными значениями, поэтому мне пришлось использовать несколько различных методов для преобразования этих категориальных значений в числовые входные данные. .

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

Второй метод заключается в преобразовании текстовых данных в порядковые числовые значения. Это делается, когда между значениями существует некоторая упорядоченная связь. Например, при рассмотрении образования данные были в форме «Окончил среднюю школу», «Окончил какой-то колледж», «Окончил колледж» и т. д. Эти значения можно преобразовать в 14, 16 и 18 соответственно, чтобы получить грубая оценка «лет в школе». Опять же, это действительно уместно только в том случае, если между значениями уже есть какая-то базовая связь, где одно «больше», чем другое.

Помимо этих преобразований, мне также пришлось иметь дело со всеми «нулевыми» значениями. В частности, на вопрос о том, получал ли участник медицинскую помощь, почти половина ответов была «Нет», то есть данных нет. Моей первой мыслью было просто выбросить эту колонку, данных недостаточно, так что просто избавьтесь от нее. Однако, присмотревшись повнимательнее, я увидел, что в то время как немногим более 20% всех респондентов получили вакцину против гриппа H1N1, среди людей с «нулевым» здравоохранением только 13% получили вакцину против гриппа H1N1.

Это подсказало мне, что в этих «нулевых» значениях на самом деле может быть значение, поэтому я решил создать «фиктивные переменные» из этого столбца. В итоге я получил три столбца: «Есть медицинская помощь», «Не имеет медицинской помощи» и «Мы не знаем».

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

Введение модели

Добро пожаловать к тем, кто нас покинул.

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

КНН

Начнем с КНН. Эта модель использует кластеризацию для создания прогноза. Давайте сначала представим задачу только с двумя функциями (X и Y) и целью (оранжевый и синий). Мы могли бы изобразить эти функции следующим образом:

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

Основной параметр, который вы можете установить в модели KNN, — это количество соседей, которые будут искаться для категоризации точки данных. Если вы установите K равным 1, то новые данные будут отнесены к той категории, к которой относится ближайшая точка. Это привело бы к чрезвычайно переобученной модели. Точно так же, если вы установите слишком высокое значение K, модель будет иметь тенденцию к недостаточному соответствию. Для хорошей модели необходимо найти подходящий K.

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

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

Вот определение прямо из Википедии: «Дерево решений — это структура, подобная блок-схеме, в которой каждый внутренний узел представляет собой «тест» атрибута». Хм? Хорошо, может быть, визуальное представление было бы немного проще.

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

Одна из основных переменных, которую вы можете использовать для «лепки» этой модели, — это «глубина» дерева. Начальный узел устанавливается на глубину 0, и каждая последующая ветвь добавляет слой глубины. Чем «глубже» дерево, тем более приспособленным оно может стать. Действительно глубокое дерево отлично справится с объяснением обучающих данных, но плохо обобщит новые данные. Не существует универсального решения о том, насколько глубоким должно быть дерево. Он будет отличаться для каждого набора данных и каждой проблемы. Опять же, полезно иметь хорошее представление о вашей проблеме, чтобы понять, как играть с этой переменной.

В одном наборе данных могут быть тысячи деревьев решений, дающих немного разные результаты. RFC объединяет определенное количество этих деревьев в «лес» и принимает режим всех результатов деревьев решений. Например, я сделал RFC из 100 деревьев. Если я ввожу набор ответов и 70 деревьев предсказывают «Нет вакцины», а 30 предсказывают «Да вакцины», тогда RFC вернет прогноз «Нет вакцины».

Логистическая регрессия

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

Как вы можете видеть на изображении выше, логистическая регрессия даст вам значение от 1 до 0. Чем ближе значение к 1, тем больше вероятность того, что оно принадлежит к этому классу. В моем случае 1 представляет собой «Да, вакцина», поэтому, если модель логистической регрессии вернула 0,85, это означало, что данные опроса соответствуют 85% вероятности вакцинации.

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

Выбор модели

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

Как видно из приведенного выше графика, в то время как почти 50% респондентов получили вакцину против сезонного гриппа, только около 20% респондентов получили вакцину против гриппа H1N1. Это означает, что мы не можем полагаться на такую ​​метрику, как точность, чтобы определить, насколько хороша наша модель. Почему нет? Что ж, если бы мы сделали «глупую модель», которая просто предсказала, что респондент не будет заражаться H1N1 каждый раз, независимо от входных данных, ее точность все равно была бы почти 80 процентов!

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

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

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

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

Отзыв против точности

Полнота и точность — две жизненно важные метрики при анализе прогнозов модели классификации. К тому же их очень легко спутать. Вот такие формулы:

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

Я понимаю, что это очень много цифр, на которые нужно смотреть. Но если сосредоточить внимание на отзывах о прививках против гриппа H1N1, мы увидим, что обе модели получили оценку 0,95. Это означает, что из всех людей, которые не были вакцинированы, модели смогли идентифицировать 95% из них. Сравнивая это с примерно 80%, которые мы получили бы, просто предполагая, что ВСЕ не были бы вакцинированы, мы видим, что наши модели определенно работают лучше, чем «тупая модель».

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

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

Выводы

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