我已经通过逻辑回归解决了泰坦尼克号问题,现在我想通过神经网络解决问题。但是我的模型始终返回 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
答案 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')