如何在关于泰坦尼克号的Kaggle竞赛中使用R语言的neuralnet包

我正在尝试运行这段代码,作为关于泰坦尼克号的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)

超参数的图表如下:

enter image description here


你可以使用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    

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注