我已经开始使用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
现在,使用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
然后使用
vw -d data.txt -f demo_model.vw --loss_function logistic --invert_hash aaa
(与How to perform logistic regression using vowpal wabbit on very imbalanced dataset一致的命令行),我获得了一个非常不同的模型
L= -0.00094*age - 0.03857
。使用
-r
或-p
获得的预测值进一步证实了这一点。最终得出的概率几乎完全相同,例如,年龄= 20时为0.4857
,年龄= 80时为0.4716
,这是非常不正确的。我也注意到与大型数据集的这种不一致。 Vowpal Wabbit在什么意义上进行逻辑回归不同,如何解释结果?
最佳答案
这是vowpal兔子的常见误解。
不能将批处理学习与在线学习进行比较。
vowpal wabbit不是一个批量学习器。它是一个在线学习器。在线学习者通过一次查看一个示例并在进行过程中略微调整模型的权重进行学习。
在线学习有优点也有缺点。不利之处在于,最终模型的收敛是缓慢的/渐进的。学习者在从每个示例中提取信息时不会做“完美”的工作,因为该过程是迭代的。故意限制/减慢最终结果的收敛速度。这可能会使在线学习者在上述微小数据集上显得虚弱。
但是有几个好处:
在线学习者不需要将全部数据加载到内存中(他们通过一次检查一个示例并根据实时观察到的每个示例损失来调整模型来工作),因此他们可以轻松扩展到数十亿个示例。 A 2011 paper by 4 Yahoo! researchers描述了如何使用vowpal wabbit在1k节点上在1小时内从Tera(10 ^ 12)特征数据集中学习。用户经常使用vw
从台式机和笔记本电脑上的数十亿个示例数据集中学习。
在线学习是适应性的,可以跟踪条件随时间的变化,因此它可以从非平稳数据中学习,例如针对适应性对手的学习。
学习内省:一个can observe loss convergence rates while training并识别特定问题,甚至可以从特定数据集示例或功能中获得重要见识。
在线学习者可以渐进式学习,因此用户可以混合带有标签和未带标签的示例,以在进行预测的同时继续学习。
即使在训练期间,估计的误差也始终是“样本外”,这是good estimate of the test error。无需将数据拆分为训练和测试子集,也无需执行N向交叉验证。下一个(尚未看到)的示例始终用作保留。从操作方面来说,这是优于批处理方法的巨大优势。它极大地简化了典型的机器学习过程。此外,只要您不对数据进行多次遍历,它就可以作为避免过度拟合的良好机制。
在线学习者对示例顺序非常敏感。对于在线学习者来说,最糟糕的排序是将类聚类在一起(所有或几乎所有-1
首先出现,然后出现所有1
),就像上面的示例一样。因此,要从像vowpal wabbit这样的在线学习者中获得更好的结果,首先要做的是统一地对1
和-1
(或按时间顺序排序,因为这些示例通常出现在现实生活中)。
好吧,现在呢?
问:在使用在线学习器时,有什么办法可以产生合理的模型,从而对小数据给出合理的预测?
A:是的!
您可以通过以下两个简单的步骤来模拟批处理学习者的工作更紧密:
均匀地随机播放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
在您的数据集上给出以下更期望的结果:
-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
您可以通过增加/减少通过次数来使结果更多/更少极化(在年龄较大时更接近
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>
例如,通过将学习率从默认的
0.5
增加到一个较大的数字(例如10
),您可以在训练较小的数据集时强制vw
更快地收敛,从而需要更少的通行证才能到达那里。更新资料
从2014年中开始,
vw
不再需要外部logistic
实用程序将预测映射回[0,1]范围。新的--link logistic
选项将预测映射到逻辑函数[0,1]范围。类似地,--link glf1
将预测映射到广义逻辑函数[-1,1]范围。