4

What parameters should I use in VW for a binary classification task? For example, let's use rcv1_small.dat. I thought it is better to use the logistic loss function (or hinge) and it makes no sense to use --oaa 2. However, the empirical results (with progressive validation 0/1 loss reported in all 4 experiments) show that best combination is --oaa 2 without logistic loss (i.e. with the default squared loss):

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

My primary question is: Why --oaa 2 does not give exactly the same results as --binary (in the above setting)?

My secondary questions are: Why optimizing the logistic loss does not improve the 0/1 loss (compared to optimizing the default square loss)? Is this a specific of this particular dataset?

4

1 回答 1

2

我在使用--csoaa. 可以在这里找到详细信息。我的猜测是,在 N 个类的多类问题的情况下(无论您将 2 指定为多个类),vw 实际上适用于 N 个特征副本。当对每个可能的类进行预测/学习时,相同的示例会获得不同的 ft_offset 值,并且此偏移量用于散列算法。因此,所有类都从同一数据集的行中获得“独立”的一组特征。当然特征值是相同的,但 vw 不保留值 - 只有特征权重。每个可能的类别的权重都不同。并且由于用于存储这些权重的 RAM 数量是固定的-b-b 18默认情况下) - 您拥有的类越多,发生哈希冲突的机会就越大。-b--oaa 2值并检查与结果之间的差异是否在--binary减小。但我可能错了,因为我没有深入了解大众代码。

至于损失函数 - 您不能直接比较平方(默认)和逻辑损失函数的平均损失值。您应该从使用平方损失获得的结果中获得原始预测值,并根据逻辑损失获得这些预测的损失。函数将是:log(1 + exp(-label * prediction)其中 label 是先验已知的答案。vw 中实现的所有损失函数的此类函数 ( float getLoss(float prediction, float label)) 可以在loss_functions.cc中找到。或者您可以按照kaggle.com上的说明将原始预测值初步缩放到 [0..1],1.f / (1.f + exp(- prediction)然后计算对数损失:

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)).

于 2014-11-06T20:42:39.007 回答