Создание индикатора риска диабета

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

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

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

  1. Предварительные мероприятия

Первым делом нужно импортировать соответствующие библиотеки. Мы будем использовать Pandas, Seaborn, Scikit learn и Matplotlib.

import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score

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

#load datasets
diabetes_df= pd.read_csv('.../data/diabetes_data_upload.csv')
# A view of the datset
diabetes_df.head(10)

2. Подробная информация о наборе данных

#identify the numerical values in the dataset
num_features = diabetes_df.dtypes[diabetes_df.dtypes != 'object'].index
print('Numerical features', len(num_features))
#identify categorical values
categorical_features = diabetes_df.dtypes[diabetes_df.dtypes == 'object'].index
print('Categorical features', len(categorical_features))
print("Numerical features", diabetes_df[num_features].columns)
print("Categorical features", diabetes_df[categorical_features].columns)

3. Некоторый исследовательский анализ данных по функциям

# Feature: Gender
sns.catplot(x='Gender', kind="count", palette='RdBu',data=diabetes_df)

В этом наборе данных участников больше мужчин, чем женщин.

# Feature: Polyuria
sns.catplot(x='Polyuria', kind="count", palette="ch:.25", data=diabetes_df)

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

# Feature: Polydipsia
sns.catplot(x='Polydipsia', kind="count", palette="rainbow", data=diabetes_df)

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

# Features: Polyphagia and sudden weight loss
sns.swarmplot(x="Polyphagia", y="Age", hue='sudden weight loss', data=diabetes_df)

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

# Feature: Genital thrush
sns.boxplot(x='Genital thrush',y='Age',data=diabetes_df,palette='rainbow')

Видно, что больше больных генитальным молочницей нет. Кроме того, большинство из тех, у кого он есть, находится в диапазоне 40–55 лет. Лишь немногие из них в возрасте от 80 лет и старше.

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

# Make copy to avoid changing original data 
label_df = diabetes_df.copy()
# Apply label encoder to each column with categorical data
label_encoder = LabelEncoder()
for col in categorical_features:
    label_df[col] = label_encoder.fit_transform(label_df[col])
diabetes_df =label_df

Затем тепловая карта ..

plt.figure(figsize=(30,15))
correlation = diabetes_df.corr()
sns.heatmap(correlation, annot=True)

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

Теперь, когда мы закончили анализ данных. Мы можем начать строить модель, чтобы делать прогнозы.

4. Модель

#Select the target and input variables, y is the target, X is the input
y= label_df['class']
X= label_df.drop(['class'], 1)
# First divide the data set into training, testing and validation data
X_train, X_valid, y_train, y_valid = train_test_split(X, y,train_size=0.70, random_state=42, shuffle=True )
X_validation, X_test, y_validation, y_test = train_test_split(X_valid, y_valid,train_size=0.50, shuffle=True, random_state=42 )

Сначала мы сравним два классификатора, чтобы определить наиболее эффективный из них для нашего Индикатора риска диабета. Это классификатор случайного леса и классификатор SVM. SVM расшифровывается как Support Vector Machines, это классификатор, который находит гиперплоскость между двумя классами данных. Случайный лес работает путем построения множества деревьев решений во время обучения и вывода класса, который является режимом классов или средним предсказанием отдельного человека. деревья.

classifiers=[]
#Random Forest 
rf = RandomForestClassifier()
classifiers.append(rf)
#SVM
sv = svm.SVC()
classifiers.append(sv)
for clf in classifiers:
    clf.fit(X_train, y_train)
    preds=clf.predict(X_validation)
    acc = accuracy_score(y_validation, preds)
    print("Accuracy of %s is %s"%(clf, acc))

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

predictions_final=sv.predict(X_test)
accuracy_test=accuracy_score(y_test, predictions_final)
print('Accuracy of testing data is is %s'%(accuracy_test))

Запишите прогнозы в файл, и все готово!

# Final Predictions
#Write results of predictions to csv file
predictions_file = pd.DataFrame({'Age': X_test['Age'],'Diabetes_indicator': predictions_final})
predictions_file.to_csv('diabetes.csv', index=False)
print("Done with predictions!")

Вы можете найти ссылку на этот блокнот на Github здесь.