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

     2023-02-16     87

关键词:

【中文标题】Vowpal Wabbit中逻辑回归的正确性?【英文标题】:Correctness of logistic regression in Vowpal Wabbit? 【发布时间】:2014-09-09 10:21:17 【问题描述】:

我已经开始使用 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

现在,使用 RSPSS 甚至手动对此数据集执行逻辑回归,生成一个看起来像 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得到的预测值进一步证实了这一点。得到的概率最终几乎完全相同,例如 0.4857 代表年龄=20,0.4716 代表年龄=80,这是非常偏离的。

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

【问题讨论】:

【参考方案1】:

这是对 vowpal wabbit 的常见误解。

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

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 路交叉验证。下一个(尚未见过的)示例始终用作保留。从操作方面来看,这是比批处理方法的巨大优势。它极大地简化了典型的机器学习过程。此外,只要您不对数据运行多次传递,它就可以作为一种很好的过拟合避免机制。

在线学习者对示例顺序非常敏感。对于在线学习者来说,最糟糕的顺序是当类聚集在一起时(所有或几乎所有-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

在您的数据集上给出这个更预期的结果:

-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] 范围。

【讨论】:

非常感谢您提出的精彩问题。几个月后重访,似乎帮助其他几位用户更好地理解了vowpal wabbit 我从vw 得到一个有线结果,当我添加--l1--l2 正则化时,我得到的所有预测都是0.5(这意味着所有特征都是0) @zihaolucky - 我猜是因为您的 --l1--l2 参数太大。尝试像--l1 1e-6 这样的小值。提示:--readable_model r.model 和查看 r.model 可以帮助确定在正则化后最终模型中还剩下多少特征。 @arielf 是的,我尝试了较小的惩罚,看起来还可以。但是它在测试集中的表现不会比没有 l1/l2 好。我在这里提出一个新问题***.com/questions/32752833/…

如何将 Vowpal Wabbit 逻辑预测转换为概率

】如何将VowpalWabbit逻辑预测转换为概率【英文标题】:HowtoconvertVowpalWabbitlogisticpredictionstoprobabilities【发布时间】:2015-09-2902:01:29【问题描述】:我给了vowpalwabbit一个带有两个标签的数据集,并用它进行了逻辑回归。问题是,它... 查看详情

Vowpal Wabbit:不平衡的类

】VowpalWabbit:不平衡的类【英文标题】:VowpalWabbit:unbalancedclasses【发布时间】:2016-02-0812:36:24【问题描述】:我想使用VowpalWabbit执行逻辑回归。如何处理不平衡的类(例如1000/50000)?我知道我可以使用重要性加权,但我不确定... 查看详情

Vowpal Wabbit 的梯度提升

】VowpalWabbit的梯度提升【英文标题】:GradientboostingonVowpalWabbit【发布时间】:2015-07-1214:11:02【问题描述】:有没有办法使用VowpalWabbit对回归使用梯度提升?我使用VowpalWabbit附带的各种有用的技术。我想尝试梯度提升,但我找不到... 查看详情

Vowpal Wabbit 多类线性分类

】VowpalWabbit多类线性分类【英文标题】:VowpalWabbitMulticlassLinearClassification【发布时间】:2016-09-2103:19:40【问题描述】:是否可以使用VowpalWabbit库训练多类(多项式)线性分类模型?我尝试将--oaa与--loss_function平方一起使用,但似... 查看详情

使用 Vowpal Wabbit 时计算 AUC

】使用VowpalWabbit时计算AUC【英文标题】:CalculatingAUCwhenusingVowpalWabbit【发布时间】:2014-08-0712:10:39【问题描述】:有没有在VowpalWabbit中计算AUC?我使用VowpalWabbit的原因之一是数据文件的大小。我可以使用VowpalWabbit的输出计算VowpalW... 查看详情

--oaa 2 和 --loss_function=logistic 在 Vowpal Wabbit 中的效果

】--oaa2和--loss_function=logistic在VowpalWabbit中的效果【英文标题】:Effectof--oaa2and--loss_function=logisticinVowpalWabbit【发布时间】:2014-08-3117:31:36【问题描述】:我应该在VW中使用哪些参数来执行二元分类任务?例如,让我们使用rcv1_small.d... 查看详情

Vowpal Wabbit - 精确召回 f 测量

】VowpalWabbit-精确召回f测量【英文标题】:VowpalWabbit-precisionrecallf-measure【发布时间】:2015-08-1108:16:33【问题描述】:您通常如何从VowpalWabbit中针对分类问题创建的模型获得准确率、召回率和f-measure?是否有任何可用的脚本或程序... 查看详情

