带tflearn神经网络的Kaggle Titanic

时间:2018-07-11 09:29:23

标签: python tensorflow machine-learning deep-learning kaggle

我已经通过逻辑回归解决了泰坦尼克号问题,现在我想通过神经网络解决问题。但是我的模型始终返回 1 ,这表示幸存。对于每个测试输入。也许我的模型有问题。我该怎么解决?

train_data = pd.read_csv('data/train.csv')
test_data = pd.read_csv('data/test.csv')

#Some data cleaning process
#......


X_train = train_data.drop("Survived",axis=1).as_matrix()
Y_train = train_data["Survived"].as_matrix().reshape((891,1))
X_test  = test_data.drop("PassengerId",axis=1).as_matrix()


net = tflearn.input_data(shape=[None, 6])
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 1, activation='softmax')
net = tflearn.regression(net)
model = tflearn.DNN(net)
model.fit(X_train, Y_train, n_epoch=10, batch_size=16, show_metric=True)

pred = model.predict(X_test)
print pred

2 个答案:

答案 0 :(得分:3)

在输出中使用softmax作为激​​活层可确保该层中所有节点的输出总和为1。由于您只有一个节点,并且输出总和为1,因此根据定义,它将始终输出1

永远不要将softmax用作二进制分类任务的激活。更好的选择是logistic function,我认为tensorflow称之为sigmoid

所以不是

net = tflearn.fully_connected(net, 1, activation='softmax')

尝试

net = tflearn.fully_connected(net, 1, activation='sigmoid')

答案 1 :(得分:1)

您的问题是二进制分类问题,即有两种可能的结果。 0 or 1。在泰坦尼克号问题Not Survived or Survived中。

神经网络的输出层应产生小于或等于1或大于或等于0的输出。在二进制分类的上下文中,其他任何值都没有意义。

通常将截止位置放置为0.50。如果网的预测输出大于该截止值,则视为1否则为0。

为了使事情像之前所说的那样工作,网络应产生在[0,1]范围内的输出。为此,层(即输出层)的激活功能必须为sigmoid。它产生的输出范围为[0,1]。要了解有关Sigmoid和其他激活功能的更多信息,建议您遵循此link

在您的代码中,您可以这样做。

net = tflearn.fully_connected(net, 1, activation='sigmoid')