gpt4 book ai didi

r - 为什么神经网络在一个简单的分类案例中失败

转载 作者:行者123 更新时间:2023-12-04 12:52:31 24 4
gpt4 key购买 nike

我有下面的代码,其中形成了一个简单的基于规则的分类数据集:

# # Data preparation
data = data.frame(A = round(runif(100)), B = round(runif(100)), C = round(runif(100)))
# Y - is the classification output column
data$Y = ifelse((data$A == 1 & data$B == 1 & data$C == 0), 1, ifelse((data$A == 0 & data$B == 1 & data$C == 1), 1, ifelse((data$A == 0 & data$B ==0 & data$C == 0), 1, 0)))
# Shuffling the data set
data = data[sample(rownames(data)), ]

我将数据集划分为训练和测试,以便我可以在测试集上验证我的结果:
# # Divide into train and test
library(caret)
trainIndex = createDataPartition(data[, "Y"], p = .7, list = FALSE, times = 1) # for balanced sampling
train = data[trainIndex, ]
test = data[-trainIndex, ]

我尝试构建一个简单的神经网络,其中隐藏层中的神经元数量是通过循环选择的(如前所述 here)
# # Build a neural net
library(neuralnet)
for(alpha in 2:10)
{
nHidden = round(nrow(train)/(alpha*(3+1)))
nn = neuralnet(Y ~ A + B + C, train, linear.output = F, likelihood = T, err.fct = "ce", hidden = nHidden)

# Calculate Mean Squared Error for Train and Test
trainMSE = mean((round(nn$net.result[[1]]) - train$Y)^2)
testPred = round(compute(nn,test[-length(ncol(test))])$net.result)
testMSE = mean((testPred - test$Y)^2)

print(paste("Train Error: " , round(trainMSE, 4), ", Test Error: ", round(testMSE, 4), ", #. Hidden = ", nHidden, sep = ""))
}

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 9"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 6"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 4"

[1] "Train Error: 0, Test Error: 0.6, #. Hidden = 4"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 3"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 2"

[1] "Train Error: 0.0857, Test Error: 0.6, #. Hidden = 2"

[1] "Train Error: 0.1429, Test Error: 0.8333, #. Hidden = 2"

[1] "Train Error: 0.0857, Test Error: 0.6, #. Hidden = 2"



它给出的过拟合结果很差。但是,当我在同一个数据集上构建了一个简单的随机森林时。我得到的火车和测试错误为 - 0
# # Build a Random Forest
trainRF = train
trainRF$Y = as.factor(trainRF$Y)
testRF = test

library(randomForest)
rf = randomForest(Y ~ ., data = trainRF, mtry = 2)

# Calculate Mean Squared Error for Train and Test
trainMSE = mean((round(rf$votes[,2]) - as.numeric(as.character(trainRF$Y)))^2)
testMSE = mean((round(predict(rf, testRF, type = "prob")[,2]) - as.numeric(as.character(testRF$Y)))^2)

print(paste("Train Error: " , round(trainMSE, 4), ", Test Error: ", round(testMSE, 4), sep = ""))

[1] "Train Error: 0, Test Error: 0"



请帮助我理解为什么神经网络在随机森林以 100% 准确率工作的简单情况下失败。

注:我只使用了一个隐藏层(假设一个隐藏层足以进行这种简单的分类)并迭代隐藏层中的神经元数量。

另外,如果我对神经网络参数的理解有误,请帮助我。

完整代码可见 here

最佳答案

一个类似的问题一直在追捕我一段时间,所以我尝试了解您的数据和问题并将它们与我的进行比较。不过,最后,这只是这一行中的一个小错误:

testPred = round(compute(nn,test[-length(ncol(test))])$net.result)

您选择 B , CY用于预测,而不是 A , BC , 因为 length(ncol(something))将始终返回 1。您只需要 test[-ncol(test)] .
> summary(test[-length(ncol(test))])

B C Y
Min. :0.00 Min. :0.0 Min. :0.0000000
1st Qu.:0.00 1st Qu.:0.0 1st Qu.:0.0000000
Median :0.00 Median :0.5 Median :0.0000000
Mean :0.48 Mean :0.5 Mean :0.3766667
3rd Qu.:1.00 3rd Qu.:1.0 3rd Qu.:1.0000000
Max. :1.00 Max. :1.0 Max. :1.0000000

关于r - 为什么神经网络在一个简单的分类案例中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38561907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com