Sklearn指标值与Keras值差异很大

我需要一些帮助来理解在Keras中拟合模型时如何计算准确率。这是训练模型的一个样本历史记录:

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

那么,验证准确率在前几个epoch就达到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       481weighted 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 sequences481 test sequencesX_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)

看起来我错过了什么。


回答:

你听起来有点困惑。

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

其次,你只有60个样本的验证集实在太小了;在如此小的样本中,你报告的指标计算的剧烈波动当然不足为奇(我们需要足够大小的数据集是有原因的,不仅仅是训练数据集)。

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

最后,在不了解你的数据细节的情况下,很可能是340个样本不足以拟合像你这样的LSTM模型来进行一个好的4类分类任务。

首先,从更合适地分配你的数据到训练/验证/测试集开始,并确保你比较的是苹果和苹果…

附言 在类似的提问中,你还应该包括你的 model.fit() 部分。

Related Posts

如何使用Google Protobuf解析、编辑和生成object_detection/pipeline.config文件

我在一个常见的集成学习范式中训练多个模型,目前我在处理…

我的GridSearchCV不起作用,我不知道为什么

大家好,我在使用GridSearchCV时遇到了问题,…

Keras: 两个同时进行的层,其中一个对前一层的输出进行卷积

我想实现这样的模型连接: 输入图像1 -> 卷积层1 …

如何将行数据转换为列数据而不使用独热编码

我有一个如下所示的数据集。 MonthDate Day…

使用 ML Kit 与 NNAPI

我正在尝试在运行 Android 9 的设备上使用新的…

Vowpal Wabbit 可能的哈希冲突

我在VW中生成了一个模型,并且在相同的数据上生成了两个…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注