Το πρόβλημα
Χρησιμοποιώ έναν DNNClassifier στο Tensorflow και δεν μπορώ ποτέ να πάρω την απώλειά μου κάτω από περίπου 60 και την ακρίβεια δοκιμής πάνω από περίπου 40%. Είχα ένα πρόβλημα πριν, όπου η ακρίβεια της δοκιμής μου ήταν σχεδόν νεκρή στο 25%, αλλά μετά την κανονικοποίηση όλων των εισόδων μου, μπόρεσα να αυξήσω λίγο την ακρίβεια της δοκιμής μου, αλλά όχι πολύ.
Τα δεδομένα
Το μόνο που χρειάζεται να ξέρετε για τα δεδομένα είναι ότι έχω περίπου 127.000 αρχεία δεδομένων για το ποσοστό εγκληματικότητας. 15 χαρακτηριστικά και μία ετικέτα. Ο σκοπός του δικτύου είναι να τα ταξινομήσει στο σωστό τεταρτημόριο πληθυσμού (το οποίο βασίζεται στον πληθυσμό κάθε νομού) Άρα η ετικέτα εξόδου είναι μόνο 4 τάξεις (0-3).
Ο κωδικός
import pandas as pd
import tensorflow as tf
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
csv_path = dir_path + "/testing.csv"
CSV_COLUMN_NAMES = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', 'Quartile']
def load_data():
all = pd.read_csv(csv_path, names=CSV_COLUMN_NAMES, header=0).sample(frac=1)
x = all.drop(['Quartile'], axis=1)
y = all[['Quartile']].copy()
size = x.shape[0]
cutoff = int(0.75*size)
train_x = x.head(cutoff)
train_y = y.head(cutoff)
test_x = x.tail(size-cutoff)
test_y = y.tail(size-cutoff)
return (train_x, train_y), (test_x, test_y)
def train_input_fn(features, labels, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset
def eval_input_fn(features, labels, batch_size):
features=dict(features)
if labels is None:
inputs = features
else:
inputs = (features, labels)
dataset = tf.data.Dataset.from_tensor_slices(inputs)
assert batch_size is not None, "batch_size must not be None"
dataset = dataset.batch(batch_size)
return dataset
def main(argv):
batch_size = 50
(train_x, train_y), (test_x, test_y) = load_data()
my_feature_columns = []
for key in train_x.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
optimizer=tf.train.GradientDescentOptimizer(0.001),
n_classes=4)
# training
classifier.train(
input_fn=lambda:train_input_fn(train_x, train_y, batch_size), steps=5000)
# testing
eval_result = classifier.evaluate(
input_fn=lambda:eval_input_fn(test_x, test_y, batch_size))
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
if __name__ == '__main__':
tf.logging.set_verbosity(tf.logging.INFO)
tf.app.run(main)
Τι έχω δοκιμάσει
- Μπλέκομαι με το ρυθμό εκμάθησής μου στο βελτιστοποιητή gradient descent
- Αλλαγή της μείωσης της απώλειας σε
MEAN
αντί γιαSUM
που έχει οριστεί από προεπιλογή - Αλλάζω το μέγεθος του βήματος μου (μέχρι 100000 ακόμη!)
- Δοκιμάζοντας μόνο ένα κρυφό στρώμα (μέγεθος: 10) και δύο κρυφά επίπεδα (μέγεθος: 90 το καθένα)
Ήλπιζα ότι θα μπορούσατε να προτείνετε οποιουσδήποτε πιθανούς λόγους για τους οποίους το νευρωνικό δίκτυό μου φαίνεται να καθυστερεί. Ευχαριστώ!