如果有人可以解释对数损失成本函数以及在测量分类模型性能中的用途,我将不胜感激。
我已经阅读了几篇文章,但其中大多数都专注于数学而不是直观的解释,而且使用带有小数据集的 python 的基本实现真的很有帮助,所以我可以更好地理解它。
这真的会帮助许多在这里寻找相同的人。谢谢。
如果有人可以解释对数损失成本函数以及在测量分类模型性能中的用途,我将不胜感激。
我已经阅读了几篇文章,但其中大多数都专注于数学而不是直观的解释,而且使用带有小数据集的 python 的基本实现真的很有帮助,所以我可以更好地理解它。
这真的会帮助许多在这里寻找相同的人。谢谢。
好的,这就是它的工作原理。假设你想对动物进行分类,你有猫、狗和鸟。这意味着您的模型将以向量的形式输出 3 个单位(如果您愿意,可以将其称为列表)。
列表的每个元素代表和动物,例如
现在想象你得到一个鸟的输入,在一个快乐的世界里,你的算法应该输出一个像这样的向量
[0, 0, 1]
也就是说,输入有 0% 的机会是猫,0% 的机会是狗,100% 的机会是鸟。
我现实,这不是那么简单,你的输出很可能是这样的
[0.15, 0.1, 0.75]
这意味着成为猫的几率为 15%,成为狗的几率为 10%,成为鸟的几率为 75%。现在,请注意,这意味着您的算法仍会将输入视为鸟,因此在分类方面,确保输出是正确的……但它不会像预测的 100% 鸟的可能性那样正确。
所以,直觉是 logloss 衡量你离完美还有多远,完美就是以 100% 的机会识别正确的标签,以 0% 的机会识别不正确的标签。
最后的忠告:不要害怕数学,你真的需要在某个时候掌握它,不要让求和项吓倒你,毕竟它们只是代表编程中的循环。
让我们深入研究数学,特别是为了揭开它的神秘面纱。
对数损失公式由下式给出
在哪里
因此,对于我们的示例,我们有两个示例,(请记住,示例表示为 ) 哪个是
[0, 1, 0] # Example 1: This means the correct answer is dog
[1, 0, 0] # Example 2: This means the correct answer is cat
现在,让我们进行预测,请记住,预测表示为 假设他们是
[0.1, 0.6, 0.3]
[0.85, 0.05, 0.1]
让我们在这里应用这个可怕的公式。首先注意到
因此对于 我们有
为了
term1 = [0, 1, 0] * log([0.1, 0.6, 0.3]) + (1-[0, 1, 0]) * log(1 - [0.1, 0.6, 0.3])
为了
term2 = [1, 0, 0] * log([0.85, 0.05, 0.1]) + (1-[1, 0, 0]) * log (1-[0.85, 0.05, 0.1])
最后我们有
log_loss = (-1/2) * (term1 + term2)
使用sklearn log_loss,答案是0.3366
现在,不要在这里的数学中迷失方向,只需注意它并不难,并且要理解这里的损失函数基本上可以告诉您您的错误程度,或者如果您愿意,它会测量距离的“距离”完美。我强烈建议您自己编写 logloss 代码(通常 numpy 是一个不错的选择:)
接受的答案简直太神奇了。我很想给它添加一个直观的小细节。我希望它能让事情变得更好。
我从@Juan 描述的损失函数开始:
对数损失 = - ]
将此等式视为由两个独立的函数组成:
这是 y = 1 的损失函数(损失函数意味着我正在分析一个示例)。简单地说,这意味着如果您预测 y = 1 而实际上它是 1并且损失是 INFINITY 如果否则(如果您在 y = 1 时预测 y = 0)。在后一种情况下,你会因为极其错误的预测而严重惩罚你的损失函数。
使用类似的推理,您可以直觉该函数在预测 y = 1(实际标签为 y = 0)时受到严重惩罚。反之亦然。
@Juan 给出的方程是这两个损失函数的组合。让我把它拆开一点。
和 存在将这个方程折叠成上述函数之一。假设 y = 1,那么产生 0 和消失。仅有的仍然存在(考虑到上面列出的图表,这实际上是我们想要的)。
sigma 和除以训练样本的数量是为了将此损失函数转换为明确定义的成本函数(一次考虑整个训练集)。
我希望这有助于更好地理解这个 logloss 函数。