2017-10-20 170 views
0

我是一个机器学习的新手,这是第一个真正的ML任务挑战之一。如何查找数据集是否可以训练神经网络?

一些实验数据包含512个独立的布尔特征和一个布尔结果。

在提供的数据集中有大约1e6个实验实验记录。

在经典的XOR示例中,需要4种可能状态中的4种来训练NN。在我的情况下,它只有2^(10-512) = 2^-505接近零。

我没有关于数据性质的更多信息,只是这些(512 + 1) * 1e6位。

在可用数据上尝试了带有1个隐藏层的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}) 

我怀疑两种情况:

  1. 我的错 - 坏NN执行,错误的体系结构;
  2. 坏数据。与XOR示例相比,不完整的训练数据会导致NN失败。然而,训练样本喂给训练好的神经网络应该给出正确的预测,不是吗?

如何评价如果有可能在所有所提供的数据训练神经网络(2层感知)来预测结果?一个可胜任的例子将是XOR例子。反对一些随机噪音。

+0

我不会倾向于使用神经网络来处理仅由布尔输入组成的数据。 –

+0

@GordonLinoff在这种情况下什么是更好的方法? – Serge

+2

我会从决策树开始,然后迅速切换到随机森林。根据数据的性质,您可能对SVM有好运(取决于数据结构),但我认为随机森林可能会做得更好。 –

回答

1

只有特别的方法才能知道是否可以从数据集中学习具有可微分网络的函数。也就是说,这些特殊的方式通常是有效的。例如,网络应该能够在没有任何正规化的情况下过度训练集合。

衡量这一点的常用技术是仅将网络适合整个数据集的一个子集。检查网络是否可以过度适应,然后增加子集的大小,并增加网络的大小。不幸的是,决定是否添加额外的图层或在隐藏层中添加更多单位是一个你必须做的任意决定。

然而,看着你的代码,也有可能是错这里发生了几件事情:

  1. 是你的产出平衡?我的意思是,你在数据集目标中的数目是否与0相同?
  2. 你在第一层的初始化全部为零,这个梯度将为零,所以它不能学习任何东西(尽管你有一个真正的初始化,它被注释掉了)。
  3. Sigmoid非线性比简单的非线性更难以优化,如ReLUs。

我建议使用Tensorflow的built-in definitions for layers不用担心初始化,并且在任何隐藏层切换到ReLUs(你需要乙状结肠在输出为您的布尔目标)。

最后,由于缺乏结构,深度学习在大多数“特征”机器学习问题中并不是很好。例如,这些功能的顺序无关紧要。其他方法往往效果更好,但如果你真的想深入学习,那么你可以看看this recent paper,通过使用非常特定的非线性和权重初始化(在上面的代码中更改4行)来显示改进的性能。

+0

1.输出是均衡的,验证过的。 2.确定我已经尝试了随机正常的初始化以及; 尝试随机森林现在,它需要很长时间。等待第一批结果,而CPU百分百加载并且球迷大声朗读。 – Serge

+0

你可能想尝试朴素贝叶斯,因为你有布尔输入和目标。与随机森林相比,它的运行速度要快得多([封闭形式和线性时间](https://en.wikipedia.org/wiki/Naive_Bayes_classifier)),并且在条件独立性假设下是最优的。 –

+0

再次感谢!大约1小时的CPU加热后,随机森林最终的精确度为0.5239。 [尝试朴素贝叶斯](https://gist.github.com/sergiks/f3197087b53eeca153b9c4cad3e25a7e),其中0.47的准确性。或者我做错了什么,或者数据对于ML算法来说是不可靠的。 – Serge