Keras: Точность проверки остается той же самой, но потери проверки уменьшаются - PullRequest
0 голосов
/ 03 мая 2020

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

import pandas as pd
dataset = pd.read_csv('political_tweets.csv')
dataset.head()
dataset = pd.read_csv('political_tweets.csv')["tweet"].values
y_train = pd.read_csv('political_tweets.csv')["dem_or_rep"].values

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(dataset, y_train, test_size=0.1)

max_words = 10000
print(max_words)
max_len = 25

tokenizer = Tokenizer(num_words = max_words, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n1234567890', lower=False,oov_token="<OOV>")

tokenizer.fit_on_texts(x_train)
x_train = tokenizer.texts_to_sequences(x_train)
x_train = pad_sequences(x_train, max_len, padding='post', truncating='post')

tokenizer.fit_on_texts(x_test)
x_test = tokenizer.texts_to_sequences(x_test)
x_test = pad_sequences(x_test, max_len, padding='post', truncating='post')

И моя модель:

model = Sequential([
    Embedding(max_words+1,64,input_length=max_len),
    Bidirectional(GRU(64, return_sequences = True), merge_mode='concat'),
    GlobalMaxPooling1D(),
    Dense(64,kernel_regularizer=regularizers.l2(0.02)),
    Dropout(0.5),
    Dense(1, activation='sigmoid'),

])
model.summary()

model.compile(loss='binary_crossentropy', optimizer=RMSprop(learning_rate=0.0001), metrics=['accuracy'])
model.fit(x_train,y_train, batch_size=128, epochs=500, verbose=1, shuffle=True, validation_data=(x_test, y_test))

Обе мои потери уменьшаются, моя точность обучения увеличивается, но точность проверки остается на уровне 50% (что это ужасно, учитывая, что я делаю бинарную модель классификации).

Epoch 1/500
546/546 [==============================] - 35s 64ms/step - loss: 1.7385 - accuracy: 0.5102 - val_loss: 1.2458 - val_accuracy: 0.5102
Epoch 2/500
546/546 [==============================] - 34s 62ms/step - loss: 0.9746 - accuracy: 0.5137 - val_loss: 0.7886 - val_accuracy: 0.5102
Epoch 3/500
546/546 [==============================] - 34s 62ms/step - loss: 0.7235 - accuracy: 0.5135 - val_loss: 0.6943 - val_accuracy: 0.5102
Epoch 4/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6929 - accuracy: 0.5135 - val_loss: 0.6930 - val_accuracy: 0.5102
Epoch 5/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6928 - accuracy: 0.5135 - val_loss: 0.6931 - val_accuracy: 0.5102
Epoch 6/500
546/546 [==============================] - 34s 62ms/step - loss: 0.6927 - accuracy: 0.5135 - val_loss: 0.6931 - val_accuracy: 0.5102
Epoch 7/500
546/546 [==============================] - 37s 68ms/step - loss: 0.6925 - accuracy: 0.5136 - val_loss: 0.6932 - val_accuracy: 0.5106
Epoch 8/500
546/546 [==============================] - 34s 63ms/step - loss: 0.6892 - accuracy: 0.5403 - val_loss: 0.6958 - val_accuracy: 0.5097
Epoch 9/500
546/546 [==============================] - 35s 63ms/step - loss: 0.6815 - accuracy: 0.5633 - val_loss: 0.7013 - val_accuracy: 0.5116
Epoch 10/500
546/546 [==============================] - 34s 63ms/step - loss: 0.6747 - accuracy: 0.5799 - val_loss: 0.7096 - val_accuracy: 0.5055

Я видел другие посты на эту тему c, и они говорят, чтобы добавить отсев, кросс-энтропию, уменьшить скорость обучения, и т. д. c. Я сделал все это, и ничего из этого не работает. Любая помощь очень ценится. Заранее спасибо!

1 Ответ

2 голосов
/ 03 мая 2020

Несколько замечаний по вашей проблеме:

  1. Хотя я не особенно знаком с набором данных, я верю, что он используется во многих случаях без проблем. Тем не менее, вы можете попытаться проверить его баланс. В train_test_split() есть параметр, называемый stratify, который, если подать y, обеспечит одинаковое количество выборок для каждого класса в тренировочном наборе и пропорциональном тестовом наборе.
  2. Ваше явление с потеря проверки и точность проверки не являются чем-то необычным. Представьте себе, что в первые эпохи нейронная сеть рассматривает некоторые наземные правдоподобные примеры (ys) с GT == 1 с вероятностью 55%. В то время как обучение продвигается вперед, нейронная сеть учится лучше, и теперь она на 90% уверена в случае положительного истинного примера (ys) с GT == 1. Поскольку порог для вычисления точности составляет 50% , в обеих ситуациях у вас одинаковая точность. Тем не менее, потери значительно изменились, так как 90% >> 55%.
  3. Ваша тренировка, кажется, продвигается (медленно, но верно). Рассматривали ли вы использование ADAM в качестве готового оптимизатора?
  4. Если низкая точность все еще сохраняется в течение некоторой эпохи, вы вполне можете страдать от хорошо известного явления, называемого недостаточное оснащение , в котором ваша модель не может захватить зависимости между вашими данными. Чтобы вообще уменьшить / избежать недостаточного подгонки, вы можете использовать более сложную модель (2 LSTM / 2 GRU).
  5. Повторите шаги предварительной обработки набора данных. Убедитесь, что предложения преобразованы правильно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...