我正在尝试运行这段代码,作为关于泰坦尼克号的Kaggle竞赛的练习。这是一个免费且适合初学者的案例。我在这个项目中使用了R语言中的neuralnet包。
这是从网站上获取的训练数据:
train <- read.csv("train.csv")m <- model.matrix( ~ Survived + Pclass + Sex + Age + SibSp, data =train )head(m)
在这里,我根据谁幸存下来来训练神经网络。我想看看我是否能预测谁幸存了:
library(neuralnet)r <- neuralnet( Survived ~ Pclass + Sexmale + Age + SibSp, data=m, hidden=10, threshold=0.01,rep=100)
神经网络已经训练好了。我加载测试数据并为测试做准备。
test=read.csv("test.csv")m2 <- model.matrix( ~ Pclass + Sex + Age + SibSp, data = test )
最终的预测测试:
res= compute(r, m2)
首先,我不知道应该使用多少隐藏神经元。有时候训练时间太长,当我成功时,我无法用测试数据进行测试,因为出现了一个错误,错误信息显示两个数据集不兼容:
res= compute(r, m2)Error in neurons[[i]] %*% weights[[i]] : non-conformable arguments
我在这里做错了什么?
完整的代码如下:
train <- read.csv("train.csv")m <- model.matrix( ~ Survived + Pclass + Sex + Age + SibSp, data =train )head(m)library(neuralnet)r <- neuralnet( Survived ~ Pclass + Sexmale + Age + SibSp, data=m, hidden=10, threshold=0.01,rep=100)test=read.csv("test.csv")m2 <- model.matrix( ~ Pclass + Sex + Age + SibSp, data = test )res= compute(r, m2)
回答:
尝试使用以下代码进行预测:
res = compute(r, m2[,c("Pclass", "Sexmale", "Age", "SibSp")])
这对我来说是有效的,你应该能得到一些输出结果。
看起来发生的情况是:model.matrix
创建了额外的列(如(Intercept)
),这些列并不是用于构建神经网络的数据的一部分,因此在compute
函数中它不知道如何处理这些列。所以解决方案是明确选择在compute
函数中使用的所需列。这是因为neuralnet
试图进行某种矩阵乘法,但矩阵大小不匹配。
关于神经元数量或优化超参数,你可以使用交叉验证和其他方法。如果使用不同的包(如nnet
)是可以接受的,那么你可以使用caret
包来为你确定最佳参数。看起来会像这样:
library(caret)nnet.model <- train(Survived ~ Pclass + Sex + Age + SibSp, data=train, method="nnet")plot(nnet.model)res2 = predict(nnet.model, newdata=test)
超参数的图表如下:
你可以使用caret
包中的confusionMatrix
来衡量性能:
library(neuralnet)library(caret)library(dplyr)train <- read.csv("train.csv")m <- model.matrix( ~ Survived + Pclass + Sex + Age + SibSp, data =train )r <- neuralnet( Survived ~ Pclass + Sexmale + Age + SibSp, data=m, rep=20)res = neuralnet::compute(r, m[,c("Pclass", "Sexmale", "Age", "SibSp")])pred_train = round(res$net.result)# 仅筛选出有生存预测的记录,由于某些原因,并非所有记录都被预测;pred_rowid <- as.numeric(row.names(pred_train))train_survived <- train %>% filter(row_number(Survived) %in% pred_rowid) %>% select(Survived)confusionMatrix(as.factor(train_survived$Survived), as.factor(pred_train))
输出结果如下:
Confusion Matrix and Statistics ReferencePrediction 0 1 0 308 128 1 164 114 Accuracy : 0.5910364 95% CI : (0.5539594, 0.6273581) No Information Rate : 0.6610644 P-Value [Acc > NIR] : 0.99995895 Kappa : 0.119293 Mcnemar's Test P-Value : 0.04053844 Sensitivity : 0.6525424 Specificity : 0.4710744 Pos Pred Value : 0.7064220 Neg Pred Value : 0.4100719 Prevalence : 0.6610644 Detection Rate : 0.4313725 Detection Prevalence : 0.6106443 Balanced Accuracy : 0.5618084 'Positive' Class : 0