Что такое модели нейронных сетей?

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

Модели нейронных сетей обычно содержат несколько слоев. Каждый слой содержит несколько узлов, которые называются нейронами. Существует три типа слоев: входной, скрытый и выходной. Входные слои принимают функции/предикторы и переходят к скрытым слоям. Выходные слои вычисляют информацию и предоставляют прогнозы. Между входным и выходным слоями существует скрытый слой. Модели нейронной сети могут иметь ноль, один или несколько скрытых слоев, где входная информация обрабатывается и доставляется на выходной слой.

Существует множество пакетов Python, реализующих моделирование нейронных сетей. Tensorflow — самый популярный. Keras построен на основе Tensorflow и более удобен для пользователя. В этой статье мы будем использовать Keras для построения простой модели классификации.

Данные для упражнения

Для этого упражнения мы будем использовать данные Титаника. В таблице ниже представлен список переменных и их описание.

Чтение данных

Сначала мы импортируем необходимые библиотеки и считываем данные.

# Import Python packages
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn import cross_validation
from keras.models import Sequential
from keras.layers import Dense
# Readin Data
df = pd.read_excel(open('titanic.xlsx','rb'), sheet_name='titanic3')
df.head()

Затем мы получаем некоторую базовую информацию об этом наборе данных.

df.info()
df['survived'].value_counts()

Мы видим, что есть несколько переменных с пропущенными значениями. Поскольку в этом упражнении основное внимание уделяется модели нейронной сети, мы удалим эти переменные, чтобы быстро построить набор данных для моделирования. Но в реальном проекте мы можем захотеть изучить способы выполнения отсутствующего вменения и проверить, помогает ли это точности прогноза. Есть также некоторые переменные-идентификаторы наблюдения, которые не обладают сильной предсказательной силой (например, номер билета). Мы также отбросим эти переменные.

# Drop the variables with a lot of missing values and name, ticket
df=df.drop(['cabin','boat','body','home.dest', 'name','ticket'],axis=1)
df.head()
# Drop records with missing values
df = df.dropna()
df.info()

Предварительная обработка данных

Это дает нам вселенную для набора данных моделирования. Следующим шагом является предварительная обработка данных и изменение всех категориальных переменных на флаги.

# Check the number of categories in pclass: There are 3
df['pclass'].value_counts()
# Check the number of categories in sibsp: There are 7. Will regroup to 3
df['sibsp'].value_counts()
df['sibsp_cat']=df['sibsp'].apply(lambda x: 2 if x>=2 else x)
df['sibsp_cat'].value_counts()
# Check the number of categories in parch: There are 7.  Will regroup to 3
df['parch'].value_counts()
df['parch_cat']=df['parch'].apply(lambda x: 2 if x>=2 else x)
df['parch_cat'].value_counts()
# Check the number of categories in embarked: There are 3
df['embarked'].value_counts()
# Drop the variables for sibsp and parch before regroup
df=df.drop(['sibsp','parch'],axis=1)

Функция ниже изменяет категориальные переменные на фиктивные переменные и удаляет исходные категориальные переменные из фрейма данных.

# A function to create dummy variables
def create_dummies(df,colname):
    col_dummies=pd.get_dummies(df[colname],prefix=colname)
    col_dummies.drop(col_dummies.columns[0],axis=1,inplace=True)
    df=pd.concat([df,col_dummies],axis=1)
    df.drop(colname,axis=1,inplace=True)
    return df
# Create a list for the categorical variables
col_list=['pclass','sex','embarked','sibsp_cat','parch_cat']
# Apply the function to the list
for i in range(len(col_list)):
    df=create_dummies(df,col_list[i])
df.head()

Сплит-тест поезда

После создания категориальных переменных все столбцы в кадре данных являются числовыми. Мы удаляем зависимую переменную «выжил» и создаем фрейм данных для функций/предикторов. Стандартный масштабатор применяется для приведения переменных к одному масштабу. Затем мы разделили данные на 80% для обучения и 20% для проверки.

