Вы или кто-то из ваших знакомых часами беспокоился о том, какой из противозачаточных средств лучше всего подойдет вам, и задавался вопросом, каковы их побочные эффекты? Вы пролистывали бесчисленные интернет-форумы, пытаясь понять, что другие женщины испытывают при использовании своих противозачаточных средств? Я сама испытала это, поэтому во время 4-недельной программы Insight Data Science я решила создать инструмент, который мог бы помочь женщинам принимать эти осознанные решения! Я так многому научился у своих товарищей по программе Boston Insight Fellows и директоров программ, и без них не смог бы создать это приложение!

Мое веб-приложение было создано для трех вещей:

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

Давайте разберем эти три части.

Шаг 1. Предложите противозачаточное средство

Моя цель состояла в том, чтобы предложить женщинам противозачаточные средства на основе того, что используют другие женщины, подобные им. Для этого я использовал данные Национального исследования роста семьи за несколько лет. Опрос проводился партиями, каждая из которых охватывала данные, собранные за 3–4 года (с 2006 по 2015 гг.). Это национальное обследование содержит информацию, полученную от женщин, в том числе информацию об их демографических характеристиках и средствах контрацепции, которые они использовали в то время. После того, как я объединил данные из каждого опроса в один фрейм данных в пандах, я предпринял несколько шагов, чтобы очистить его.

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

  1. Изменены названия противозачаточных средств, чтобы они соответствовали разным партиям коллекции. Например, «Имплант» и «Нэкспланон и Импланон» были просто изменены на «Имплант».
  2. Удаление строк с НА в различных областях

После чистки у меня остались данные от ~ 12000 женщин.

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

Я решил начать с некоторого исследовательского анализа данных (EDA). Ниже приведены графики количества пользователей каждого типа противозачаточных средств и гистограммы каждого типа контрацепции по возрастным группам.

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

Функции:

Некоторые из характеристик включали возраст, этническую принадлежность, семейное положение, количество партнеров и т. Д. Я долго и усердно думал об инструменте, который я хотел создать, и знал, что я не смогу порекомендовать противозачаточное средство, если женщина, использующая мой инструмент. вводит всю необходимую информацию, и запрос количества половых партнеров будет слишком агрессивным. По этой причине я решил включить в свою модель только три функции: возраст, этническая принадлежность * и семейное положение. Поскольку было несколько типов семейного положения («разлучен», «женат», «проживают вместе», «вдовец» и т. Д.), Я сгруппировал их по трем уровням, которые охватывают все эти типы отношений - холост, женат или проживают вместе. Отношение. Кроме того, этническая принадлежность была мгновенно закодирована с использованием предварительной обработки sklearn.

Мы готовы к моделированию!

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

Моделирование:

Изначально я пытался создать модель, которая предсказывала бы наиболее вероятный противозачаточный препарат для женщины, независимо от типа. Затем, получив ценные отзывы от моего технического консультанта Insight, я разделил противозачаточные средства на две подгруппы - полупостоянные и непостоянные - и создал по две модели для каждой подгруппы. В каждой подгруппе было четыре противозачаточных средства в качестве прогностических классов, и данные были случайным образом разделены на 80% обучающий и 20% тестовый набор с использованием выбора модели sklearn.

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

Для обеих подгрупп модель GNB имела немного более высокую точность, чем случайная (0,60), которая в этом случае будет предсказывать класс большинства каждый раз (0,57). Однако модель GNB предполагает полную независимость между характеристиками - здесь мы знаем, что возраст и семейное положение наверняка будут коррелированы. Чтобы принять во внимание корреляцию функций, следующей моделью, которую я использовал, был случайный лес (RF), который работал немного лучше, чем GNB (0,65). Я решил реализовать RF в продукте, так как он будет легко масштабироваться по мере добавления дополнительных функций. Ниже вы увидите пример матрицы неточностей для полупостоянной группы.

Понятно, что классы несбалансированы. Чтобы попытаться смягчить эту проблему, я использовал передискретизацию синтетического меньшинства (SMOTE из imblearn API с несбалансированным обучением; изображение ниже), чтобы сгенерировать некоторые точки данных в классах меньшинства, чтобы помочь лучше обучить модель. SMOTE работает, генерируя данные на основе k-соседей в классе меньшинства. Я подумал о недостаточной выборке для большинства классов, но понял, что с моим и без того ограниченным набором данных я буду тренировать свою модель на еще меньшем количестве данных. Как и ожидалось, точность набора тестов упала без улучшения запоминания.

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

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

Двигаясь вперед:

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

Шаг 2. Анализ побочных эффектов противозачаточных средств

Чтобы понять, что женщины думают о различных типах противозачаточных средств, я скопировал r / BirthControl за два года с помощью API Reddit pushshift.io. Это привело к ~ 21000 сообщений. Начиная с основной части каждого сообщения, я использовал различные инструменты, чтобы очистить текст.

Очистка текста:

  1. Удалите стоп-слова. Чтобы гарантировать, что мнение о противозачаточных средствах остается точным, я сохранил «отрицательные» слова, которые есть в наборе английских стоп-слов из корпуса Natural Language Toolkit (NLTK).
  2. Стандартизированный текст путем удаления URL-адресов и других ненужных символов, но с сохранением знаков препинания.

3. Токенизированные (разделенные) предложения друг от друга с использованием sent_tokenize из NLTK.

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

