Vowpal Wabbit中逻辑回归的正确性?

sli*_*ing 15 vowpalwabbit logistic-regression

我已经开始使用Vowpal Wabbit进行逻辑回归,但是我无法重现它给出的结果.也许它有一些无证的"魔法",但有没有人能够复制/验证/检查逻辑回归的计算?

例如,通过下面的简单数据,我们的目标是模拟age预测的方式label.很明显,当年龄增加观察到1增加的可能性时,存在强烈的关系.

作为一个简单的单元测试,我使用了下面的12行数据:

age label
20  0
25  0
30  0
35  0
40  0
50  0
60  1
65  0
70  1
75  1
77  1
80  1
Run Code Online (Sandbox Code Playgroud)

现在,使用R,SPSS或甚至手动对此数据集执行逻辑回归,生成一个看起来像的模型 L = 0.2294*age - 14.08.因此,如果我使用年龄,并使用logit变换prob = 1 /(1 + EXP(-L)),我可以获得预测的概率,其范围从0.0001第一行到0.9864最后一行,如合理预期的那样.

如果我在Vowpal Wabbit插入相同的数据,

-1 'P1 |f age:20
-1 'P2 |f age:25
-1 'P3 |f age:30
-1 'P4 |f age:35
-1 'P5 |f age:40
-1 'P6 |f age:50
1 'P7 |f age:60
-1 'P8 |f age:65
1 'P9 |f age:70
1 'P10 |f age:75
1 'P11 |f age:77
1 'P12 |f age:80
Run Code Online (Sandbox Code Playgroud)

然后使用执行逻辑回归

vw -d data.txt -f demo_model.vw --loss_function logistic --invert_hash aaa
Run Code Online (Sandbox Code Playgroud)

(命令行具有一致的如何使用上非常不平衡数据集vowpal wabbit来执行逻辑回归),I得到的模型L= -0.00094*age - 0.03857,这是非常不同的.

使用-r-p进一步证实这一点获得的预测值.由此产生的概率几乎全部相同,例如0.4857年龄= 20, 0.4716年龄= 80,这是极其偏离的.

我也注意到这与大型数据集的不一致.在什么意义上,Vowpal Wabbit以不同方式执行逻辑回归,以及如何解释结果?

ari*_*elf 37

这是对vowpal wabbit的常见误解.

无法将批量学习与在线学习进行比较.

vowpal wabbit不是批量学习者.这是一个在线学习者.在线学习者通过一次查看一个示例并稍微调整模型的权重来学习.

在线学习有优点和缺点.缺点是最终模型的收敛是缓慢/渐进的.学习者在从每个示例中提取信息时不会做"完美"的工作,因为该过程是迭代的.最终结果的收敛是故意克制/缓慢的.这可能使在线学习者在如上所述的微小数据集上看起来很弱.

但有几个好处:

  • 在线学习者不需要将完整数据加载到内存中(它们通过一次检查一个示例并根据实例观察到的每个示例丢失来调整模型),因此它们可以轻松扩展到数十亿个示例.雅虎2011年的一篇论文 研究人员描述了如何使用vowpal wabbit在1k节点上1小时内从tera(10 ^ 12)特征数据集中学习.用户经常使用vw他们的台式机和笔记本电脑上的数十亿示例数据集来学习.
  • 在线学习具有适应性,可以随时跟踪条件的变化,因此可以从非固定数据中学习,例如学习对抗自适应对手.
  • 学习内省:人们可以在训练和识别特定问题时观察损失收敛率,甚至可以从特定的数据集示例或特征中获得重要的见解.
  • 在线学习者可以逐步学习,因此用户可以混合带标签和未标记的示例,以便在同时预测时保持学习.
  • 即使在训练期间,估计的误差总是"样本外",这是对测试误差良好估计.无需将数据拆分为训练和测试子集或执行N路交叉验证.下一个(但未见过的)示例始终用作保留.与操作方面的批处理方法相比,这是一个巨大的优势.它极大地简化了典型的机器学习过程.此外,只要您不对数据执行多次传递,它就会成为一种非常过度的避免机制.

在线学习者对示例顺序非常敏感.在线学习者最糟糕的顺序是当课程聚集在一起时(所有或几乎所有,-1s首先出现,然后是所有1s),就像上面的例子一样.因此,要像在线学习者如vowpal wabbit获得更好的结果,要做的第一件事就是统一改变1s和-1s(或者简单地按时间排序,因为这些例子通常出现在现实生活中).


好现在怎么样?

问:有没有办法产生一个合理的模型,因为它在使用在线学习者时可以对小数据做出合理的预测?

答:是的,有!

通过两个简单的步骤,您可以模拟批处理学习者更紧密的工作:

  • 统一洗牌 1-1例子.
  • 对数据运行多次传递,使学习者有机会收敛

警告:如果你运行多次传递直到错误变为0,则存在过度拟合的危险.在线学习者已经完美地学习了您的示例,但它可能无法很好地概括为看不见的数据.

这里的第二个问题是预测vw给出的不是逻辑函数转换(这是不幸的).它们类似于中间点的标准偏差(在[-50,50]处截断).您需要通过utl/logistic(在源树中)管道预测以获得签名概率.请注意,这些签名概率在[-1,+ 1]范围内,而不是[0,1].您可以使用logistic -0而不是logistic将它们映射到[0,1]范围.

因此,鉴于上述情况,这里的配方可以为您提供更多预期结果:

# Train:
vw train.vw -c --passes 1000 -f model.vw --loss_function logistic --holdout_off


# Predict on train set (just as a sanity check) using the just generated model:
vw -t -i model.vw train.vw -p /dev/stdout | logistic | sort -tP -n -k 2
Run Code Online (Sandbox Code Playgroud)

为您的数据集提供更多预期结果:

-0.95674145247658 P1
-0.930208359811439 P2
-0.888329575506748 P3
-0.823617739247262 P4
-0.726830630992614 P5
-0.405323815830325 P6
0.0618902961794472 P7
0.298575998150221 P8
0.503468453150847 P9
0.663996516371277 P10
0.715480084449868 P11
0.780212725426778 P12
Run Code Online (Sandbox Code Playgroud)

您可以通过增加/减少传球次数来使结果更多/更少偏振(更接近1老年人,更接近-1年轻人).您可能还对以下培训选项感兴趣:

--max_prediction <arg>     sets the max prediction to <arg>
--min_prediction <arg>     sets the min prediction to <arg>
-l <arg>                   set learning rate to <arg>
Run Code Online (Sandbox Code Playgroud)

例如,通过将学习速率从默认值提高0.5到大数(例如10),您可以vw在训练小数据集时强制收敛更快,因此需要更少的传递才能到达那里.

更新

截至2014年中期,vw不再需要外部logistic实用程序将预测映射回[0,1]范围.新--link logistic选项将预测映射到逻辑函数[0,1]范围.类似地--link glf1将预测映射到广义逻辑函数[-1,1]范围.