Изкуствените невронни мрежи (ANN) са популярна техника за машинно обучение, използвана за решаване на сложни проблеми в различни области като разпознаване на изображения и реч, обработка на естествен език и прогнозни анализи. В тази статия ще проучим процеса на използване на ANN върху онлайн набор от данни, стъпка по стъпка, включително подробни примери за код, оценка на модела и визуализация.

Стъпка 1: Импортиране на библиотеките

Първата стъпка е да импортираме необходимите библиотеки за нашия проект. Ще използваме библиотеката pandas за манипулиране и предварителна обработка на данни, библиотеката scikit-learn за разделяне на данните в комплекти за обучение и тестване и библиотеката Keras за изграждане на нашия ANN модел.

import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense

Стъпка 2: Зареждане на набора от данни

В този пример ще използваме набора от данни „Рак на гърдата Уисконсин (диагностика)“ от UCI Machine Learning Repository. Този набор от данни съдържа информация за тумори на рак на гърдата, включително различни характеристики като радиус, текстура и периметър. Целевата променлива е двоична променлива, която показва дали туморът е злокачествен или доброкачествен.

Можем да заредим набора от данни с помощта на библиотеката на pandas:

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data"
names = ['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 'concave_points_mean', 'symmetry_mean', 'fractal_dimension_mean', 'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave_points_se', 'symmetry_se', 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave_points_worst', 'symmetry_worst', 'fractal_dimension_worst']
df = pd.read_csv(url, header=None, names=names)
df

Изход:

Стъпка 3: Предварителна обработка на набора от данни

Преди да можем да използваме набора от данни, за да обучим нашия модел, трябва да обработим предварително данните. Това включва премахване на всички липсващи стойности, кодиране на целевата променлива, нормализиране на данните, за да се приведат всички характеристики в еднакъв мащаб и гарантиране, че на всяка характеристика се придава еднаква важност по време на обучението.

# Removing the ID column
df.drop('id', axis=1, inplace=True)

# Encoding the target variable
df['diagnosis'] = df['diagnosis'].map({'M': 1, 'B': 0})

# Normalizing the data
X = df.drop('diagnosis', axis=1)
y = df['diagnosis']
X = (X - X.mean()) / X.std()

Стъпка 4: Разделяне на набора от данни

Ние ще разделим набора от данни на набори за обучение и тестване, като използваме функцията train_test_split от библиотеката scikit-learn. Ще използваме 80% от данните за обучение и 20% за тестване.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Стъпка 5: Изграждане на модела на изкуствени невронни мрежи

Ще използваме библиотеката Keras, за да изградим нашия ANN модел. Нашият модел ще има един входен слой с 30 неврона, два скрити слоя с 15 и 10 неврона и един изходен слой с един неврон.

  1. Размерът на входния слой е равен на броя на входните характеристики във вашия набор от данни. Например, ако имате набор от данни с 10 функции, ще ви трябва входен слой с 10 неврона.
  2. Размерът на изходния слой зависи от вида на проблема, който се опитвате да разрешите. За проблем с класификация с два класа ви е необходим един неврон в изходния слой. За проблем с многокласова класификация с N класа са ви необходими N неврона в изходния слой. За проблем с регресия ви е необходим един неврон в изходния слой.
  3. Скрити слоеве: Броят на скритите слоеве и неврони във всеки слой зависи от сложността на проблема. Колкото по-сложен е проблемът, толкова повече скрити слоеве и неврони са необходими. Добавянето на твърде много слоеве обаче може да доведе до пренастройване, което означава, че моделът ще се представи добре на данните за обучение, но лошо на данните за тестване.
# Initializing the model
model = Sequential()

# Adding the input layer and first hidden layer
model.add(Dense(30, input_dim=X_train.shape[1], activation='relu'))

#Adding the second hidden layer
model.add(Dense(15, activation='relu'))

#Adding the third hidden layer
model.add(Dense(10, activation='relu'))

#Adding the output layer
model.add(Dense(1, activation='sigmoid'))

Стъпка 6: Компилиране на модела

След като сме дефинирали модела, ще го компилираме с помощта на оптимизатор, функция за загуба и показател за оценка. Ще използваме оптимизатора на Адам, двоичната функция за загуба на кръстосана ентропия и показател за точност. След това ще съобразим модела с данните за обучение и ще го оценим върху данните от тестването.

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

Стъпка 7: Обучение на модела

history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))

Изход:

Стъпка 8: Оценка на модела

За да оценим ефективността на модела, ще използваме различни показатели, като загуба и точност, и ще генерираме визуализации. Ние ще начертаем кривите на загубата и точността за комплектите за обучение и тестване, за да гарантираме, че моделът не е прекалено или недостатъчно подходящ.

loss, accuracy = model.evaluate(X_test, y_test)
print("Testing set loss: {:.2f}".format(loss))
print("Testing set accuracy: {:.2f}".format(accuracy))

Изход:

Стъпка 9: Визуализации

Можем да визуализираме представянето на модела върху наборите за обучение и тестване, като използваме историческия обект, върнат от функцията за прилягане.

Начертаването на кривите на загубите на набора за обучение и тестване във времето може да даде представа за ефективността на модела. Кривите на загубите могат да покажат дали моделът е пренастроен, недостатъчно напаснат или обобщава добре. Ако загубата на набора за обучение намалява, докато загубата на комплекта за тестване се увеличава, това е индикация, че моделът е пренастроен. Ако както загубата на тренировъчен, така и тестов комплект са високи, това е индикация, че моделът не е подходящ. Ако както загубата на тренировъчния, така и на тестовия набор намаляват и са сходни по големина, това е индикация, че моделът се обобщава добре.

Начертаването на кривите на точността на набора за обучение и тестване във времето може да даде представа за ефективността на модела. Кривите на точността могат да покажат дали моделът е прекалено, недостатъчно или обобщава добре. Ако точността на набора за обучение се увеличава, докато точността на набора за тестване намалява, това е индикация, че моделът е пренастроен. Ако точността на набора за обучение и тестване е ниска, това е индикация, че моделът не е подходящ. Ако точността на набора за обучение и тестване е висока и сходна по величина, това е индикация, че моделът се обобщава добре.

import matplotlib.pyplot as plt

#Visualizing the training and testing set loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Training set', 'Testing set'], loc='upper right')
plt.show()

Изход:

#Visualizing the training and testing set accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Training set', 'Testing set'], loc='lower right')
plt.show()

Изход:

Заключение

В заключение, изкуствените невронни мрежи (ANN) са високоефективна техника за машинно обучение, която може да се използва за решаване на сложни проблеми. Със способността да се учат от големи набори от данни, ANN могат да моделират силно нелинейни връзки и могат да се използват за широк спектър от приложения като разпознаване на изображения, обработка на естествен език и предсказуеми анализи. Въпреки че разработването и обучението на ANN модел може да бъде предизвикателна задача, ползите от използването на ANN далеч надхвърлят сложността. С напредъка в мощността на компютърната обработка и алгоритмите за задълбочено обучение, можем да очакваме ANN да продължи да нараства популярността си като основна техника за машинно обучение за решаване на сложни проблеми от реалния свят. Честито кодиране!