После того, как я разделил все предложения, я специально хотел посмотреть на предложения, в которых упоминаются восемь форм контроля над рождаемостью, используемых в модели прогнозирования, приведенной выше. Я извлек предложения, в которых только упомянуты вышеупомянутые противозачаточные средства, и разбил их на соответствующие фреймы данных pandas (т.е. все предложения, в которых упоминается «таблетка», попадают в фрейм данных «таблетка»). Чтобы анализ настроений был как можно более точным, я извлек только предложения, в которых упоминалось интересующее меня противозачаточное средство. Таким образом, предложение, в котором упоминается таблетка и ВМС, не будет учитываться во фрейме данных для таблетки ИЛИ ВМС. Хотя это уменьшает объем данных, с которыми мне приходится работать, он сохраняет анализ тональности каждого предложения как можно точнее.

Извлечение упоминаний о побочных эффектах:

Я составила список потенциальных побочных эффектов на основе перечисленных на веб-сайте FDA и других, о которых мне говорили женщины. Используя этот список, я создал новый фрейм данных pandas с каждым предложением и независимо от того, упоминается ли в нем конкретный побочный эффект (1 или 0). Вы можете думать об этом как об индивидуальной модели «мешка слов», подсчитывающей, сколько раз побочный эффект упоминался в конкретном предложении о противозачаточных средствах.

Анализ настроений:

Я применил NLTK Sentiment Intensity Analyzer (SIA) из пакета VADER (Valence Aware Dictionary и sEntiment Reasoner) к каждому предложению. Этот анализатор настроений был предварительно обучен на данных социальных сетей и использует подход, основанный на лексике, чтобы учитывать не только тип настроения (отрицательное или положительное), но и интенсивность выраженного настроения с помощью оценки полярности. . Есть отличная статья о том, как было создано это SIA и как оно работает здесь.

Вот пример кода и результирующего набора данных.

Я мог:

  1. Рассчитайте частоту упоминаний о побочных эффектах по отношению ко всем предложениям, в которых упоминается конкретное средство контрацепции.
  2. Умножьте «показатель полярности» на конкретный побочный эффект, упомянутый в предложении, для каждого противозачаточного средства.

Это привело к моему окончательному фрейму данных, как показано ниже:

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

Проверка VADER

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

  1. Оценка полярности ›0,1 = 1 (положительный результат)
  2. Оценка полярности ‹0,1 = -1 (отрицательная)
  3. Оценка полярности от -0,1 до 0,1 = 0 (нейтральный)

Основываясь на ~ 200 предложениях, оцененных обоими коллегами по VADER Insight, я смог разработать матрицу путаницы, представленную ниже:

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

Движение вперед:

Я могу придумать несколько способов улучшить этот раздел продукта:

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

Шаг 3. Предоставление соответствующих рекомендуемых сообщений

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

Как работает тематическое моделирование?

Тематическое моделирование - это статистический метод, используемый для обнаружения абстрактных тем, лежащих в основе корпусов текста. В этом случае методы моделирования конкретных тем могут использовать распределение слов в сообщении Reddit и во всех сообщениях Reddit для создания тем и соотнесения конкретного сообщения Reddit с определенной темой. Есть несколько отличных статей, описывающих техники тематического моделирования (здесь, здесь и здесь), но я кратко опишу ту, которую выбрал - Latent Dirichlet Allocation (LDA).

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

Например, у меня есть три очень упрощенных сообщения:

  1. «Бананы для собак и кошек»
  2. «Бананы бананы бананы»
  3. «Кот, кот, кот»

LDA отметит вероятность появления слов внутри и между тремя сообщениями и создаст темы на основе этих распределений. Здесь Тема 1 может быть «собаками», Тема 2 может быть «кошкой», а Тема 3 может быть «бананами». Затем LDA назначит сообщение 1 как имеющее равную вероятность прихода из темы 1, 2 или 3, в то время как два других сообщения почти наверняка происходят из темы 2 или темы 3 соответственно.

Реализация LDA с помощью сообщений Reddit

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

  1. Создайте модель мешка слов с помощью sklearn CountVectorizer

2. Определите количество тем (поскольку LDA не может сделать это автоматически) и запустите алгоритм из sklearn.decomposition.

3. Отображение результирующих тем с указанием количества постов.

Это позволило мне отображать соответствующие сообщения из Reddit в моем приложении:

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

Недостатки тематического моделирования:

К сожалению, у использования тематического моделирования есть несколько недостатков. Во-первых, вы должны указать k количество тем. Как я выбрал количество тем 10? Честно говоря, я пробовал разные номера тем, и в результате было получено 10 тем, которые не были ни слишком широкими, ни слишком конкретными. Во-вторых, вы должны пометить темы - пример самой популярной темы, которую я извлек из сообщений, связанных с ВМС, была «только периоды, когда начались судороги». Это имеет очень мало смыслового смысла, но мы можем сказать, что это связано с временными рамками периодов и побочным эффектом спазма. Ярлыки помогут нам проверить, правильно ли наше тематическое моделирование построило темы и сгруппировало сообщения в эти темы.

Движение вперед:

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

Резюме

Короче говоря, я надеялся (за 4 недели) создать приложение, которое не только предлагало бы женщинам противозачаточные средства, но и анализировало бы мнение других женщин о своих побочных эффектах и ​​предоставляло бы им соответствующую информацию о том, что говорят другие женщины. Вы можете ознакомиться со всем веб-приложением здесь. Мне очень нравится использовать науку о данных и машинное обучение для создания такого масштабного инструмента, который, надеюсь, может помочь женщинам принимать важные решения. Я многому научился, создавая это веб-приложение, и это было бы невозможно без помощи замечательных бостонских стипендиатов и директоров программ Insight !!

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