В этой статье я покажу вам, как создать свою собственную искусственную нейронную сеть (ИНС) с помощью 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: концепции, инструменты и методы для создания интеллектуальных систем.
Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понимать концепции машинного обучения.
Спасибо, что прочитали эту статью, надеюсь, она вам помогла!