在交叉验证方面需要一些关于 Vowpal Wabbit 的指示

】在交叉验证方面需要一些关于VowpalWabbit的指示【英文标题】:NeedsomepointersonVowpalWabbitwithrespecttocrossvalidation【发布时间】:2013-09-2108:21:07【问题描述】:我的目标是在参数空间中对各种VW模型进行网格搜索(尝试不同的损失函数... 查看详情

Vowpal Wabbit 如何表示分类特征

】VowpalWabbit如何表示分类特征【英文标题】:VowpalWabbithowtorepresentcategoricalfeatures【发布时间】:2015-04-2219:57:57【问题描述】:我有以下所有分类变量的数据:classeducationincomesocial_standing1basiclowgood0lowhighV_good1highlownot_good0v_highhighgood... 查看详情

Vowpal Wabbit:低秩矩阵分解?

】VowpalWabbit:低秩矩阵分解?【英文标题】:VowpalWabbit:Low-rankmatrixfactorization?【发布时间】:2016-12-2617:08:05【问题描述】:我有一个非常基本的问题。我想做低秩矩阵分解,我正在查看有关该主题的VowpalWabbitdocumentation。我的问题... 查看详情

使用 Vowpal wabbit 的上下文强盗

】使用Vowpalwabbit的上下文强盗【英文标题】:ContextualBanditusingVowpalwabbit【发布时间】:2015-08-0620:42:25【问题描述】:在这种情况下,输入之一是选择手臂/动作的概率,但我们如何找到该概率?找到这个概率本身不是一项艰巨的... 查看详情

vowpal-wabbit:使用多次通过、保持和保持期来避免过度拟合?

】vowpal-wabbit:使用多次通过、保持和保持期来避免过度拟合?【英文标题】:vowpal-wabbit:useofmultiplepasses,holdout,&holdout-periodtoavoidoverfitting?【发布时间】:2017-08-2920:01:27【问题描述】:我想使用很棒的vowpalwabbittool使用以下命令... 查看详情

使用 Vowpal Wabbit 获得未校准的概率输出,广告转化预测

】使用VowpalWabbit获得未校准的概率输出,广告转化预测【英文标题】:GettinguncalibratedprobabilityoutputswithVowpalWabbit,ad-conversionprediction【发布时间】:2016-10-0817:17:51【问题描述】:我正在尝试使用VowpalWabbit来预测广告展示的转化率,... 查看详情

由于 vowpal wabbit 对 boost 库的依赖而导致的错误

】由于vowpalwabbit对boost库的依赖而导致的错误【英文标题】:Errorsduetovowpalwabbit\'sdependenciesonboostlibrary【发布时间】:2012-07-1108:48:55【问题描述】:我正在努力安装vowpalwobbit,但当我运行make文件时它失败了,抛出:cdlibrary;make;cd..g... 查看详情

l1/l2 正则化导致 vowpal wabbit 中所有特征权重为零是不是合理?

】l1/l2正则化导致vowpalwabbit中所有特征权重为零是不是合理?【英文标题】:Isitreasonableforl1/l2regularizationtocauseallfeatureweightstobezeroinvowpalwabbit?l1/l2正则化导致vowpalwabbit中所有特征权重为零是否合理?【发布时间】:2015-12-2113:17:36【... 查看详情

Vowpal Wabbit 中的纠错锦标赛 (ect) 多类分类

】VowpalWabbit中的纠错锦标赛(ect)多类分类【英文标题】:ErrorCorrectingTournaments(ect)MultiClassClassificationinVowpalWabbit【发布时间】:2014-08-2718:05:29【问题描述】:我试图通过描述ECT算法的thispaper来了解它,但无法从中得到太多。我知道... 查看详情

Vowpal Wabbit 不预测二进制值,可能是过度训练?

】VowpalWabbit不预测二进制值,可能是过度训练?【英文标题】:VowpalWabbitnotpredictingbinaryvalues,maybeovertraining?【发布时间】:2016-11-2903:50:00【问题描述】:我正在尝试使用VowpalWabbit进行二进制分类,即给定特征值vw会将其分类为1或0... 查看详情

在守护进程模式下从 Vowpal Wabbit 获取原始预测

】在守护进程模式下从VowpalWabbit获取原始预测【英文标题】:GetrawpredictionsfromVowpalWabbitindaemonmode【发布时间】:2014-10-0613:54:59【问题描述】:我正在使用以下命令以守护程序模式启动VowpalWabbit:vw--loss_functionhinge--ect250--quiet--passes... 查看详情