www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Рабочий процесс машинного обучения по данным о диабете: часть 01

Дата публикации Feb 26, 2018

Имиджевый кредит -http://medicalfuturist.com/what-to-expect-from-digital-health-2018/

«Машинное обучение в медицинских учреждениях может помочь значительно улучшить медицинскую диагностику».

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

Что такое диабет?

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

Предпосылки

  • Python 3. +
  • Анаконда (Scikit Learn, Numpy, Pandas, Matplotlib, Seaborn)
  • Jupyter Notebook.
  • Базовое понимание контролируемых методов машинного обучения: в частности, классификация.

Этап 0 - Подготовка данных

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

В этом руководстве мы не собираемся создавать наш собственный набор данных, вместо этого мы будем использовать существующий набор данных, который называетсяБаза данных диабета индейцев пима», Предоставляемый UCI Machine Learning Repository (известный репозиторий для наборов данных машинного обучения). Мы будем выполнять рабочий процесс машинного обучения сНабор данных диабетапредусмотрено выше.

Этап 1 - Исследование данных

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

Сначала мы импортируем необходимые библиотеки и импортируем наш набор данных в блокнот Jupyter. Мы можем наблюдать упомянутые столбцы в наборе данных.

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsdiabetes = pd.read_csv('datasets/diabetes.csv')
diabetes.columns

Индекс ([«Беременность», «Глюкоза», «Кровяное давление», «SkinThickness», «Инсулин»,
«BMI», «DiabetesPedigreeFunction», «Age», «Outcome»],
DTYPE = 'объект')

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

Мы можем исследовать набор данных, используя пандголова()метод.

diabetes.head()
Фиг.8 - набор данных диабета

Мы можем найти размеры набора данных, используя атрибут panda Dataframes '' shape '.

print("Diabetes data set dimensions : {}".format(diabetes.shape))

Размеры набора данных диабета: (768, 9)

Мы можем заметить, что набор данных содержит 768 строк и 9 столбцов. «результат’- это столбец, который мы собираемся предсказать, в котором указано, является ли пациент диабетом или нет. 1 означает, что человек болен диабетом, а 0 означает, что человек не болен Мы можем определить, что из 768 человек 500 помечены как 0 (не диабетик), а 268 как 1 (диабетик)

diabetes.groupby('Outcome').size()
Рис. Распределение классов

Визуализация данных является обязательным аспектом науки о данных. Это помогает понять данные, а также объяснить данные другому человеку. В Python есть несколько интересных библиотек визуализации, таких как Matplotlib, Seaborn и т. Д.

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

Рис. Распределение данных

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

diabetes.groupby(‘Outcome’).hist(figsize=(9, 9))

Этап 2 - Очистка данных

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

В процессе очистки данных необходимо учитывать несколько факторов.

  1. Двойные или не относящиеся к делу наблюдения.
  2. Плохая маркировка данных, одна и та же категория встречается несколько раз.
  3. Отсутствующие или нулевые точки данных.
  4. Неожиданные выбросы.

Мы не будем подробно обсуждать процедуру очистки данных в этом руководстве.

Поскольку мы используем стандартный набор данных, мы можем с уверенностью предположить, что факторы 1, 2 уже рассмотрены. Неожиданные выбросы, полезные или потенциально вредные.

Отсутствующие или нулевые точки данных

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

diabetes.isnull().sum()
diabetes.isna().sum()

Мы можем наблюдать, что в наборе данных отсутствуют пропущенные точки данных. Если таковые были, мы должны иметь с ними дело соответственно.

Рис - Наблюдать за отсутствующими данными

Неожиданные выбросы

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

Кровяное давление :Наблюдая за данными, мы можем видеть, что есть 0 значений для кровяного давления. И очевидно, что показания набора данных кажутся неправильными, потому что у живого человека диастолическое артериальное давление не может быть нулевым. Наблюдая за данными, мы видим 35 отсчетов, где значение равно 0.

print("Total : ", diabetes[diabetes.BloodPressure == 0].shape[0])Total :  35print(diabetes[diabetes.BloodPressure == 0].groupby('Outcome')['Age'].count())Outcome
0 19
1 16
Name: Age, dtype: int64

Уровень глюкозы в плазме:Даже после голодания уровень глюкозы не будет ниже нуля. Поэтому ноль - неверное чтение. Наблюдая за данными, мы видим 5 отсчетов, где значение равно 0.

print("Total : ", diabetes[diabetes.Glucose == 0].shape[0])Total :  5print(diabetes[diabetes.Glucose == 0].groupby('Outcome')['Age'].count())Total :  5
Outcome
0 3
1 2
Name: Age, dtype: int64

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

print("Total : ", diabetes[diabetes.SkinThickness == 0].shape[0])Total :  227print(diabetes[diabetes.SkinThickness == 0].groupby('Outcome')['Age'].count())Outcome
0 139
1 88
Name: Age, dtype: int64

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

print("Total : ", diabetes[diabetes.BMI == 0].shape[0])Total :  11print(diabetes[diabetes.BMI == 0].groupby('Outcome')['Age'].count())Outcome
0 9
1 2
Name: Age, dtype: int64

Инсулин:В редкой ситуации у человека может быть нулевой инсулин, но, наблюдая данные, мы можем обнаружить, что в общей сложности 374 подсчета.

print("Total : ", diabetes[diabetes.Insulin == 0].shape[0])Total :  374print(diabetes[diabetes.Insulin == 0].groupby('Outcome')['Age'].count())Outcome
0 236
1 138
Name: Age, dtype: int64

