В этой статье я покажу вам, как создать свою собственную искусственную нейронную сеть (ИНС) с помощью Python! Мы будем использовать набор данных Pima-Indian-Diabetes, чтобы предсказать, есть ли у человека диабет или нет, используя нейронные сети.

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

О нейронных сетях

Искусственные нейронные сети (ИНС) - это вычислительные системы, созданные на основе биологических нейронных сетей, составляющих мозг. Такие системы учатся выполнять задачи на примерах, как правило, без программирования каких-либо правил для конкретных задач. - Википедия

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

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

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

#Description: This program detects/predicts if a person has diabetes (1) or not (0)

Загрузите библиотеки.

#Load libraries
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Загрузите и сохраните набор данных в переменной df, затем распечатайте первые 7 строк данных.

#Store the data set
df = pd.read_csv('diabetes.csv')
#Look at first 7 rows of data
df.head(7)

Покажите количество строк и столбцов в наборе данных.

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

Проверьте наличие дубликатов и удалите их.

#Checking for duplicates and removing them
df.drop_duplicates(inplace = True)

Покажите новую форму (если есть дубликаты) набора данных.

#Show the shape to see if any rows were dropped 
df.shape

Показать любые недостающие данные в столбцах.

#Show the number of missing (NAN, NaN, na) data for each column
df.isnull().sum()

Преобразуйте данные в массив и распечатайте его. В этом поможет нейронная сеть.

#Convert the data into an array
dataset = df.values
dataset

Разделите данные на независимый / функциональный набор данных X и зависимый / целевой набор данных y.

# Get all of the rows from the first eight columns of the dataset
X = dataset[:,0:8] 
# Get all of the rows from the last column
y = dataset[:,8] 

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

from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
X_scale = min_max_scaler.fit_transform(X)
X_scale

Снова разделите данные, но на этот раз на 80% данных обучения и 20% данных тестирования.

X_train, X_test, y_train, y_test = train_test_split(X_scale, y, test_size=0.2, random_state = 4)

Наконец, мы можем приступить к созданию искусственной нейронной сети. Архитектура модели будет состоять из трех слоев. Первый слой будет иметь 12 нейронов и использовать функцию активации ReLu, второй слой будет иметь 15 нейронов и будет использовать функцию активации ReLu, а третий и последний слой будет использовать 1 нейрон и функцию активации сигмовидной кишки.

model = Sequential([
    Dense(12, activation='relu', input_shape=( 8 ,)),
    Dense(15, activation='relu'),
    Dense(1, activation='sigmoid')
])

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

model.compile(optimizer='sgd',
              loss='binary_crossentropy',
              metrics=['accuracy'])

Обучите модель, используя метод подгонки на обучающих данных, и обучите ее размером 57 пакетов с 1000 эпох. Предоставьте данные проверки модели, чтобы увидеть, насколько хорошо модель работает, разделив данные обучения на проверку 20%.

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

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

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

hist = model.fit(X_train, y_train,
          batch_size=57, epochs=1000, validation_split=0.2)

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

#visualize the training loss and the validation loss to see if the model is overfitting
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper right')
plt.show()

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

#visualize the training accuracy and the validation accuracy to see if the model is overfitting
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='lower right')
plt.show()

Используйте модель для прогнозирования с использованием набора данных тестирования X_test
Поскольку нейронные сети дают только вероятности (значения от 0 до 1 включительно), я создал порог, в котором значения .5 и выше классифицируют целевые данные как ( 1) и значениями меньше, чем (0).

Я также распечатаю фактические значения тестового набора, чтобы сравнить результаты.

#Make a prediction & print the actual values
prediction = model.predict(X_test)
prediction  = [1 if y>=0.5 else 0 for y in prediction] #Threshold
print(prediction)
print(y_test)

Оцените модель на наборе обучающих данных.

from sklearn.metrics import classification_report,confusion_matrix, accuracy_score
pred = model.predict(X_train)
pred  = [1 if y>=0.5 else 0 for y in pred] #Threshold
print(classification_report(y_train ,pred ))
print('Confusion Matrix: \n',confusion_matrix(y_train,pred))
print()
print('Accuracy: ', accuracy_score(y_train,pred))
print()

Оцените модель на наборе данных тестирования.

from sklearn.metrics import classification_report,confusion_matrix, accuracy_score
pred = model.predict(X_test)
pred  = [1 if y>=0.5 else 0 for y in pred] #Threshold
print(classification_report(y_test ,pred ))
print('Confusion Matrix: \n',confusion_matrix(y_test,pred))
print()
print('Accuracy: ', accuracy_score(y_test,pred))
print()

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

model.evaluate(X_test, y_test)[1]

Модель точно определила людей, страдающих диабетом, с точностью 75,9% по данным испытаний!

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

Вот и все, вы создали свою программу искусственной нейронной сети для обнаружения диабета!

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

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

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

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

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

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

Национальный центр биотехнологической информации