我在使用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/stepm_acc: [0.5690245978371045, 0.9523557437797776]1889/1889 [==============================] - 1s 352us/stepm_recall: [0.24519687695911097, 0.9359449444150344]1889/1889 [==============================] - 1s 350us/stepm_f1: [0.502442331737344, 0.9216516675489677]1889/1889 [==============================] - 1s 360us/stepmetric name: ['loss', 'acc']
在测试期间,loss
的意义和用途是什么?为什么它的值会这么高(例如m_acc
中的0.5690
)?对我来说,准确率评估似乎还可以(例如m_acc
中的0.9523
),但我也担心loss
值,这会不会让我的模型表现不佳?
附注:m_acc
、m_recall
等只是我给模型命名的方式(它们是在GridSearchCV
中用不同指标训练的)
更新:我刚刚意识到loss
值不是以百分比表示的,那么它们是如何计算的?以当前的值来看,它们足够好吗,还是需要进一步优化?
也欢迎提供进一步阅读的建议!
回答:
在定义机器学习模型时,我们希望有办法衡量模型的表现,以便将其与其他模型进行比较,选择最佳模型,并确保其足够好。因此,我们定义了一些指标,如分类中的准确率,这是模型正确分类样本的比例,用来衡量模型的表现以及是否适合我们的任务。
虽然这些指标确实能被我们理解,但问题是它们不能直接用于模型的学习过程来调整模型参数。相反,我们定义了其他措施,通常称为损失函数或目标函数,它们可以直接用于训练过程(即优化)。这些函数通常定义为当它们的值低时,我们期望准确率会高。这就是为什么你通常会看到机器学习算法试图最小化损失函数,期望准确率提高。换句话说,模型是通过优化损失函数间接学习的。损失值在模型训练期间很重要,例如,如果它们没有减少或波动不定,那么这意味着某处有问题需要解决。
因此,我们最终(即在测试模型时)关心的实际上是我们最初定义的指标值(如准确率),而不是损失函数的最终值。这就是为什么你不会听到诸如“某模型在ImageNet数据集上的损失值是8.732”这样的说法!这并不能告诉你模型是优秀、好、差还是糟糕。相反,你会听到“这个模型在ImageNet数据集上的表现准确率为87%”。