我看过这张铰链丢失图:
https://math.stackexchange.com/questions/782586/how-do-you-minimize-hinge-loss
也在这里:
https://programmathically.com/understanding-hinge-loss-and-the-svm-cost-function/
然而,使用scikit创建“相同”的图形--学习,是非常相似的,但似乎是“相反的”。守则如下:
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')上图中的一些具体要点如下:
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.0predicted = 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')上图中的一些具体要点如下:
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])==0和hinge_loss([-2], [-1])==0。基于此,我可以使用两个值的数组调用hinge_loss(),而不改变计算的损失。
以下代码不会翻转值:
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')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')现在的问题是,为什么每一种对应的情况下,这些价值的“组合”都能很好地工作。
发布于 2022-11-21 21:25:47
通过查看hinge_loss实现的底层代码,在二进制情况下会发生以下情况:
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()行为默认为返回一个负标签数组
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问题,他们似乎还没有就应用的潜在解决办法达成最终决定。
对编辑的回答:
在循环中丰富y和p的方式是有效的,因为--通过这种方式--您实际上是在“逃离”单个标签的情况(特别是,真正重要的是处理y的方式)。的确,
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“中)。
https://stackoverflow.com/questions/74510863
复制相似问题