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

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

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

Не волнуйтесь, глядя на все операторы импорта! Мы подробно разберемся во всех них. Итак, теперь давайте загрузим данные и просмотрим первые пять записей.

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

Итак, у нас есть 768 строк и 9 функций, одна из которых будет нашей целевой переменной.

Теперь давайте разберемся в наших функциях. Прежде всего, каковы наши особенности? Ответ…

Беременности –количество беременностей пользователя.

Глюкоза —концентрация глюкозы в плазме через 2 часа при пероральном тесте на толерантность к глюкозе

Кровяное давление –диастолическое артериальное давление (мм рт. ст.)

Толщина кожи Толщина кожной складки трицепса (мм)

Инсулин - 2-часовой инсулин в сыворотке (мЕд/мл)

ИМТ – Индекс массы тела (вес в кг/(рост в м)²)

Функция родословной диабета Вероятность диабета на основе семейного анамнеза

Возраст Возраст пользователя.

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

Сначала давайте разделим наши данные на обучающие и тестовые данные в соотношении 70:30.

Теперь давайте построим нашу модель. Давайте попробуем нашу модель с различными алгоритмами классификации, которые…

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

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

Сигмовидная функция выглядит так…

K ближайших соседей

Knn — это очень простой алгоритм классификации, который предсказывает целевую переменную с учетом входных данных на основе окружающих соседей входных данных. Позволяет получить ясное понимание. KNN предполагает, что подобные вещи существуют в непосредственной близости. Основываясь на этом предположении, он находит k элементов, наиболее похожих на входные данные, и классифицирует цель как цель K соседей (может принимать режим целевой переменной соседей). Мерой подобия может быть расстояние.

Случайный лес

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

Линейная регрессия

Линейная регрессия — это статистический метод, в котором «y» — цель прогнозируется с использованием линейной линии — «y=mx+c», где m — наклон линии, а c — точка пересечения (смещение). m и c непрерывно обновляется, пока я не найду самый совершенный прогноз y. Но этот подход предназначен только для числовых данных и не подходит для категориальных данных. Я просто использую этот алгоритм, чтобы на практике показать, насколько плохо он работает с категориальными данными (как в нашем случае).

Машина опорных векторов

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

Наивный Байес

Этот алгоритм основан на теореме Байеса. Основная идея этого алгоритма заключается в том, что он вычисляет условные вероятности целевой переменной с учетом входных признаков и на основе значений вероятностей выполняется классификация. Наивное предположение в этом алгоритме состоит в том, что входные переменные предполагаются условно независимыми. Следовательно, это называется наивным алгоритмом Байеса. Алгоритм Gaussian Naive Bayes построен на предположении о нормальном распределении вероятностей, тогда как алгоритм Multinomial Naive Bayes предполагает полиномиальное распределение вероятностей. Полиномиальный наивный байесовский алгоритм хорошо работает с данными, которые можно легко превратить в подсчеты, например, с количеством слов в тексте. Вместо этого гауссовский наивный байесовский алгоритм основан на непрерывном распределении и подходит для более общих задач классификации. Мы будем наблюдать за работой обоих алгоритмов.

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

Давайте посмотрим на производительность этих алгоритмов.

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

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

  1. Обработка недостающих данных.
  2. Выбор функции.
  3. Настройка гиперпараметра.

Обработка отсутствующих данных

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

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

Замена на среднее…

Давайте посмотрим на производительность всех алгоритмов.

Учитывая наилучший алгоритм, т.е. Случайный лес, мы можем увидеть очень небольшое увеличение. Теперь давайте попробуем с медианой.

Посмотрим выступления..

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

Выбор функций

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

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

Итак, давайте опустим функцию родословной диабета.

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

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

Настройка гиперпараметров

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

Логистическая регрессия. Мы собираемся установить максимальное количество итераций для решателя (алгоритм, используемый в задаче оптимизации), чтобы оно сходилось как 10 000.

KNN - мы установим, что соседи будут считаться 10.

Случайный лес. Мы установим количество деревьев в лесу (n_estimators) равным 150, максимальную глубину дерева — 80, минимальное количество выборок, необходимых для разделения внутреннего узла (min_samples_split), — 12 и минимальное количество выборок. требуется быть на листовом узле (min_samples_leaf) как 5.

SVM — мы установим параметр регуляризации (C) равным 2, а максимальное количество итераций — 1000.

Multinomial Naive Bayes — установите параметр аддитивного сглаживания (чтобы избежать случая с нулевой вероятностью) равным 2.

давайте теперь посмотрим спектакли…

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

Давайте выберем Random Forest с 75% точностью в качестве нашей окончательной модели.

Создание приложения

Как только вы закончите модель, просто загрузите ее в файл pickel, который будет использоваться в программе app.py, которая содержит код для работы приложения вместе с пользовательским интерфейсом (ссылка на HTML-страницы). Подробное объяснение создания приложения сделало бы этот пост действительно огромным и скучным. Поэтому здесь даю ​​ссылку на мой git-репозиторий, в котором находятся все файлы для сборки приложения.

Чтобы запустить приложение на локальном хосте вашего ПК (требуется Python) —

  • Клонировать мой репозиторий git
  • Откройте cmd, перейдите в папку приложения
  • Настройте среду фляги и установите флягу, если она отсутствует (проверьте как)
  • Установите pandas, sklearn, если нет.
  • Теперь запустите файл app.py, и приложение начнет работать на локальном хосте, адрес которого будет отображаться в CMD.

Чтобы развернуть приложение (с помощью бесплатного хостинга heroku)—

  • Вставьте приложение в свой git.
  • Создайте бесплатную учетную запись героку
  • На панели инструментов выберите вариант создания нового приложения.
  • Дайте имя вашему приложению и создайте его.
  • Выберите опцию «подключиться к Git» и выберите репозиторий.
  • Выберите развертывание вручную и дождитесь развертывания приложения.

Для развертывания на героку вам потребуются 2 файла: procfile, который сообщает героку процедуру, и файл требований, который сообщает героку требования. Не волнуйтесь! Эти файлы также включены в мой репозиторий git.

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

Мой вклад

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

Проблемы, с которыми столкнулись

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

Рекомендации

https://towardsdatascience.com/build-deploy-diabetes-prediction-app-using-flask-ml-and-heroku-2de07cbd902d



https://www.analyticsvidhya.com/blog/2016/01/guide-data-exploration/