如何在非常不平衡的数据集上使用vowpal wabbit进行逻辑回归

 Mr_JJwonG05 发布于 2023-01-04 15:10

我正在尝试使用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))输出.但我得到全零.我只需要概率输出.有什么建议会发生什么事吗?

2 个回答
  • 在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 | ...
       1  | ...  # repeated, very rare, example
       -1 | ...
       1  | ...  # repeated, very rare, example
    

    在更平稳的收敛和更低的训练损失方面应该会产生更好的结果.*警告:作为一般规则,重复任何例子太多,例如在1:2000比率的情况下,很可能导致过度拟合重复的类.您可能希望通过较慢的学习(使用--learning_rate ...)和/或随机重采样来对抗:(使用--bootstrap ...)

    考虑对流行类进行下采样

    为了避免过度拟合:而不是将稀有类增加2000倍,考虑采用相反的方式,并通过抛弃大多数示例来"减轻"更常见的类.虽然这可能听起来令人惊讶(如何抛弃完美的好数据是有益的?)它将避免如上所述的重复类的过度拟合,并且实际上可能导致更好的泛化.根据情况和错误分类的成本,最佳下采样因子可能会有所不同(在这种情况下不一定是1/2000,但可能在1到1/2000之间).另一种需要编程的方法是使用主动学习:训练一小部分数据,然后继续预测课程而不学习(-t或零重量); 如果该类是普遍的类并且在线分类器非常确定结果(预测值是极端的,或者-1在使用时非常接近--link glf1),则抛弃冗余的示例.IOW:仅将训练集中在边界情况上.


    使用--binary(取决于您的需要)

    --binary输出预测的符号(并相应地计算累进损失).如果需要概率,请不要使用--binary和管道vw预测输出utl/logistic(在源树中). utl/logistic将原始预测映射到范围内的签名概率[-1, +1].

    一种影响--binary是误导(乐观)损失.将预测钳位到{-1,+ 1}可以显着提高表观准确度,因为每个正确的预测都有0.0的损失.这可能会产生误导,因为只是添加--binary经常会使模型看起来更准确(有时非常准确)而不是没有--binary.

    更新(2014年9月):最近添加了一个新选项vw:在内部预测时--link logistic实现[0,1]映射vw.同样,--link glf1实现更常用的[-1, 1]映射.助记符:glf1代表"带[-1, 1]范围的广义逻辑函数"

    去容易对--l1--l2

    使用高值--l1和/或--l2值是一个常见的错误.这些值直接用于每个示例,而不是相对于1.0.更确切地说:在vw:l1并且l2直接应用于每个示例中的梯度(或"范数").尝试使用更低的值,例如--l1 1e-8. utl/vw-hypersearch可以帮助您找到各种超参数的最佳值.

    多次通过要小心

    使用这是一个常见的错误,--passes 20以尽量减少训练错误.请记住,目标是最小化泛化错误而不是训练错误.即使有一个很酷的添加holdout(感谢Zhen Qin),vw当错误停止在自动保持数据上时自动提前终止(默认情况下每个第10个示例都被保持),多次通过最终会开始过度拟合持有的数据("无免费午餐"原则).

    2023-01-04 15:13 回答
  • 总结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
      

    2023-01-04 15:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有