【发布时间】:2017-10-20 22:04:14
【问题描述】:
我是机器学习的新手,这是第一个在现实世界中面临挑战的 ML 任务。
一些实验数据包含512个独立的布尔特征和一个布尔结果。
提供的数据集中大约有1e6条真实实验记录。
在一个经典的 XOR 示例中,需要 4 个可能的状态中的所有 4 个来训练 NN。就我而言,它唯一的2^(10-512) = 2^-505 接近于零。
我没有关于数据性质的更多信息,只有这些(512 + 1) * 1e6 位。
在可用数据上尝试了 1 个隐藏层的 NN。即使是来自训练集的样本上经过训练的 NN 的输出也总是接近于 0,而不是接近于“1”。玩过权重初始化,梯度下降学习率。
我的code 使用 TensorFlow 1.3、Python 3。模型摘录:
with tf.name_scope("Layer1"):
#W1 = tf.Variable(tf.random_uniform([512, innerN], minval=-2/512, maxval=2/512), name="Weights_1")
W1 = tf.Variable(tf.zeros([512, innerN]), name="Weights_1")
b1 = tf.Variable(tf.zeros([1]), name="Bias_1")
Out1 = tf.sigmoid( tf.matmul(x, W1) + b1)
with tf.name_scope("Layer2"):
W2 = tf.Variable(tf.random_uniform([innerN, 1], minval=-2/512, maxval=2/512), name="Weights_2")
#W2 = tf.Variable(tf.zeros([innerN, 1]), name="Weights_2")
b2 = tf.Variable(tf.zeros([1]), name="Bias_2")
y = tf.nn.sigmoid( tf.matmul(Out1, W2) + b2)
with tf.name_scope("Training"):
y_ = tf.placeholder(tf.float32, [None,1])
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(
labels = y_, logits = y)
)
train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)
with tf.name_scope("Testing"):
# Test trained model
correct_prediction = tf.equal( tf.round(y), tf.round(y_))
# ...
# Train
for step in range(500):
batch_xs, batch_ys = Datasets.train.next_batch(300, shuffle=False)
_, my_y, summary = sess.run([train_step, y, merged_summaries],
feed_dict={x: batch_xs, y_: batch_ys})
我怀疑两种情况:
- 我的错 - NN 实现错误,架构错误;
- 错误数据。与 XOR 示例相比,不完整的训练数据会导致 NN 失败。但是,提供给经过训练的 NN 的训练示例应该能够给出正确的预测,不是吗?
如何评估是否有可能在提供的数据上训练神经网络(2 层感知器)来预测结果?一个可接受集合的例子是 XOR 例子。反对一些随机噪音。
【问题讨论】:
-
我不会倾向于将神经网络用于仅包含布尔输入的数据。
-
@GordonLinoff 在这种情况下有什么更好的方法?
-
我会从决策树开始,然后快速切换到随机森林。根据数据的性质,您可能会使用 SVM(取决于数据的结构),但我认为随机森林可能会做得更好。
-
如果数据完全没有相关性怎么办? IE。实验结果实际上是由功能集之外的其他因素引起的?
-
我同意 Gordon 的评论,但是,我认为您也可以从头开始使用 xgboost 以节省您的时间
标签: machine-learning tensorflow neural-network