Создание индикатора риска диабета
Диабет - это заболевание, которое нарушает способность организма регулировать уровень сахара в крови. Это происходит, когда организм не может эффективно использовать инсулин - гормон, который перерабатывает или регулирует уровень сахара в крови. Если не лечить на достаточно ранней стадии, это в конечном итоге приводит к смерти. В 2016 году Всемирная организация здравоохранения сообщила, что примерно 422 миллиона человек в мире страдают диабетом.
Предположим, у нас есть история болезни пациентов с диабетом, можем ли мы использовать машинное обучение, чтобы определить, у каких пациентов с большой вероятностью разовьется диабет на ранней стадии?
В этой статье мы узнаем, как построить индикатор риска диабета на ранней стадии, используя. Мы будем использовать ранний этап Набор данных о риске диабета от Kaggle.
- Предварительные мероприятия
Первым делом нужно импортировать соответствующие библиотеки. Мы будем использовать 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 здесь.