Программа Python для обнаружения и классификации хронической болезни почек

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

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

На ранних стадиях хронического заболевания почек у вас может быть немного признаков или симптомов. Хроническое заболевание почек может не проявиться до тех пор, пока функция почек не будет значительно нарушена. -"Клиника Майо"

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

Data Set Column Information:
age	-	age	
bp	-	blood pressure 
sg	-	specific gravity 
al	-       albumin 
su	-	sugar 
rbc	-	red blood cells 
pc	-	pus cell 
pcc	-	pus cell clumps 
ba	-	bacteria 
bgr	-	blood glucose random 
bu	-	blood urea 
sc	-	serum creatinine 
sod	-	sodium 
pot	-	potassium 
hemo	-	hemoglobin 
pcv	-	packed cell volume 
wc	-	white blood cell count 
rc	-	red blood cell count 
htn	-	hypertension 
dm	-	diabetes mellitus 
cad	-	coronary artery disease 
appet	-	appetite 
pe	-	pedal edema 
ane	-	anemia 
class	-	classification

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

Программирование:

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

#Description: Classify patients as having chronic kidney disease 
#             or not using Artificial Neural Networks

Импортировать библиотеки

#Import Libraries
import glob
from keras.models import Sequential, load_model
import numpy as np
import pandas as pd
import keras as k
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
import matplotlib.pyplot as plt

Загрузите набор данные

    #load the data 
    from google.colab import files #Only use for Google Colab
    uploaded = files.upload()      #Only use for Google Colab
    df = pd.read_csv("kidney_disease.csv")
    
    #Print the first 5 rows
    df.head()

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

#Get the shape of the data (the number of rows & columns)
df.shape

Манипуляция данными: очистка данных

Теперь преобразуем данные. Избавившись от недостающих данных и удалив некоторые столбцы. Сначала мы создадим список имен столбцов, которые мы хотим сохранить или сохранить.

Затем мы отбрасываем или удаляем все столбцы, кроме столбцов, которые мы хотим сохранить.

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

#Create a list of columns to retain
columns_to_retain = ["sg", "al", "sc", "hemo",
                         "pcv", "wbcc", "rbcc", "htn", "classification"]

#columns_to_retain = df.columns, Drop the columns that are not in columns_to_retain
df = df.drop([col for col in df.columns if not col in columns_to_retain], axis=1)
    
# Drop the rows with na or missing values
df = df.dropna(axis=0)

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

#Transform non-numeric columns into numerical columns
for column in df.columns:
        if df[column].dtype == np.number:
            continue
        df[column] = LabelEncoder().fit_transform(df[column])

Мы напечатаем первые 5 строк нового набора данных.

df.head()

Обработка данных: разделение и масштабирование данных

Давайте разделим набор данных на независимый набор данных, который мы назовем X, который представляет собой набор данных функции, и зависимый набор данных, который мы назовем y, который является целевым набором данных.

#Split the data
X = df.drop(["classification"], axis=1)
y = df["classification"]

Затем мы масштабируем набор данных функции до значений от 0 до 1 включительно.

#Feature Scaling
x_scaler = MinMaxScaler()
x_scaler.fit(X)
column_names = X.columns
X[column_names] = x_scaler.transform(X)

Как только мы закончим со всем этим, мы разделим наборы данных на наборы данных 80% для обучения (X_train и y_train) и 20% для тестирования (X_test и y_test) и перемешаем данные перед обучением.

#Split the data into 80% training and 20% testing 
X_train,  X_test, y_train, y_test = train_test_split(
        X, y, test_size= 0.2, shuffle=True)

Постройте модель (искусственная нейронная сеть):

Мы готовы построить модель, также известную как искусственная нейронная сеть!
Сначала мы должны создать архитектуру модели, затем мы добавим 2 слоя, первый слой с 256 нейронами и 'ReLu ' функция активации с инициализатором нормального распределения для весов. Поскольку этот слой является первым слоем, мы также должны указать количество функций / столбцов в наборе данных len(X.columns).

Второй слой, который также является последним, будет иметь 1 нейрон и использовать функцию активации «hard_sigmoid».

#Build The model

model = Sequential()
model.add(Dense(256, input_dim=len(X.columns),              kernel_initializer=k.initializers.random_normal(seed=13), activation="relu"))
model.add(Dense(1, activation="hard_sigmoid"))

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

Оптимизатор, который мы дадим ему, называется оптимизатором «adam». Мы также хотим увидеть, насколько хорошо работает модель, чтобы получить некоторые показатели точности модели.

#Compile the model
model.compile(loss='binary_crossentropy', 
                  optimizer='adam', metrics=['accuracy'])

Обучите модель, используя наборы данных для обучения (X_train и y_train). Дайте ему 2000 epcochs и размер пакета, равный количеству пациентов / строк в наборе данных.

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

Эпоха: количество итераций , когда ВЕСЬ набор данных передается вперед и назад через нейронную сеть только ОДИН РАЗ .

Fit: другое слово для обозначения тренировки

#Train the model
history = model.fit(X_train, y_train, 
                    epochs=2000, 
                    batch_size=X_train.shape[0]) 

Теперь, когда мы закончили создание нашей модели. Сохраним.

#Save the model
model.save("ckd.model")

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

#Visualize the models accuracy and loss
plt.plot(history.history["acc"])
plt.plot(history.history["loss"])
plt.title("model accuracy & loss")
plt.ylabel("accuracy and loss")
plt.xlabel("epoch")
plt.legend(['acc', 'loss'], loc='lower right')
plt.show()

Получите форму обучающих и тестовых данных

print("---------------------------------------------------------")
print("Shape of training data: ", X_train.shape)
print("Shape of test data    : ", X_test.shape )
print("---------------------------------------------------------")

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

for model_file in glob.glob("*.model"):
  print("Model file: ", model_file)
  model = load_model(model_file)
  pred = model.predict(X_test)
  pred = [1 if y>=0.5 else 0 for y in pred] #Threshold, transforming probabilities to either 0 or 1 depending if the probability is below or above 0.5
  scores = model.evaluate(X_test, y_test)
  print()
  print("Original  : {0}".format(", ".join([str(x) for x in y_test])))
  print()
  print("Predicted : {0}".format(", ".join([str(x) for x in pred])))
  print() 
  print("Scores    : loss = ", scores[0], " acc = ", scores[1])
  print("---------------------------------------------------------")
  print()

Заключение и ресурсы

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

Опять же, если хотите, можете посмотреть и послушать, как я объясняю весь код в моем YouTube-видео .

Если вам интересно узнать больше о машинном обучении, чтобы сразу приступить к работе с проблемами и примерами, я рекомендую вам прочитать Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем.

Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понимать концепции машинного обучения.

Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем

Спасибо, что прочитали эту статью, надеюсь, она вам помогла!

Другие источники

  1. Набор данных о хроническом заболевании почек
  2. Kaggle
  3. Клиника Мэйо
  4. Дуа, Д. и Графф, К. (2019). Репозиторий машинного обучения UCI [http://archive.ics.uci.edu/ml]. Ирвин, Калифорния: Калифорнийский университет, Школа информационных и компьютерных наук.