liblinear实践初步

在相关推荐项目的改版中,对liblinear/fm/xgboost等主流成熟算法模型的训练效果进行了尝试和对比,并在一期改造中选择了liblinear实际上线使用。本文主要从工程应用的角度对liblinear涉及的各模式进行初步介绍,并给出liblinear/fm/xgboost的实际评测结果供参考。 (参考自http://blog.csdn.net/ytbigdata/article/details/52909685)

1.Liblinear说明

考虑到训练效率,本次选用的为多线程并行版liblinear,实际为liblinear-multicore-2.1-4,首先直接给出其train命令所支持的各模式说明,各模式选择不仅与我们使用liblinear工具直接相关,也对我们理解liblinear很有帮助,下面即主要围绕这些模式展开。

ParallelLIBLINEAR is only available for -s0,1,2,3,11 Now

Usage:train [options] training_set_file[model_file]

options:

-s type : set typeof solver (default 1)

formulti-class classification (dual对偶的, primal 原始的)

0 -- L2-regularized logisticregression (primal) ---逻辑回归

1 -- L2-regularized L2-losssupport vector classification (dual) ---线性svm

2 -- L2-regularized L2-loss supportvector classification (primal)--与1对应

3-- L2-regularized L1-loss support vector classification (dual)

4-- support vector classification by Crammer and Singer

5-- L1-regularized L2-loss support vector classification

6-- L1-regularized logisticregression

7-- L2-regularized logistic regression (dual)

forregression

11-- L2-regularized L2-loss support vector regression (primal)

12-- L2-regularized L2-loss support vector regression (dual)

13-- L2-regularized L1-loss support vector regression (dual)

1.1liblinear还是libsvm

既然是liblinear相关,不可免俗地会涉及到这个问题,当然其实这是个很大的命题,在此我们截取重点简单介绍。

首先,liblinear和libsvm都是国立台湾大学林智仁(Chih-Jen Lin)老师团队开发的,libsvm早在2000年就已经发布,liblinear则在2007年才发布首个版本。

在原理和实现上存在差别,libsvm是一套完整的svm实现,既包含基础的线性svm,也包含核函数方式的非线性svm;liblinear则是针对线性场景而专门实现和优化的工具包,同时支持线性svm和线性Logistic Regression模型由于libsvm支持核函数方式实现非线性分类器,理论上,libsvm具有更强的分类能力,应该能够处理更复杂的问题。

但是,libsvm的训练速度是个很大的瓶颈,按一般经验,在样本量过万后,libsvm就比较慢了,样本量再大一个数量级,通常的机器就无法处理了;而liblinear设计初衷就是为了解决大数据量的问题,正因为只需要支持线性分类,liblinear可以采用与libsvm完全不一样的优化算法,在保持线性svm分类时类似效果的同时,大大降低了训练计算复杂度和时间消耗。

同时,在大数据背景下,线性分类和非线性分类效果差别不大,尤其是在特征维度很高而样本有限的情况下,核函数方式有可能会错误地划分类别空间,导致效果反而变差。林智仁老师也给出过很多实际例子证明,人工构造特征+线性模型的方式可以达到甚至超过kernel SVM的表现,同时大大降低训练的时间和消耗的资源。

关于实际时间对比,liblinear作者官方给出了以下数据:对于LIBSVM数据集中某实例"20242个样本/47236个特征",在保持交叉验证的精度接近的情况下,liblinear仅耗时约3秒,远远小于libsvm的346秒。

% timelibsvm-2.85/svm-train -c 4 -t 0 -e 0.1 -m 800 -v 5rcv1_train.binary

CrossValidation Accuracy = 96.8136%

345.569s

% timeliblinear-1.21/train -c 4 -e 0.1 -v 5rcv1_train.binary

CrossValidation Accuracy = 97.0161%

2.944s

1.2具体solver的选择?线性svm还是logisticregression/L1正则化项还是L2正则化项

liblinear支持多种solver模式,以下直接列举liblinear支持的几种典型solver模式对应的结构风险函数(结构风险函数由损失函数和正则化项/罚项组合而成,实际即为求解结构风险函数最小值的最优化问题),以方便说明和理解。

L2-regularizedL1-loss Support VectorClassification


L2-regularizedL2-loss Support Vector Classification


L1-regularizedL2-loss Support Vector Classification


L2-regularized Logistic Regression


L1-regularized Logistic Regression


Liblinear中同时支持线性svm和logisticregression,两者最大区别即在于损失函数(loss function)不同,损失函数是用来描述预测值f(X)与实际值Y之间差别的非负实值函数,记作L(Y,f(X)),即上述公式中的项。

另一个重要选择是正则化项。正则化项是为了降低模型复杂度,提高泛化能力,避免过拟合而引入的项。当数据维度很高/样本不多的情况下,模型参数很多,模型容易变得很复杂,表面上看虽然极好地通过了所有样本点,但实际却出现了很多过拟合,此时则通过引入L1/L2正则化项来解决。

一般情况下,L1即为1范数,为绝对值之和;L2即为2范数,就是通常意义上的模。L1会趋向于产生少量的特征,而其他的特征都是0,即实现所谓的稀疏,而L2会选择更多的特征,这些特征都会接近于0。

对于solver的选择,作者的建议是:一般情况下推荐使用线性svm,其训练速度快且效果与lr接近;一般情况下推荐使用L2正则化项,L1精度相对低且训练速度也会慢一些,除非想得到一个稀疏的模型(个人注:当特征数量非常大,稀疏模型对于减少在线预测计算量比较有帮助)。

1.3primal还是dual

primal和dual分别对应于原问题和对偶问题的求解,对结果是没有影响的,但是对偶问题可能比较慢。作者有如下建议:对于L2正则-SVM,可以先尝试用dual求解,如果非常慢,则换用primal求解。

网上另一个可参考的建议是:对于样本量不大,但是维度特别高的场景,如文本分类,更适合对偶问题求解;相反,当样本数非常多,而特征维度不高时,如果采用求解对偶问题,则由于Kernel Matrix过大,求解并不方便。反倒是求解原问题更加容易。

1.4训练数据是否要归一化

对于这点,作者是这样建议的:在他们文档分类的应用中,归一化不但能大大减少训练时间,也能使得训练效果更好,因此我们选择对训练数据进行归一化。同时在实践中,归一化使得我们能直接对比各特征的公式权重,直观地看出哪些特征比较重要。

2.liblinear及fm/xgboost实际效果对比记录

本轮改造中,主要实际尝试了liblinear各模式的效果,也同时对业界常用的fm/xgboost进行了对比测试,以下一并列出供参考。

注:由于liblinear尚为单机训练,受内存限制,不能加载全量数据训练,因此后续针对训练数据量多少(1/120->1/4->1/2)也有专门实验;

5,xgboost效果总结

xgboost的全称是eXtreme Gradient Boosting,它是GradientBoosting Machine的一个c++实现,作者为华盛顿大学研机器学习的大牛陈天奇。传统GBDT以CART作为基分类器,xgboost还支持线性分类器,它能够自动利用cpu的多线程进行并行,同时在算法上加以改进提高了精度,在kaggle等数据竞赛平台社区知名度很高。

在测试中,xgboost确实表现出了实力,仅用默认参数配置和1/120小数据量(约200万样本),就达到了0.8406的超出所有liblinear效果的AUC;受时间限制,当前并未直接采用xgboost,后续有同事进一步跟进。

LibLinear使用总结L1,L2正则的更多相关文章

  1. Java正则表达式API边界匹配

    这篇文章主要介绍了Java正则表达式API边界匹配,文章围绕主题展开相应的相关资料,具有一定的参考价值,需要的朋友可以参考一下

  2. PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析

    这篇文章主要介绍了PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法,结合具体实例形式分析了preg_replace()报错的原因与相关解决技巧,需要的朋友可以参考下

  3. PHP正则删除html代码中a标签并保留标签内容的方法 原创

    这篇文章主要介绍了PHP正则删除html代码中a标签并保留标签内容的方法,涉及php基于正则的字符串匹配与子表达式操作相关技巧,需要的朋友可以参考下

  4. php正则删除html代码中class样式属性的方法 原创

    这篇文章主要介绍了php正则删除html代码中class样式属性的方法,涉及php字符串正则匹配相关操作技巧,需要的朋友可以参考下

  5. PHP正则匹配到2个字符串之间的内容方法

    今天小编就为大家分享一篇PHP正则匹配到2个字符串之间的内容方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  6. IOS正则表达式之验证密码身份证手机号

    这篇文章主要介绍了IOS正则表达式之验证密码身份证手机号的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

  7. 正则表达式在js前端的15个使用场景梳理总结

    本篇带来15个正则使用场景,按需索取,收藏恒等于学会!!有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. 详解JavaScript高级正则表达式

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  9. JS不用正则验证输入的字符串是否为空(包含空格)的实现代码

    下面小编就为大家带来一篇JS不用正则验证输入的字符串是否为空(包含空格)的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. jQuery插件form-validation-engine正则表达式操作示例

    这篇文章主要介绍了jQuery插件form-validation-engine正则表达式操作,结合实例形式分析了jQuery插件form-validation-engine进行正则验证操作的相关技巧,需要的朋友可以参考下

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部