首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解科学知识中的铰链丢失

理解科学知识中的铰链丢失
EN

Stack Overflow用户
提问于 2022-11-20 18:37:12
回答 1查看 96关注 0票数 2

我看过这张铰链丢失图:

https://math.stackexchange.com/questions/782586/how-do-you-minimize-hinge-loss

也在这里:

https://programmathically.com/understanding-hinge-loss-and-the-svm-cost-function/

然而,使用scikit创建“相同”的图形--学习,是非常相似的,但似乎是“相反的”。守则如下:

代码语言:javascript
运行
复制
from sklearn.metrics import hinge_loss
import matplotlib.pyplot as plt
import numpy as np


predicted = np.arange(-10, 11, 1)
y_true = [1] * len(predicted)
loss = [0] * len(predicted)
for i, (p, y) in enumerate(zip(predicted, y_true)):
  loss[i] = hinge_loss(np.array([y]), np.array([p]))
plt.plot(predicted, loss)

plt.axvline(x = 0, color = 'm', linestyle='dashed')
plt.axvline(x = -1, color = 'r', linestyle='dashed')
plt.axvline(x = 1, color = 'g', linestyle='dashed')

真== 1

上图中的一些具体要点如下:

代码语言:javascript
运行
复制
hinge_loss([1], [-5]) = 0.0,
hinge_loss([1], [-1]) = 0.0,
hinge_loss([1], [0])  = 1.0,
hinge_loss([1], [1])  = 2.0,
hinge_loss([1], [5])  = 6.0
代码语言:javascript
运行
复制
predicted = np.arange(-10, 11, 1)
y_true = [-1] * len(predicted)
loss = [0] * len(predicted)
for i, (p, y) in enumerate(zip(predicted, y_true)):
  loss[i] = hinge_loss(np.array([y]), np.array([p]))
plt.plot(predicted, loss)

plt.axvline(x = 0, color = 'm', linestyle='dashed')
plt.axvline(x = -1, color = 'r', linestyle='dashed')
plt.axvline(x = 1, color = 'g', linestyle='dashed')

真== -1

上图中的一些具体要点如下:

代码语言:javascript
运行
复制
hinge_loss([-1], [-5]) = 0.0,
hinge_loss([-1], [-1]) = 0.0,
hinge_loss([-1], [0])  = 1.0,
hinge_loss([-1], [1])  = 2.0,
hinge_loss([-1], [5])  = 6.0

谁能解释一下为什么hinge_loss()在科学学习似乎与其他两个图表相反?

事先非常感谢

编辑:根据答案,我可以在不翻转值的情况下再现相同的输出。这是基于以下内容的: As hinge_loss([0], [-1])==0hinge_loss([-2], [-1])==0。基于此,我可以使用两个值的数组调用hinge_loss(),而不改变计算的损失。

以下代码不会翻转值:

代码语言:javascript
运行
复制
predicted = np.arange(-10, 11, 1)
y_true = [1] * len(predicted)
loss = [0] * len(predicted)
for i, (p, y) in enumerate(zip(predicted, y_true)):
  loss[i] = hinge_loss(np.array([y, 0]), np.array([p, -1])) * 2
plt.plot(predicted, loss)

plt.axvline(x = 0, color = 'm', linestyle='dashed')
plt.axvline(x = -1, color = 'r', linestyle='dashed')
plt.axvline(x = 1, color = 'g', linestyle='dashed')
代码语言:javascript
运行
复制
predicted = np.arange(-10, 11, 1)
y_true = [-1] * len(predicted)
loss = [0] * len(predicted)
for i, (p, y) in enumerate(zip(predicted, y_true)):
  loss[i] = hinge_loss(np.array([y,-2]), np.array([p,-1])) * 2
plt.plot(predicted, loss)

plt.axvline(x = 0, color = 'm', linestyle='dashed')
plt.axvline(x = -1, color = 'r', linestyle='dashed')
plt.axvline(x = 1, color = 'g', linestyle='dashed')

现在的问题是,为什么每一种对应的情况下,这些价值的“组合”都能很好地工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-21 21:25:47

通过查看hinge_loss实现的底层代码,在二进制情况下会发生以下情况:

代码语言:javascript
运行
复制
lbin = LabelBinarizer(neg_label=-1)
y_true = lbin.fit_transform(y_true)[:, 0]

try:
    margin = y_true * pred_decision
except TypeError:
    raise TypeError("pred_decision should be an array of floats.")

losses = 1 - margin
np.clip(losses, 0, None, out=losses)
np.average(losses, weights=sample_weight)

由于在单个标签情况下的LabelBinarizer.fit_transform()行为默认为返回一个负标签数组

代码语言:javascript
运行
复制
from sklearn.preprocessing import LabelBinarizer

lbin = LabelBinarizer(neg_label=-1)
lbin.fit_transform([1, 1, 1, 1, 1, 1, 1])   # returns array([[-1],[-1],[-1][-1],[-1],[-1],[-1]])

这意味着(唯一的)标签符号被翻转,这解释了你得到的情节。

尽管单一标签的例子是相当奇怪的,但在这样的问题上有一些争论,见https://github.com/scikit-learn/scikit-learn/issues/6723 eg。深入研究github问题,他们似乎还没有就应用的潜在解决办法达成最终决定。

对编辑的回答:

在循环中丰富yp的方式是有效的,因为--通过这种方式--您实际上是在“逃离”单个标签的情况(特别是,真正重要的是处理y的方式)。的确,

代码语言:javascript
运行
复制
lbin = LabelBinarizer(neg_label=-1)
lbin.fit_transform(y_true)[:, 0]

对于y_true=np.array([y,0])=np.array([1,0]) (第一例)或y_true=np.array([y,-2])=np.array([-1,-2]) (第二例),分别返回array([ 1, -1])array([ 1, -1])。另一方面,您在注释中提到的第二种情况的另一种可能性是,y_true=np.array([y,-1])=np.array([-1,-1])不允许您脱离单个标签情况(lbin.fit_transform(np.array([-1, -1]))[:, 0]返回array([-1, -1]);因此您回到了上面描述的"bug“中)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74510863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档