Ich bin ein Neuling zum maschinellen Lernen und dies ist eine der ersten echten ML Aufgaben.Wie kann man herausfinden, ob ein Datensatz ein neuronales Netzwerk trainieren kann?
Einige experimentelle Daten enthalten 512 unabhängige boolesche Funktionen und ein boolesches Ergebnis.
Es gibt ungefähr 1e6 reale Experimentdatensätze in dem bereitgestellten Datensatz.
In einem klassischen XOR-Beispiel werden alle 4 von 4 möglichen Zustände benötigt, um NN zu trainieren. In meinem Fall ist es nur 2^(10-512) = 2^-505
, die nahe bei Null ist.
Ich habe keine weiteren Informationen über die Daten Natur, nur diese (512 + 1) * 1e6
Bits.
Versuchte NN mit 1 versteckter Schicht auf verfügbaren Daten. Die Ausgabe der trainierten NN auf den Samples selbst aus dem Trainingssatz ist immer nahe 0, keine einzige nahe "1". Gespielt mit Gewichten Initialisierung, Gradienten-Lernrate.
Mein code Verwendung TensorFlow 1.3, Python 3. Modell Auszug:
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})
Ich vermute, zwei Fälle:
- meine Schuld - schlecht NN Implementierung, falsche Architektur;
- schlechte Daten. Verglichen mit dem XOR-Beispiel würden unvollständige Trainingsdaten zu einem fehlerhaften NN führen. Aber die Trainingsbeispiele, die dem trainierten NN gegeben werden, sollen richtige Vorhersagen geben, nicht wahr?
Wie zu beurteilen, ob es überhaupt möglich ist, ein neuronales Netz (ein 2-lagige perceptron) auf den zur Verfügung gestellten Daten zu trainieren um das Ergebnis zu prognostizieren? Ein Fall einer annehmbaren Menge wäre das XOR-Beispiel. Im Gegensatz zu einigen zufälligen Lärm.
Ich wäre nicht geneigt, ein neuronales Netzwerk für Daten zu verwenden, die nur aus booleschen Eingängen bestehen. –
@GordonLinoff Was ist ein besserer Ansatz in diesem Fall? – Serge
Ich würde mit einem Entscheidungsbaum beginnen und schnell zu zufälligen Gesamtstrukturen wechseln. Abhängig von der Art der Daten haben Sie möglicherweise Glück mit SVMs (abhängig von der Struktur der Daten), aber ich denke, zufällige Gesamtstrukturen würden wahrscheinlich einen besseren Job machen. –