Значения показателей Sklearn сильно отличаются от значений Keras - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужна помощь, чтобы понять, как рассчитывается точность при подгонке модели в Керасе.Это пример истории обучения модели:

Train on 340 samples, validate on 60 samples
Epoch 1/100
340/340 [==============================] - 5s 13ms/step - loss: 0.8081 - acc: 0.7559 - val_loss: 0.1393 - val_acc: 1.0000
Epoch 2/100
340/340 [==============================] - 3s 9ms/step - loss: 0.7815 - acc: 0.7647 - val_loss: 0.1367 - val_acc: 1.0000
Epoch 3/100
340/340 [==============================] - 3s 10ms/step - loss: 0.8042 - acc: 0.7706 - val_loss: 0.1370 - val_acc: 1.0000
...
Epoch 25/100
340/340 [==============================] - 3s 9ms/step - loss: 0.6006 - acc: 0.8029 - val_loss: 0.2418 - val_acc: 0.9333
Epoch 26/100
340/340 [==============================] - 3s 9ms/step - loss: 0.5799 - acc: 0.8235 - val_loss: 0.3004 - val_acc: 0.8833

Итак, точность проверки равна 1 в первые эпохи?Как точность проверки может быть лучше точности обучения?

Это цифры, которые показывают все значения точности и потерь:

enter image description here

enter image description here

Затем я использую метрики sklearn для оценки конечных результатов:

def evaluate(predicted_outcome, expected_outcome):
    f1_score = metrics.f1_score(expected_outcome, predicted_outcome, average='weighted')
    balanced_accuracy_score = metrics.balanced_accuracy_score(expected_outcome, predicted_outcome)
    print('****************************')
    print('| MODEL PERFORMANCE REPORT |')
    print('****************************')
    print('Average F1 score = {:0.2f}.'.format(f1_score))
    print('Balanced accuracy score = {:0.2f}.'.format(balanced_accuracy_score))
    print('Confusion matrix')
    print(metrics.confusion_matrix(expected_outcome, predicted_outcome))
    print('Other metrics')
    print(metrics.classification_report(expected_outcome, predicted_outcome))

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

****************************
| MODEL PERFORMANCE REPORT |
****************************
Average F1 score = 0.25.
Balanced accuracy score = 0.32.
Confusion matrix
[[  7  24   2  40]
 [ 11  70   4 269]
 [  0   0   0  48]
 [  0   0   0   6]]
Other metrics
              precision    recall  f1-score   support

           0       0.39      0.10      0.15        73
           1       0.74      0.20      0.31       354
           2       0.00      0.00      0.00        48
           3       0.02      1.00      0.03         6

   micro avg       0.17      0.17      0.17       481
   macro avg       0.29      0.32      0.12       481
weighted avg       0.61      0.17      0.25       481

Почему значения точности и потерь функций подгонки Keras так сильно отличаются от значений метрик sklearn?

Это моя модель, если она помогает:

model = Sequential()

model.add(LSTM(
                units=100, # the number of hidden states
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.2, 
                recurrent_dropout=0.2
              )
         )

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')

Размеры входных данных:

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

Вот так я применяю метрики sklearn:

testPredict = model.predict(np.array(X_test))
y_test = np.argmax(y_test.values, axis=1)
y_pred = np.argmax(testPredict, axis=1)
evaluate(y_pred, y_test)

Похоже, что я что-то упускаю.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы звучите немного смущенно.

Для начала вы сравниваете яблоки с апельсинами, т. Е. Точность проверки , сообщаемая Keras на наборе из 60 образцов (обратите внимание на первый информативныйсообщение, напечатанное Keras, Train on 340 samples, validate on 60 samples) с точностью test , сообщенной scikit-learn в вашем тестовом наборе 481 образца.

Во-вторых, ваш проверочный набор только из 60 образцов равен слишком маленький ;в таких небольших выборках дикие флуктуации вычисленных метрик, таких как те, о которых вы сообщаете, не являются неожиданными (есть причина, по которой нам нужны наборы данных достаточного размера, а не только обучающие единицы).

В-третьих, ваше разделение обучения / проверки / набора тестов довольно необычно, если не сказать больше;стандартная практика требует ассигнований примерно 70/15/15% или аналогичных, а вы используете распределение 38/7/55% (т. е. 340/60/481 выборок) ...

Наконеци, не зная деталей ваших данных, вполне может быть так, что только 340 выборок недостаточно для того, чтобы соответствовать модели LSTM, такой как ваша, для хорошей задачи классификации по 4 классам.

Для начала, начните с более подходящего распределения ваших данных в учебных / проверочных / тестовых наборах и убедитесь, что вы сравниваете яблоки с яблоками ...

PS В подобных вопросах вам также следуетвключите вашу model.fit() часть.

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