我正在用Keras进行二进制分类
loss='binary_crossentropy'
,optimizer=tf.keras.optimizers.Adam
,最后一层是keras.layers.Dense(1, activation=tf.nn.sigmoid)
。
据我所知,loss
值用于在训练阶段评估模型。但是,当我对我的测试数据集使用Keras
模型评估时(例如m_recall.evaluate(testData,testLabel)
,还有loss
值,并伴随着accuracy
值,例如下面的输出
test size: (1889, 18525)
1889/1889 [==============================] - 1s 345us/step
m_acc: [0.5690245978371045, 0.9523557437797776]
1889/1889 [==============================] - 1s 352us/step
m_recall: [0.24519687695911097, 0.9359449444150344]
1889/1889 [==============================] - 1s 350us/step
m_f1: [0.502442331737344, 0.9216516675489677]
1889/1889 [==============================] - 1s 360us/step
metric name: ['loss', 'acc']
loss
在测试期间的意义/用途是什么?为什么这么高(例如0.5690
中的m_acc
)?准确性评估对我来说似乎不错(例如0.9523
中的m_acc
),但我也担心loss
,这会使我的模型表现不佳吗?
PS
m_acc
,m_recall
等正是我命名模型的方式(它们是根据GridSearchCV
中的不同指标进行训练的)
更新:
我刚刚意识到loss
的值不是百分比,那么如何计算呢?而使用当前值,它们是否足够好,还是我需要对其进行更多优化?
对于进一步阅读的建议也表示赞赏!
答案 0 :(得分:5)
在定义机器学习模型时,我们希望有一种方法来衡量我们模型的性能,以便我们可以将其与其他模型进行比较以选择最佳模型,并确保它足够好。因此,我们定义了一些度量标准,例如准确性(在分类的上下文中),它是模型正确分类的样本的比例,以衡量模型的性能以及该模型是否足以完成任务是否。
尽管这些指标对我们来说确实是可以理解的,但是问题是我们的模型的学习过程无法直接使用它们来调整模型的参数。相反,我们定义了其他度量,通常称为损失函数或目标函数,可以在训练过程中直接使用(即优化)。通常定义这些函数,以便我们期望当它们的值较低时,我们将具有较高的精度。这就是为什么您通常会看到机器学习算法在期望精度提高的情况下试图最小化损失函数的原因。换句话说,通过优化损失函数间接学习这些模型。损失值在模型训练期间很重要,例如如果它们没有减少或波动,则意味着存在某个地方需要解决的问题。
因此,我们最终(即在测试模型时)所关注的是我们最初定义的度量值(如准确性),而我们并不关心损失函数的最终值。这就是为什么您不会听到诸如“ ImageNet数据集上[特定模型]的损耗值”是8.732的原因!这并不能告诉您模型的好坏,好坏。相反,您会听到“该模型在ImageNet数据集上的准确度为87%”。