2016-03-10 41 views
0

我想建立一个高度不平衡的数据上的二元分类神经网络。班级失衡约为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) 

(在我的BP算法我使用与ETA等于学习效率随机梯度下降下面的总成本函数,和lambda是调整参数)

关于如何修改费用的任何想法惩罚虚假0更多将不胜感激。谢谢!

编辑:有没有一种方法来修正反向传播算法使用ROC-AUC成本而不是二次方法?

+0

你的功能如何?作为一个人,你能否从这些特征中预测这些课程?功能在哪些范围内? –

+0

有〜370个特征,并且不,我不能猜测观察将会通过检查而落入哪些类。它们很稀疏,范围从0到1或0到1000.我预先对数据进行了归一化处理,但仍然存在相同的问题。 – michel

回答

1

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

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

其中θ为正则罚(代码中的L2范数),H(X_I | W)是您X_I和电流参数W和L预测(a,b)是当标签为b时给予预测的按点成本。只要你的成本改变

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

,其中重要的(a)是类的重要性,因此在你的情况,你可以使用(0)= 0.001和重要性(1)= 1,造成网络去关心“的重要性1“实例比”0“多1000倍。添加使梯度的计算也非常简单,因为您只需将样本i的梯度乘以相同的重要性即可。你可以考虑使用两种不同的学习率 - 大多数课程的学习率较低,少数学习率较高(从数学的角度来看,这几乎相同)。唯一的区别是当你使用minibatches(然后这个学习率解释不再有效,因为你有这些学习率加权平均的东西)。

+0

我不确定我完全理解。如果输出<0.5:fun = 100 * 0.5 * np.linalg.norm(输出-y)** 2 else:fun = 0,则我做了一个像 '''def fn(output,y): ' 1 * 0.5 * np.linalg.norm(output-y)** 2 return fun'''其中重要性(0)是1/100。通过更新渐变你是指改变反向传播方法? – michel

+0

不,你没有,你**输出**,你应该** **正确的标签**。是的,关键是一个梯度,而不是成本的价值。因此,你需要在你的更新方法中实际调整,这是学习的地方。 SGD实际上并不使用函数值,它只关心梯度 – lejlot

+0

,简单地用nabla_w和nabla_b更新替换(在update_mini_batch中)行 - 你在列表理解中做了类似'nb + dnb'的东西 - 只需将其更改为'nb + dnb * weight [y]'并定义特定类的权重(y's) – lejlot