我正在尝试使用vowpal wabbit进行逻辑回归。我不确定这是否是正确的语法
For training, I do
./vw -d ~/Desktop/new_data.txt --passes 20 --binary --cache_file cache.txt -f lr.vw --loss_function logistic --l1 0.05
For testing I do
./vw -d ~/libsvm-3.18_test/matlab/new_data_test.txt --binary -t -i lr.vw -p predictions.txt -r raw_score.txt
以下是我的火车数据的摘录
-1:1.00038 | 110:0.30103 262:0.90309 689:1.20412 1103:0.477121 1286:1.5563 2663:0.30103 2667:0.30103 2715:4.63112 3012:0.30103 3113:8.38411 3119:4.62325 3382:1.07918 3666:1.20412 3728:5.14959 4029:0.30103 4596:0.30103
1:2601.25 | 32:2.03342 135:3.77379 146:3.19535 284:2.5563 408:0.30103 542:3.80618 669:1.07918 689:2.25527 880:0.30103 915:1.98227 1169:5.35371 1270:0.90309 1425:0.30103 1621:0.30103 1682:0.30103 1736:3.98227 1770:0.60206 1861:4.34341 1900:3.43136 1905:7.54141 1991:5.33791 2437:0.954243 2532:2.68664 3370:2.90309 3497:0.30103 3546:0.30103 3733:0.30103 3963:0.90309 4152:3.23754 4205:1.68124 4228:0.90309 4257:1.07918 4456:0.954243 4483:0.30103 4766:0.30103
以下是我的测试数据
的摘录-1 | 110:0.90309 146:1.64345 543:0.30103 689:0.30103 1103:0.477121 1203:0.30103 1286:2.82737 1892:0.30103 2271:0.30103 2715:4.30449 3012:0.30103 3113:7.99039 3119:4.08814 3382:1.68124 3666:0.60206 3728:5.154 3960:0.778151 4309:0.30103 4596:0.30103 4648:0.477121
但是,如果我查看结果,预测都是-1,原始分数都是0。我有大约200,000个例子,其中100个是+1,其余的是-1。为了处理这种不平衡的数据,我给出了正面示例权重为200,000 / 100,负示例权重为200,000 /(200000-100)。是因为我的数据非常不平衡,即使我调整了这种情况的权重吗?
我期待原始乐谱文件中的(P(y | x))输出。但我得到全零。我只需要概率输出。有什么建议会发生什么事吗?
答案 0 :(得分:48)
在vw邮件列表上发布了一个类似的问题。为了未来用户的利益,我将尝试总结所有回复中的要点。
不平衡培训设定了最佳做法:
您的训练集非常不平衡(200,000到100)。这意味着只有0.0005(0.05%)的例子具有1
的标签。通过始终预测-1
,分类器实现了99.95%的显着准确度。换句话说,如果假阳性的成本等于假阴性的成本,那么这实际上是一个很好的分类器。如果您正在寻找等权重结果,则需要做两件事:
第二点在学习率随时间衰减的在线学习中尤为重要。因此,理想的顺序,假设你被允许自由重新排序(例如,例子之间没有时间依赖性),在线学习是完全统一的随机播放(1, -1, 1, -1, ...)
另请注意,示例权重的语法(假设2000:1流行率)需要如下所示:
1 2000 optional-tag| features ...
-1 1 optional-tag| features ...
如上所述,将单个2000
加权示例分解为仅重复1
,同时重复2000次,并将其与2000个常见示例({{1标签)而不是:
-1
在更平稳的收敛和更低的训练损失方面应该会产生更好的结果。 *警告:作为一般规则重复任何一个例子太多,比如在1:2000比率的情况下, 很可能 导致过度拟合重复的类。您可能希望通过较慢的学习(使用 1 | ...
-1 | ...
1 | ... # repeated, very rare, example
-1 | ...
1 | ... # repeated, very rare, example
)和/或随机重采样来解决这个问题:(使用--learning_rate ...
)
考虑对流行类进行下采样
为了避免过度拟合:而不是将稀有级别超过2000倍,考虑采取相反的方式,并且“减重”#34;抛弃大多数例子,这是一个更常见的类。虽然这可能听起来令人惊讶(如何抛弃完美的数据是有益的?)它将避免如上所述重复类的过度拟合,并且实际上可能导致 更好的泛化 。根据情况和错误分类的成本,最佳下采样因子可能会有所不同(在这种情况下不一定是1/2000,但可能在1到1/2000之间)。另一种需要编程的方法是使用主动学习:训练一小部分数据,然后继续预测课程而不学习(--bootstrap ...
或零权重);如果该类是流行的类和,则在线分类器非常确定结果(使用-t
时预测值极端,或非常接近-1
),抛出多余的例子。 IOW:仅将您的培训重点放在边界案例上。
--link glf1
的使用(取决于您的需要)
--binary
输出预测的符号(并相应地计算累进损失)。如果您需要概率,请不使用--binary
并将--binary
预测输出传递到vw
(在源树中)。 utl/logistic
会将原始预测映射到utl/logistic
范围内的已签名概率。
[-1, +1]
的一个影响是误导(乐观)损失。将预测钳制到{-1,+ 1}可以显着提高明显的准确度,因为每个正确的预测都会丢失0.0。这可能会产生误导,因为只添加--binary
通常会使模型看起来比没有--binary
更准确(有时非常准确)。
更新(2014年9月):最近在--binary
添加了一个新选项:vw
实现--link logistic
映射,同时预测{{1} }}。同样,[0,1]
实现了更常用的vw
映射。助记符:--link glf1
代表"广义逻辑函数,[-1, 1]
范围"
在glf1
和[-1, 1]
使用高--l1
和/或--l2
值是一个常见的错误。这些值直接用于每个示例,而不是相对于--l1
。更确切地说:在--l2
:1.0
和vw
直接应用于每个示例中的渐变之和(或#34; norm") 。尝试使用更低的值,例如l1
。 l2
可以帮助您找到各种超参数的最佳值。
小心多次通过
使用--l1 1e-8
来减少训练错误是一个常见的错误。请记住,目标是最小化泛化错误而不是训练错误。即使添加了utl/vw-hypersearch
(感谢Zhen Qin),--passes 20
在错误停止自动保持数据时会自动提前终止(默认情况下,每个第10个示例都被保留) ,多次通过最终将开始过度拟合保留的数据("没有免费午餐"原则)。
答案 1 :(得分:17)
总结arielf的详细答案。
了解预期的最终成本(损失)函数非常重要: 物流损失,0/1损失(即准确度),F1得分,RO曲线下面积等等?
以下是arielf答案部分的Bash代码。 请注意,我们应该首先从train.txt中删除重要性加权的奇怪尝试(我的意思是“: 1.00038 ”和“:2601.25”)。
A. Prepare the training data
grep '^-1' train.txt | shuf > neg.txt
grep '^1' train.txt | shuf > p.txt
for i in `seq 2000`; do cat p.txt; done > pos.txt
paste -d '\n' neg.txt pos.txt > newtrain.txt
B. Train model.vw
# Note that passes=1 is the default.
# With one pass, holdout_off is the default.
`vw -d newtrain.txt --loss_function=logistic -f model.vw`
#average loss = 0.0953586
C. Compute test loss using vw
`vw -d test.txt -t -i model.vw --loss_function=logistic -r
raw_predictions.txt`
#average loss = 0.0649306
D. Compute AUROC using http://osmot.cs.cornell.edu/kddcup/software.html
cut -d ' ' -f 1 test.txt | sed -e 's/^-1/0/' > gold.txt
$VW_HOME/utl/logistic -0 raw_predictions.txt > probabilities.txt
perf -ROC -files gold.txt probabilities.txt
#ROC 0.83484
perf -ROC -plot roc -files gold.txt probabilities.txt | head -n -2 > graph
echo 'plot "graph"' | gnuplot -persist