Sklearn 指标值与 Keras 值非常不同

Posted

技术标签:

【中文标题】Sklearn 指标值与 Keras 值非常不同【英文标题】:Sklearn metrics values are very different from Keras values 【发布时间】:2019-07-02 00:04:31 【问题描述】:

我需要一些帮助来了解在 Keras 中拟合模型时如何计算准确性。 这是训练模型的示例历史记录:

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

那么,第一个 epoch 的验证准确度是 1?验证准确率如何优于训练准确率?

这些数字显示了准确度和损失的所有值:

然后我使用 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】:

你听起来有点困惑。

首先,您将苹果与橙子进行比较,即 Keras 在 60 个样本集上报告的验证准确度(请注意 Keras 打印的第一条信息性消息,Train on 340 samples, validate on 60 samples)与测试 scikit-learn 在您的 481 样本测试集上报告的准确度。

其次,您只有 60 个样本的验证集太小了;在如此小的样本中,计算指标的剧烈波动(例如您报告的指标)当然不会出乎意料(我们需要足够大小的数据集,而不仅仅是训练数据集是有原因的)。 p>

第三,你的训练/验证/测试集划分很不寻常,至少可以这么说;标准做法要求分配大约 70/15/15% 或类似,而您使用的是 38/7/55% 的分配(即 340/60/481 个样本)...

最后,在不知道您的数据细节的情况下,很可能只有 340 个样本不足以适合像您这样的 LSTM 模型来完成良好的 4 类分类任务。

对于初学者,首先将数据更适当地分配到训练/验证/测试集中,并确保将苹果与苹果进行比较...

PS 在类似的问题中,您还应该包括您的model.fit() 部分。

【讨论】:

嗨,我面临着非常相似的情况。阅读您的答案后,我检查了 Sklearn 和 Keras 是否使用相同的验证集大小和数据。但是,Keras model.fit 输出显示 85% val_acc。同时,在 Sklearn 的 metrics.confusion 矩阵上,它显示 78% 的 True Positives 和 78% 的 True Negatives。我应该问一个新问题还是重复这个问题?谢谢! @JairoAlves 我建议你确实打开一个新问题 @JairoAlves 一年后,你做了什么?我有同样的问题。 keras 和 sklearn 中的数字相同,但一个报告 90%,另一个报告 56%。 @PolarBear10 看起来他们打开了this question,我似乎也已经回答了。

以上是关于Sklearn 指标值与 Keras 值非常不同的主要内容,如果未能解决你的问题,请参考以下文章

Keras预测给出的误差与评估不同,损失与指标不同

如何在 Keras 中将 Sklearn Metric 实现为 Metric?

评估指标的手动计算与 Sklearn 函数不匹配

Keras model.fit log 和 Sklearn.metrics.confusion_matrix 报告的验证准确度指标不匹配

无法使用 Sklearn 和 Keras Wrappers 使 pipeline.fit() 工作

为多标签分类生成 sklearn 指标的问题