Бинарная классификация рекуррентных нейронных сетей - PullRequest
0 голосов
/ 21 января 2019

У меня есть доступ к кадру данных из 100 человек и тому, как они выполнили определенный тест на движение.Этот кадр содержит около 25 000 строк на человека, поскольку производительность этого человека отслеживается (приблизительно) каждую центсекунду (10 ^ -2).Мы хотим использовать эти данные для прогнозирования двоичной y-метки, то есть, если у кого-то есть проблемы с двигателем или нет.

Столбцы и некоторые значения набора данных следующие:

'Person_ID', 'time_in_game', 'python_time', 'permutation_game, 'round', 'level', 'times_level_played_before', 'speed', 'costheta', 'y_label', 'gender', 'age_precise', 'ax_f', 'ay_f', 'az_f', 'acc', 'jerk'
1,            0.25,           1.497942e+09,  2,                 1,      'level_B', 1,                           0.8,    0.4655,    1,         [...]

Я уменьшил набор данных до 480 строк на человека, просто используя строки в каждой половине секунды.

Теперь я хочу использовать рекуррентную нейронную сеть для прогнозирования двоичного y_label.

Этот код извлекает функцию costheta, используемую для входных данных X, и метку y для вывода Y.

X = []
Y = []

for ID in person_list:
    person_frame = df.loc[df['Person_ID'] == Person_ID]

    # costheta is a measurement of performance
    coslist = list(person_frame['costheta'])

    # extract y-label
    score = list(person_frame['y_label'].head(1))[0]

    X.append(coslist)
    Y.append(binary)

Я разделил данные на данные обучения и тестирования, используя тест 0,2Трещина.Затем я попытался создать RNN с Keras следующим образом:

from keras import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout

embedding_size=32
model=Sequential()

# different_input_values are the set of possible input values
model.add(Embedding(different_input_values, embedding_size, input_length=480))
model.add(LSTM(1000))

# output is binary
model.add(Dense(1, activation='sigmoid'))
print(model.summary())

Наконец-то я начал тренироваться с этим кодом:

model.compile(loss='binary_crossentropy', 
             optimizer='adam', 
             metrics=['accuracy'])

batch_size = 64
num_epochs = 100

X_valid, y_valid = X_train[:batch_size], Y_train[:batch_size]
X_train2, y_train2 = X_train[batch_size:], Y_train[batch_size:]

model.fit(X_train2, y_train2, validation_data=(X_valid, y_valid), batch_size=batch_size, epochs=num_epochs).

Однако полученная точность действительно низкая.В зависимости от размера партии оно варьируется от 0,4 до 0,6.

12/12 [====================================] - 13 с 1 с / шаг -потеря: 0,6921 - в соответствии: 0,7500 - val_loss: 0,7069 - val_acc: 0,4219

В общем, у меня такой сложный вопрос: как эффективно обучить RNN?Стоит ли воздерживаться от сокращения данных до 480 строк на человека и держать их около 25 000 строк на человека?Могут ли многочисленные показатели, такие как acc (ускорение в игре) и jerk, вызвать значительный прирост точности?Какие значительные улучшения можно изменить и рассмотреть?

...