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

Поскольку инсульт является серьезной проблемой для здоровья старшего поколения, я был очень заинтригован, обнаружив, что у Analytics Vidhya действительно есть вопрос о конкуренции, касающийся инсультов, который можно найти здесь: https://datahack.analyticsvidhya.com/contest. /mckinsey-analytics-online-hackathon/#MySubmissions»

Постановка задачи для этого конкурса гласит:

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

В этом случае ваш клиент хочет провести исследование по одному из критических заболеваний «Инсульт». Инсульт – это заболевание, поражающее артерии, ведущие к головному мозгу и внутри него. Инсульт возникает, когда кровеносный сосуд, по которому кислород и питательные вещества поступают в мозг, блокируется тромбом или лопается (или разрывается). Когда это происходит, часть мозга не может получать необходимую ему кровь (и кислород), поэтому она и клетки мозга умирают.

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

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

Я написал эту программу в Google Colab, который является очень удобным для использования ноутбуком Jupyter, потому что он полностью онлайн и не требует установки какого-либо программного обеспечения на моем персональном компьютере.

Я импортировал библиотеки, которые мне понадобятся, поскольку они уже установлены в этом онлайн-инструменте.

Затем я загрузил файлы и поместил их в свою личную учетную запись GitHub, чтобы не использовать ценную память на моем диске Google:

Как только файлы были загружены и прочитаны, я проверил, нет ли каких-либо нулевых значений. Нулевые значения, присутствующие как в обучающем, так и в тестовом наборах данных, были обнаружены в столбцах «ИМТ» и «smoking_status». К сожалению, эти два столбца многое говорят о том, может ли у человека случиться инсульт, поэтому печально, что эти ячейки не были полностью заполнены в наборах данных:

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

Я подсчитал примеры и обнаружил, что 98,195853 составляют процент 0 примеров, а 1,804147 составляют 1 пример. Эти значения пригодятся, когда придет время устранить дисбаланс классов, потому что модель, которую я использовал, требовала от меня вычитания процентов из единицы для определения весов классов.

Затем я создал переменную id, содержащую данные из test.id, которые будут удалены из набора данных при определении значений X, y и X_test.

Я определил свои значения X, y и X_test. Переменная y содержит информацию о train.stroke. X содержит набор данных поезда с удаленными столбцами «id» и «stroke». X_test содержит тестовый набор данных с удаленным столбцом «id»:

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

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

Поскольку CatBoost не установлен в Google Colab, я установил эту библиотеку на ноутбук Jupyter:

После того, как CatBoost был установлен в Google Colab, я смог установить CatBoostClassifier(), который должен был быть моделью, которую я использовал, после обработки данных через препроцессор. Я установил вес класса для каждой категории на 1 процент от этой точки и достиг 99,99% точности при использовании этой техники:

Затем я сделал прогнозы на проверочном наборе и добился точности 97,47%, используя параметры, на которые я настроил CatBoost, что действительно удивительно:

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

Я создал матрицу путаницы, которая резюмировала производительность модели. Матрица путаницы показала, что было 4227 истинных положительных результатов, 35 ложноположительных результатов, 75 ложноотрицательных результатов и 3 истинно отрицательных результата:

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

Затем я поместил прогнозы в фрейм данных и использовал переменную «id», которая была создана в начале программы. Я создал файл .csv, который будет загружен и отправлен в Analytics Vidhya:

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

Я лишь немного изменил веса классов в настройке параметров Catboost на [.02, .97] и перезапустил программу. Когда я повторно запустил программу и проверил свои прогнозы в средстве проверки решений, я добился небольшого увеличения точности. Это указывает мне на то, что отношение 0 к 1 в тестовом наборе отличается от набора поездов, и ключ в том, чтобы выяснить соотношение и ввести его в модель. Однако проблема, которая может возникнуть, заключается в том, что набор тестовых данных может быть перетренирован, что означает, что модель может не подходить для других данных. Таким образом, решение состоит в том, чтобы попытаться найти золотую середину при настройке параметров, чтобы гарантировать, что модель не будет переобучена или недоработана:

Полностью код для этого поста можно найти в моей личной учетной записи GitHub, которую можно найти здесь: https://github.com/TracyRenee61/AV-Stroke/blob/main/AV_Stroke.ipynb.