Вот несколько способов обработки неверных значений данных:

  1. Игнорировать / удалять эти случаи: в большинстве случаев это фактически невозможно, поскольку это будет означать потерю ценной информации. И в этом случае столбцы «толщина кожи» и «инсулин» означают много недействительных точек. Но это может работать для точек данных «ИМТ», «глюкоза» и «артериальное давление».
  2. Укажите средние / средние значения: это может работать для некоторых наборов данных, но в нашем случае введение среднего значения в столбец артериального давления может привести к неверному сигналу модели.
  3. Избегайте использования функций. Можно не использовать функции с большим количеством недопустимых значений для модели. Это может работать для «толщины кожи», но трудно предсказать это.

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

Мы удалим строки, у которых «BloodPressure», «BMI» и «Glucose» равны нулю.

diabetes_mod = diabetes[(diabetes.BloodPressure != 0) & (diabetes.BMI != 0) & (diabetes.Glucose != 0)]print(diabetes_mod.shape)(724, 9)

Этап 3 - Проектирование

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

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

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

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

«Беременность», «Глюкоза», «Артериальное давление», «Толщина кожи», «Инсулин», «ИМТ», «Функция родословной диабета», «Возраст»

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

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

feature_names = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']X = diabetes_mod[feature_names]
y = diabetes_mod.Outcome

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

Данная статья дает очень хорошее объяснение оХарактеристика,

Этап 4 - Выбор модели

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

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

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

from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier

Мы инициализируем модели классификатора с их параметрами по умолчанию и добавим их в список моделей.

models = []models.append(('KNN', KNeighborsClassifier()))
models.append(('SVC', SVC()))
models.append(('LR', LogisticRegression()))
models.append(('DT', DecisionTreeClassifier()))
models.append(('GNB', GaussianNB()))
models.append(('RF', RandomForestClassifier()))
models.append(('GB', GradientBoostingClassifier()))

Пример: Как правило, обучение модели с использованием Scikit происходит следующим образом.

knn = KNeighborsClassifier ()
knn.fit (X_train, y_train)

Методы оценки

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

  1. Поезд / Тест Сплит
  2. K-Fold Cross Validation

Мы будем импортировать«Train_test_split»дляразделение поезда / тестаа также«Cross_val_score» дляK-кратная перекрестная проверка, «Accuracy_score»заключается в оценке точности модели в методе разделения поезда / теста.

from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score

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

Поезд / Тест Сплит

Этот метод разделяет набор данных на две части:Обучающий наборинабор для тестирования,Обучающий набориспользуется для обучения модели. Инабор для тестированияиспользуется для проверки модели и оценки точности.

Плюсы:Но разделение поезд / тест все еще полезно из-за егогибкость и скорость

Минусы:Обеспечиваетоценка высокой дисперсииточности вне выборки

Рис - Поезд / Тест Сплит

Тренировка / Тестовый Сплит с Scikit Learn:

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

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = diabetes_mod.Outcome, random_state=0)

Затем мы подгоняем каждую модель к циклу и вычисляем точность соответствующей модели, используя«Accuracy_score»,

names = []
scores = []for name, model in models:
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
scores.append(accuracy_score(y_test, y_pred))
names.append(name)tr_split = pd.DataFrame({'Name': names, 'Score': scores})
print(tr_split)
Рис. - Точность разделения поезда / теста.

K-Fold Cross Validation

Этот метод разбивает набор данных наK равных перегородок(«Сгибы»), затем используйте 1 сгиб в качественабор для тестированияи объединение других складок какОбучающий набор, Затем модель проверяется на точность. Процесс будет повторять описанные выше шаги K раз, каждый раз используя различные сгибы в качестве тестового набора.средняя точность тестированияпроцесса является точность тестирования.

Плюсы:Более точная оценка точности вне выборки. Более «эффективное» использование данных (каждое наблюдение используется как для обучения, так и для тестирования)

Минусы:Гораздо медленнее, чем разделение Поезд / Тест

Рис. 5-кратный процесс перекрестной проверки

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

K-Fold Cross Validation с Scikit Узнайте:

Мы будем продвигаться вперед с перекрестной проверкой K-Fold, поскольку она более точна и эффективно использует данные. Мы будем обучать модели с использованием 10-кратной перекрестной проверки и вычислять среднюю точность моделей. «Cross_val_score» предоставляет собственный интерфейс для обучения и расчета точности.

names = []
scores = []for name, model in models:

kfold = KFold(n_splits=10, random_state=10)
score = cross_val_score(model, X, y, cv=kfold, scoring='accuracy').mean()

names.append(name)
scores.append(score)kf_cross_val = pd.DataFrame({'Name': names, 'Score': scores})
print(kf_cross_val)
Рис. - K-Fold Кросс-оценка точности оценки

Мы можем построить показатели точности, используя Seaborn

axis = sns.barplot(x = 'Name', y = 'Score', data = kf_cross_val)
axis.set(xlabel='Classifier', ylabel='Accuracy')for p in axis.patches:
height = p.get_height()
axis.text(p.get_x() + p.get_width()/2, height + 0.005, '{:1.4f}'.format(height), ha="center")

plt.show()
Рис - Точность классификаторов

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

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

Резюме

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

Обновить

Вы можете найти Часть 02 этой серии по следующей ссылке.

Рабочий процесс машинного обучения по данным о диабете: часть 02

В моей последней статье из этой серии мы обсудили рабочий процесс машинного обучения на наборе данных о диабете. А также…

towardsdatascience.com

Исходный код, который создал этот пост, можно найти ниже.

LahiruTjay / Machine-Learning-С-Python

Machine-Learning-With-Python - эти репозитории содержат различные примеры машинного обучения, выполненные с помощью Python.

github.com

Если у вас есть какие-либо проблемы или вопросы относительно этой статьи, пожалуйста, не стесняйтесь оставить комментарий ниже или напишите мне по электронной почте: [email protected]

Надеюсь, вам понравилась статья. Ура !!!

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map