【问题标题】:stop a network from predicting all ones阻止网络预测所有的
【发布时间】:2016-05-26 05:51:14
【问题描述】:

我正在尝试在高度不平衡的数据上构建二元分类器神经网络。班级不平衡约为 99%:1%。即使在对数据进行加权以创建 50-50 个样本时,似乎也存在问题。网络要么陷入低准确度,要么猜测全零以获得最大 99% 的准确度。为响应设置较低的阈值似乎也不起作用。有没有一种方法可以创建一个可以很好地处理不平衡类或可以模拟梯度提升的成本函数?我想实现一些对异常值进行积极学习并惩罚零错误预测的东西。我尝试通过以下方式修改成本函数,但并没有改进算法。

class QuadraticCost(object):
def fn(output, y):
    if y == 1 and output < 0.5: fun = 100*0.5*np.linalg.norm(output-y)**2
    else: fun = 1*0.5*np.linalg.norm(output-y)**2
    return fun

def delta(z, a, y):
    return (a-y) * sigmoid_prime(z)

(在我的反向传播算法中,我使用以下总成本函数进行随机梯度下降,其中 eta 等于学习率,lambda 是正则化参数)

任何关于如何修改成本以更多地惩罚假 0 的想法将不胜感激。谢谢!

编辑:有没有办法修改反向传播算法以使用 ROC-AUC 成本而不是二次成本?

【问题讨论】:

  • 您的功能看起来如何?作为人类,你能从特征中预测类别吗?功能在哪个范围内?
  • 有大约 370 个特征,不,我无法猜测仅通过检查观察会属于哪些类别。它们是稀疏的,范围从 0 到 1 或 0 到 1000。我事先对数据进行了标准化,但仍然有同样的问题。

标签: python machine-learning neural-network


【解决方案1】:

这其实很简单。您的成本是附加的,这意味着它只是形式

L({(x_i,y_i)}, w) = SUM_i l(h(x_i|w), y_i) + C theta(w)

其中 theta 是正则化惩罚(在您的代码 L2 范数中),h(x_i|w) 是您对 x_i 和当前参数 w 的预测,而 l(a,b) 是给出预测 a 的逐点成本标签是 b。只需将您的费用更改为

L({(x_i,y_i)}, w) = SUM_i importance(y_i) * l(h(x_i|w), y_i) + C theta(w)

其中importance(a) 是a 类的重要性,因此在您的情况下,您可以使用importance(0) = 0.001 和importance(1) = 1,导致网络关心“1”实例比“0”多1000 倍s。可加性也使梯度的计算变得非常简单,因为您只需要将样本 i 的梯度乘以相同的重要性。您可以将其视为使用两种不同的学习率 - 多数类的小学习率和少数类的大学习率(从数学角度来看,这几乎相同)。唯一的区别是当您使用小批量时(然后这种学习率解释不再有效,因为您对这些学习率有加权平均值之类的东西)。

【讨论】:

  • 我不确定我是否完全理解。我做了一个权重,就像你建议的 def fn(output, y): if output &lt; 0.5: fun = 100*0.5*np.linalg.norm(output-y)**2 else: fun = 1*0.5*np.linalg.norm(output-y)**2 return fun 一样,重要性(0)是 1/100。更新梯度是指改变反向传播方法吗?
  • 不,你没有,你以输出为条件,你应该以正确的标签为条件。是的,关键是梯度,而不是成本的价值。因此,您需要在更新方法中实际设置条件,这就是学习发生的地方。 SGD其实不使用函数值,它只关心梯度
  • 只需交替(在 update_mini_batch 中)使用 nabla_w 和 nabla_b 更新的行 - 您在列表理解中执行类似 nb+dnb 的操作 - 只需将其更改为 nb+dnb*weight[y] 并定义特定类的权重(y's)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2017-09-01
  • 2021-12-02
相关资源
最近更新 更多