📜  神经网络如何用于 R 编程中的回归?

📅  最后修改于: 2022-05-13 01:54:56.142000             🧑  作者: Mango

神经网络如何用于 R 编程中的回归?

神经网络由称为神经元(受人脑神经元启发)的简单输入/输出单元组成。这些输入/输出单元相互连接,每个连接都有一个与之相关的权重。神经网络很灵活,可用于分类和回归。在本文中,我们将看到如何将神经网络应用于回归问题。

回归有助于建立因变量和一个或多个自变量之间的关系。只有当回归方程非常适合数据时,回归模型才能很好地工作。大多数回归模型不能完美地拟合数据。尽管神经网络复杂且计算成本高,但它们很灵活,可以动态选择最佳回归类型,如果这还不够,还可以添加隐藏层以改进预测。

在 R 中逐步实现 Stey

现在让我们在 R 编程中构建一个神经网络来解决回归问题。我们将使用波士顿数据集来预测自住房屋的中值(每 1000 美元)。

第一步:加载数据集如下

R
# Import Required packages
set.seed(500)
library(neuralnet)
library(MASS)
  
# Boston dataset from MASS
data <- Boston


R
# Normalize the data
maxs <- apply(data, 2, max) 
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data, center = mins, 
                              scale = maxs - mins))
  
# Split the data into training and testing set
index <- sample(1:nrow(data), round(0.75 * nrow(data)))
train_ <- scaled[index,]
test_ <- scaled[-index,]


R
# Build Neural Network
nn <- neuralnet(medv ~ crim + zn + indus + chas + nox 
                + rm + age + dis + rad + tax + 
                ptratio + black + lstat, 
                data = train_, hidden = c(5, 3), 
                linear.output = TRUE)
  
# Predict on test data
pr.nn <- compute(nn, test_[,1:13])
  
# Compute mean squared error
pr.nn_ <- pr.nn$net.result * (max(data$medv) - min(data$medv)) 
                                              + min(data$medv)
test.r <- (test_$medv) * (max(data$medv) - min(data$medv)) + 
                                              min(data$medv)
MSE.nn <- sum((test.r - pr.nn_)^2) / nrow(test_)
  
# Plot the neural network
plot(nn)


R
# Plot regression line
plot(test$medv, pr.nn_, col = "red", 
     main = 'Real vs Predicted')
abline(0, 1, lwd = 2)


第 2 步:在将数据输入神经网络之前,最好进行归一化。有多种方法可以执行规范化。我们将使用 min-max 方法并在区间 [0,1] 中缩放数据。然后将数据分成训练集(75%)和测试集(25%)。

电阻

# Normalize the data
maxs <- apply(data, 2, max) 
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data, center = mins, 
                              scale = maxs - mins))
  
# Split the data into training and testing set
index <- sample(1:nrow(data), round(0.75 * nrow(data)))
train_ <- scaled[index,]
test_ <- scaled[-index,]

第 3 步:现在,我们可以使用神经网络创建一个神经网络 图书馆。修改参数并计算均方误差 (MSE)。使用 MSE 最小的参数。我们将使用两个具有 5 个和 3 个神经元的隐藏层。神经元的数量应该在输入层大小和输出层大小之间,通常是输入层大小的2/3。但是,一次又一次地修改和测试神经网络是找到最适合您的模型的参数的最佳方法。当这个神经网络被训练时,它将执行梯度下降来寻找适合数据的系数,直到它达到模型的最佳权重(在这种情况下是回归系数)。

电阻

# Build Neural Network
nn <- neuralnet(medv ~ crim + zn + indus + chas + nox 
                + rm + age + dis + rad + tax + 
                ptratio + black + lstat, 
                data = train_, hidden = c(5, 3), 
                linear.output = TRUE)
  
# Predict on test data
pr.nn <- compute(nn, test_[,1:13])
  
# Compute mean squared error
pr.nn_ <- pr.nn$net.result * (max(data$medv) - min(data$medv)) 
                                              + min(data$medv)
test.r <- (test_$medv) * (max(data$medv) - min(data$medv)) + 
                                              min(data$medv)
MSE.nn <- sum((test.r - pr.nn_)^2) / nrow(test_)
  
# Plot the neural network
plot(nn)

输出:

神经网络用于 R 编程输出中的回归

第 4 步:我们可以在图中看到,黑线表示每层与其权重之间的联系,蓝线表示在每个步骤中添加的偏差。神经网络本质上是一个黑匣子,所以我们不能对权重说太多。

电阻

# Plot regression line
plot(test$medv, pr.nn_, col = "red", 
     main = 'Real vs Predicted')
abline(0, 1, lwd = 2)

输出:

神经网络用于 R 编程输出中的回归

我们可以看到神经网络所做的预测(红色圆圈)通常集中在这条线周围(与这条线完美对齐将表明 MSE 为 0,因此是一个理想的预测)。