vowpalwabbit – -owa 2和–loss_function = logistic在Vowpal Wabbit中的效果

我应该在VW中使用哪些参数进行二进制分类任务?例如,让我们使用
rcv1_small.dat.I
thought最好使用逻辑损失函数(或铰链),使用–oa 2是没有意义的.但是,实证结果(在所有情况下报告了渐进式验证0/1损失) 4个实验)表明最佳组合是-oaa 2没有逻辑损失(即默认平方损失):

cd vowpal_wabbit/test/train-sets

cat rcv1_small.dat | vw --binary
# average loss = 0.0861

cat rcv1_small.dat | vw --binary --loss_function=logistic
# average loss = 0.0909

cat rcv1_small.dat | sed 's/^-1/2/' | vw --oaa 2
# average loss = 0.0857

cat rcv1_small.dat | sed 's/^-1/2/' | vw --oaa 2 --loss_function=logistic
# average loss = 0.0934

我的主要问题是:为什么–oaa 2没有给出与–binary完全相同的结果(在上面的设置中)?

我的第二个问题是:为什么优化物流损失不会改善0/1损失(与优化默认平方损失相比)?这是特定的这个特定数据集吗?

最佳答案 使用–csoaa时,我经历过类似的事情.细节可以找到
here.我的猜测是,如果N类的多类问题(无论你指定2作为多个类),vw几乎可以使用N个特征副本.相同的示例在为每个可能的类预测/学习时获得不同的ft_offset值,并且此偏移用于散列算法.因此,所有类都从同一数据集的行中获得“独立”的一组特征.当然,特征值是相同的,但是vw不保留值 – 仅限特征权重.每个可能的类别的权重都不同.并且由于用于存储这些权重的RAM量用-b(默认为-b 18)固定 – 您拥有的类越多,获得哈希冲突的机会就越多.您可以尝试增加-b值并检查–oaa 2和–binary结果之间的差异是否正在减小.但我可能错了,因为我没有深入研究vw代码.

至于损失函数 – 您无法直接比较平方(默认)和逻辑损失函数的平均损失值.您将从平方损失获得的结果中获得原始预测值,并在逻辑损失方面获得这些预测的损失.函数将是:log(1 exp(-label * prediction)其中label是先验已知答案.对于在vw中实现的所有损失函数的这些函数(float getLoss(浮点预测,浮点标签))可以在loss_functions.cc中找到.或者您可以使用1.f /(1.f exp( – 预测)初步将原始预测值缩放到[0..1],然后按照kaggle.com所述计算日志损失:

double val = 1.f / (1.f + exp(- prediction); // y = f(x) -> [0, 1]
if (val < 1e-15) val = 1e-15;
if (val > (1.0 - 1e-15)) val = 1.0 - 1e-15;
float xx = (label < 0)?0:1; // label {-1,1} -> {0,1}
double loss = xx*log(val) + (1.0 - xx) * log(1.0 - val);
loss *= -1;

您还可以使用’/ vowpal_wabbit / utl / logistic’脚本或–link = logistic参数将原始预测缩放为[0..1].两者都使用1 /(1 exp(-i)).

点赞