Модель LSTM на этикетке 3 класса как проблема классификации - PullRequest
0 голосов
/ 21 июня 2020

Моя проблема состоит в том, чтобы предсказать результат, имеющий 3 метки класса. Допустим, у меня есть 20000 выборок в моем наборе данных, причем каждый образец связан с меткой (0,1,2). Поскольку это проблема мультиклассовой классификации.

Могу ли я вводить в сеть только метки, которые являются (0, 1,2), и получать прогноз на основе меток. Достаточно ли данных, передаваемых в сеть, для изучения и прогнозирования выходных данных?

Пожалуйста, помогите мне с вашими входными данными

# Below is the code
X_train, X_test, y_train, y_test = train_test_split(values_train[:, 0], 
                                                    values_train[:, 1], 
                                                    test_size=0.25, 
                                                    random_state=42)
print(" X Training Set size is",X_train.shape )
print(" y Training Set size is",y_train.shape  )
print(" X Test Set size is",X_test.shape)
print(" y Test Set size is",y_test.shape )
'X Training Set size is (165081,)'
'y Training Set size is (165081,)'
'X Test Set size is (55028,)'
'y Test Set size is (55028,)'
# convert to LSTM friendly format
X_train = X_train.reshape(len(X_train),1, 1)
X_test = X_test.reshape(len(X_test),1,1)
print(X_train.shape, X_test.shape)
(165081, 1, 1) (55028, 1, 1)
# configure network
n_batch = 1
n_epoch = 100
n_neurons = 10
from keras.optimizers import SGD
opt = SGD(lr=0.01)
# design network
model = Sequential()
model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X_train.shape[1], 
                                             X_train.shape[2]), 
                                             stateful=True))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
# fit network
for i in range(n_epoch):
    model.fit(X_train, y_train ,validation_data=(X_test, y_test), 
              epochs=1, batch_size=n_batch, verbose=1, shuffle= False)
    model.reset_states()

df_actual = []
dp_predict = []
for i in range(len(X_test)):
    testX,testy = X_test[i],y_test[i]
    testX = testX.reshape(1, 1, 1)
    yhat = model.predict(testX, batch_size=1)
    df_actual.append(testy)
    dp_predict.append(yhat)
    print('>Actual =%.1f, Predicted=%.1f' % (testy, yhat))

Я не удалось получить правильное предсказание в этой модели.

Обновление:

Пожалуйста, найдите ниже точность проверки и точность обучения с последовательностью потерь на 154076 образцах, подтвердите на 66033 образцы

Epoch 1/5
154076/154076 [==============================] - 289s 2ms/step - loss: 1.0033 - accuracy: 0.3816 - val_loss: 1.0018 - val_accuracy: 0.4286
Epoch 2/5
154076/154076 [==============================] - 291s 2ms/step - loss: 1.0021 - accuracy: 0.3817 - val_loss: 1.0020 - val_accuracy: 0.4286
Epoch 3/5
154076/154076 [==============================] - 293s 2ms/step - loss: 1.0018 - accuracy: 0.3804 - val_loss: 1.0014 - val_accuracy: 0.4286
Epoch 4/5
154076/154076 [==============================] - 290s 2ms/step - loss: 1.0016 - accuracy: 0.3812 - val_loss: 1.0012 - val_accuracy: 0.4286
Epoch 5/5
154076/154076 [==============================] - 290s 2ms/step - loss: 1.0015 - accuracy: 0.3814 - val_loss: 1.0012 - val_accuracy: 0.4286

Кто-нибудь может предложить мне, что можно улучшить

Примечание: - Я нормализовал входные данные с помощью MinMaxScalar и использовал масштабированные данные, но на выходе нет изменений

1 Ответ

0 голосов
/ 21 июня 2020

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

x = values_train[:, 0]
y = values_train[:, 1]
y = keras.utils.to_categorical(y)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...