Kaggle 泰坦尼克号与 tflearn 神经网络
Kaggle Titanic with tflearn neural network
我已经用逻辑回归解决了泰坦尼克号问题,现在我想用神经网络解决这个问题。但是我的模型总是return1,也就是说幸存。对于每个测试输入。也许我的模型有问题。我该如何解决这个问题?
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
在输出中使用 softmax 作为激活层可确保该层中所有节点的输出总和为 1
。由于您只有一个节点,并且输出总和必须为 1
,因此根据定义它将始终输出 1
。
永远不要使用 softmax 作为二元分类任务的激活。更好的选择是 logistic function, which I think tensorflow calls sigmoid.
所以不用
net = tflearn.fully_connected(net, 1, activation='softmax')
尝试
net = tflearn.fully_connected(net, 1, activation='sigmoid')
您的问题是二元分类问题,即有 2 种可能的结果。 0 or 1
。在泰坦尼克号问题的背景下 Not Survived or Survived
。
神经网络的输出层应产生小于或等于 1 或大于或等于 0 的输出。在二进制分类的上下文中没有其他值有意义。
通常会像 0.50
那样放置截止值。如果网络的预测输出大于那个cutoff,则视为1 else 0.
为了让事情像之前所说的那样工作,网络应该产生 [0, 1] 范围内的输出。为此,层(即输出层)的激活函数必须为 sigmoid
。它产生 [0, 1] 范围内的输出。要了解有关 sigmoid 和其他激活函数的更多信息,我建议您遵循此 link.
在您的代码中,您可以这样做。
net = tflearn.fully_connected(net, 1, activation='sigmoid')
我已经用逻辑回归解决了泰坦尼克号问题,现在我想用神经网络解决这个问题。但是我的模型总是return1,也就是说幸存。对于每个测试输入。也许我的模型有问题。我该如何解决这个问题?
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
在输出中使用 softmax 作为激活层可确保该层中所有节点的输出总和为 1
。由于您只有一个节点,并且输出总和必须为 1
,因此根据定义它将始终输出 1
。
永远不要使用 softmax 作为二元分类任务的激活。更好的选择是 logistic function, which I think tensorflow calls sigmoid.
所以不用
net = tflearn.fully_connected(net, 1, activation='softmax')
尝试
net = tflearn.fully_connected(net, 1, activation='sigmoid')
您的问题是二元分类问题,即有 2 种可能的结果。 0 or 1
。在泰坦尼克号问题的背景下 Not Survived or Survived
。
神经网络的输出层应产生小于或等于 1 或大于或等于 0 的输出。在二进制分类的上下文中没有其他值有意义。
通常会像 0.50
那样放置截止值。如果网络的预测输出大于那个cutoff,则视为1 else 0.
为了让事情像之前所说的那样工作,网络应该产生 [0, 1] 范围内的输出。为此,层(即输出层)的激活函数必须为 sigmoid
。它产生 [0, 1] 范围内的输出。要了解有关 sigmoid 和其他激活函数的更多信息,我建议您遵循此 link.
在您的代码中,您可以这样做。
net = tflearn.fully_connected(net, 1, activation='sigmoid')