Как спроектировать подходящую модель в Керасе для несбалансированной задачи мультиклассификации? - PullRequest
0 голосов
/ 09 февраля 2019

Я решаю проблему несбалансированной мультиклассификации (4 класса) с последовательными данными.Я подготовил учебные и тестовые наборы, которые содержат одинаковое количество записей для каждого класса:

  • 100, 100, 100, 100 -> тренировочный набор
  • 20, 20, 20, 20-> набор для тестирования

Я получаю следующие результаты проверки моей модели LSTM Keras.Они слишком плохие.В матрице путаницы видно, что все записи классифицируются как класс 4.

****************************
| MODEL PERFORMANCE REPORT |
****************************
Average F1 score = 0.10.
Balanced accuracy score = 0.25.
Confusion matrix
[[ 0  0  0 20]
 [ 0  0  0 20]
 [ 0  0  0 20]
 [ 0  0  0 20]]
Other metrics
              precision    recall  f1-score   support

           0       0.00      0.00      0.00        20
           1       0.00      0.00      0.00        20
           2       0.00      0.00      0.00        20
           3       0.25      1.00      0.40        20

   micro avg       0.25      0.25      0.25        80
   macro avg       0.06      0.25      0.10        80
weighted avg       0.06      0.25      0.10        80

Я не хочу переходить к оптимизации гиперпараметров, потому что в моей модели что-то принципиально неверное.

Я буду очень признателен, если кто-то, обладающий большим опытом в LSTM и глубоком обучении, укажет мне на мои ошибки.

Это мои данные (я использую очень маленькую выборку, чтобы экспериментировать сбазовая модель, которую я буду позже тренировать для всего набора данных):

400 train sequences
80 test sequences
X_train shape: (400, 20, 17)
X_test shape: (80, 20, 17)
y_train shape: (400, 4)
y_test shape: (80, 4)

Это моя модель и функция подгонки:

hidden_neurons = 50
timestamps = 20
nb_features = 18

model = Sequential()

model.add(LSTM(
                units=hidden_neurons,
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.2, 
                recurrent_dropout=0.2
              )
         )

model.add(TimeDistributed(Dense(1)))

model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(units=nb_classes,
               activation='softmax'))

model.compile(loss="categorical_crossentropy",metrics = ['accuracy'],optimizer='adadelta')

history = model.fit(np.array(X_train), y_train, 
                    validation_data=(np.array(X_test), y_test),
                    epochs=50,
                    batch_size=2,
                    callbacks=[model_metrics],
                    shuffle=False,
                    verbose=1)


class Metrics(Callback):

    def on_train_begin(self, logs={}):
        self.val_f1s = []
        self.val_recalls = []
        self.val_precisions = []

    def on_epoch_end(self, epoch, logs={}):
        val_predict = np.argmax((np.asarray(self.model.predict(self.validation_data[0]))).round(), axis=1)
        val_targ = np.argmax(self.validation_data[1], axis=1)
        _val_f1 = metrics.f1_score(val_targ, val_predict, average='weighted')
        _val_recall = metrics.recall_score(val_targ, val_predict, average='weighted')
        _val_precision = metrics.precision_score(val_targ, val_predict, average='weighted')
        self.val_f1s.append(_val_f1)
        self.val_recalls.append(_val_recall)
        self.val_precisions.append(_val_precision)
        print(" — val_f1: {:f} — val_precision: {:f} — val_recall {:f}".format(_val_f1, _val_precision, _val_recall))
        return

model_metrics = Metrics()

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...