加权铰链损失函数
Weighted hinge loss function
我将我的普通铰链损失定义为:
def hinge(y_true, y_pred):
return tf.maximum(0., 1- y_true*y_pred)
我正在训练 SVM 来预测事件。我的 y
值是 1
如果是 class 或 -1
如果不是 class。我的 class 不平衡,我的 -1
比 +1
多得多。
因此,我想将损失 +1
加权为更高的惩罚。但我不知道我会如何改变我的铰链损失。我能想到的最好的是,
X = (# of non event samples) / (# of event samples)
if(y_true*y_pred > 0):
return tf.maximum(0., 1- y_true*y_pred)*X
这意味着,如果我有 100 个非事件和 10 个事件,那么 X
= 100/10 = 10。
如果 y_true = 1
.
那么损失就是 hingeloss*10
这是正确的还是有更好的方法?
怎么样:
def hinge(y_true, y_pred):
return tf.multiply((11/9+y_true)*9/2,tf.maximum(0., 1- y_true*y_pred))
这里的逻辑是,如果 y_true
为 1,我们要乘以 10,如果为 -1,则乘以 1。您可以检查当 y_true
为 -1 时,(11/9+y_true)*9/2
计算为 1,当它为 1 时,它计算为 10。如果您有兴趣知道如何推导表达式中的 11/9 ,它是求解所需位移 s 的线性方程的结果:
10(s + (-1))=1(s+1).
我将我的普通铰链损失定义为:
def hinge(y_true, y_pred):
return tf.maximum(0., 1- y_true*y_pred)
我正在训练 SVM 来预测事件。我的 y
值是 1
如果是 class 或 -1
如果不是 class。我的 class 不平衡,我的 -1
比 +1
多得多。
因此,我想将损失 +1
加权为更高的惩罚。但我不知道我会如何改变我的铰链损失。我能想到的最好的是,
X = (# of non event samples) / (# of event samples)
if(y_true*y_pred > 0):
return tf.maximum(0., 1- y_true*y_pred)*X
这意味着,如果我有 100 个非事件和 10 个事件,那么 X
= 100/10 = 10。
如果 y_true = 1
.
hingeloss*10
这是正确的还是有更好的方法?
怎么样:
def hinge(y_true, y_pred):
return tf.multiply((11/9+y_true)*9/2,tf.maximum(0., 1- y_true*y_pred))
这里的逻辑是,如果 y_true
为 1,我们要乘以 10,如果为 -1,则乘以 1。您可以检查当 y_true
为 -1 时,(11/9+y_true)*9/2
计算为 1,当它为 1 时,它计算为 10。如果您有兴趣知道如何推导表达式中的 11/9 ,它是求解所需位移 s 的线性方程的结果:
10(s + (-1))=1(s+1).