В этой статье я объясню нейронные сети и то, как вы можете создавать нейронные сети в R. Во-первых, я должен кратко объяснить нейронные сети.

Нейронные сети

Что такое нейронная сеть? Нейронная сеть — это система, в которой вы принимаете входные данные с числовыми и категориальными данными и передаете их в некоторые узлы. Эти узлы находятся в слоях, и в этих узлах к этим входным параметрам применяются простые математические процедуры. После этого вы можете применить другие слои для более детальной работы.

Как видите, есть три основных слоя. Вход, Скрытый и Выход. Выходные данные могут измениться, если случай классификации больше, чем 2 класса.

Как работают нейронные сети?



В этой статье кратко объясняются операции и рабочий процесс нейронных сетей. Кроме того, я объясню это тоже.

Общее дело вот в чем:

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





Этот процесс называется прямым распространением. После этого происходит обратное распространение для подбора весов. Таким образом, наша нейронная сеть могла работать легко.

Обратное распространение

Это простой процесс обновления веса. С цепным правилом из дифференциальных уравнений оно обновляется в сети.

Новый вес = старый вес — производная скорость * скорость обучения

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



Вы можете увидеть в этой статье простые шаги.

Нормализация перед глубоким обучением



Зачем нужна нормализация?

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

Это не сложно, хотя вы должны сначала соответствующим образом нормализовать переменные.

Если вы не нормализуете свои значения, алгоритм не сможет работать должным образом и выдаст ошибку. Вот почему это важно.

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

library(ISLR)
library("caret")
attach(Carseats)
library(tidyverse)
library("keras")
library(neuralnet)
library(Hmisc)
library(caret)
names(Carseats)

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

normalize <- function(x) {
  return ((x - min(x)) / (max(x) - min(x)))
}
data <- Carseats[complete.cases(Carseats), ]
data <- data %>% select_if(is.numeric)
dfNorm <- as.data.frame(lapply(data, normalize))

Нормализация — это минимальная нормализация. Он дает вам значения от 0 до 1. Таким образом, вы нормализуете значения в 0–1. После того, как complete.cases дает значения, отличные от na. Select_if, как следует из названия, выбирает, являются ли данные числовыми в этом столбце. Затем применяется функция нормализации с помощью функции lapply.

Далее проводится выборка.

n = nrow(Carseats)
smp_size <- floor(0.7 * n) # 
set.seed(123) 
index<- sample(seq_len(n),size = smp_size)
train <- dfNorm[index,]
test <- dfNorm[-index,]

Сначала я беру номер строки данных Carseats в переменную n. Затем я создаю размер выборки равным 70%. Затем установка семени предназначена для создания корня для рандомизации. Smaple дает случайное число 70%. Так что я могу выбрать их с помощью after и отправить их на обучение и тестирование. Вы можете посмотреть некоторые операции R в Интернете.

Я смотрю первые 5 коррелированных значений для обучения нейронной сети

corrTrain <- cor(train) # Select best 5 correlated values.
library(corrplot)
corrplot(corrTrain, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)

Соотношение для выбора. Если вы выберете наиболее коррелированные значения для вашего процесса машинного обучения, вы достигнете наивысшей логической точности.

nn=neuralnet(Sales~Income+Advertising+Population+Price+Age,data=train, hidden=10,act.fct = "logistic",
             linear.output = TRUE,stepmax=10^5,threshold = 0.01)

Итак, как вы можете видеть в модели, я выбираю Доход, Реклама, Население, Цена и Возраст.

Для числовых значений вы можете изменить функцию linear.output.

Также вы можете изменить свои скрытые слои, указав числа в векторе, как это

nn=neuralnet(Sales~Income+Advertising+Population+Price+Age,data=train, hidden=c(7,6,5),act.fct = "logistic",
             linear.output = TRUE,stepmax=10^5,threshold = 0.01)
hidden=c(7,6,5)

Как видите, я установил скрытые слои как 7,6,5. Сюжет этого таков:

С этим скрытым слоем ошибка предсказания не меняется.

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

Predict=compute(nn,test)
Predict$net.result
RMSE <- function(actual,predicted) {
  return(sqrt(sum(actual^2-predicted^2)/length(actual)))
}
Predict <- is.numeric(Predict)
RMSE(test$Sales,Predict)

Rmse — метод ошибок из статистики. Вы просто берете разницу между реальными и прогнозируемыми значениями. Однако для отрицательных значений вы берете квадраты из них, а затем делите N на количество значений.

Ошибка 0.5087188. Я думаю, это неплохо.

Спасибо за чтение, хорошего дня.