X_features=df.drop(['survived'],axis=1)
sc = StandardScaler()
X = pd.DataFrame(sc.fit_transform(X_features),index=X_features.index,columns=X_features.columns)
y=df['survived']
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,y,test_size=0.2)

Соответствуйте модели нейронной сети

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

# Create model
nn_model=Sequential()
nn_model.add(Dense(5,input_dim=11,activation='relu'))
nn_model.add(Dense(1,activation='sigmoid'))

Последовательная модель Keras представляет собой линейный набор слоев. Слои можно добавлять методом .add(). Класс Dense помогает реализовать операцию добавления. Параметр input_dim имеет количество признаков модели.

Функция активации используется для преобразования входной информации нейрона в выходную. Затем выходные данные используются в качестве входных данных для следующего слоя. Наиболее часто используемыми функциями активации являются сигмовидная, тангенсная, релу и линейная. Сигмоидальная функция имеет форму f(x)=1/1+e^(-x) и имеет диапазон от 0 до 1. Функция Tanh имеет форму, аналогичную сигмоидной функции, но диапазон находится в диапазоне от -1 до 1. Tanh имеет форму функции tanh(x)=2sigmoid(2x)-1. Функция Relu имеет вид f(x)=max(0,x) и имеет диапазон от 0 до бесконечности. Relu — самая популярная функция активации.

Для первого слоя у нас есть 5 нейронов и relu в качестве функции активации. Для выходного слоя у нас есть 1 нейрон и сигмоид в качестве функции активации. Сигмоидальная функция обычно используется для бинарного предсказания.

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

Перед обучением модели мы используем метод компиляции для настройки процесса обучения.

Функция потерь является одним из обязательных аргументов. Он измеряет разницу между прогнозируемым значением и фактическим значением. Функция потерь — это цель, которую модель пытается минимизировать. Кросс-энтропия обычно используется для классификации.

Оптимизатор — еще один аргумент, необходимый для компиляции модели Keras. Это помогает настроить веса и найти веса, которые минимизируют погрешность. Градиент достойный является основой алгоритма оптимизации. Stochastic Gradient Decent (SGD), AdaDelta, AdaGrad, RMSProp и Adam входят в число популярных оптимизаторов.

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

Точность — это метрика для моделей классификации. Он измеряет процент правильных прогнозов.

#Fit the model
nn_model.fit(X_train,y_train, epochs=150,batch_size=100,verbose=0)

Модели Keras обучаются на массивах входных данных и меток Numpy. Для обучения нашей модели выживания Титаника мы будем использовать функцию fit. Эпоха — это один проход по всему обучающему набору данных. Мы устанавливаем число эпох равным 150, что означает, что набор данных моделирования проходит процесс обучения 150 раз, чтобы обновить веса модели. Batch_size — количество обучающих записей за один проход. Чем больше размер пакета, тем больше памяти требуется. У нас есть 834 записи в наборе обучающих данных. Размер партии, равный 100, дает нам 8 групп со 100 записями и 1 группу с 34 записями. Для завершения 1 эпохи требуется 9 итераций.

Предсказание модели и перекрестная оценка

#Make prediction
y_test_predict=nn_model.predict_classes(X_test)
print (accuracy_score(y_test,y_test_predict))

После подгонки модели мы загрузили X_test в модель и сделали прогнозы. Точность_оценки выдает процент правильных прогнозов.

#Confusion matrix
unique_label = np.unique(y_test)
print(pd.DataFrame(confusion_matrix(y_test, y_test_predict, labels=unique_label), 
                   index=['true:{:}'.format(x) for x in unique_label], 
                   columns=['pred:{:}'.format(x) for x in unique_label]))

Матрица путаницы также описывает прогностическую точность модели классификации. Это таблица с подсчетом правильных и неправильных прогнозов для каждого класса. Процент правильных прогнозов из матрицы путаницы должен совпадать с числом, которое будет получено из аккуратности_оценки.

Ссылка

https://keras.io/