我需要在一个包含大量训练样本的数据集上训练一个回归模型,并且可能需要加入任意特征。应该考虑哪些学习算法?为什么?
问题的简要概述:
- 大约500万个训练样本
- 每年增加200万到400万个训练样本
- 每个训练样本当前包含10个特征
- 大约40万个已填充的特征(在更大的总特征空间中)
- 随着时间的推移增加额外特征
- 至少每天重新训练或调整模型以纳入新样本
- 优化标准:最小平方百分比误差
- 输出:一个实数值
我有一些在类似规模的分类问题上训练对数线性模型的经验(使用SVM、平均和投票感知器等)。能够添加任意特征很重要,但在这种情况下,训练时间也很宝贵。
例如,我之前用SVMLight进行的一次实验,在这个数据的子集上花了几周时间才收敛。我们可以在一台多核机器上或(可能)在一个集群上进行并行处理,但我们需要在几分钟内训练模型。在线训练会更好。
我成功地(并且快速地)训练了一个平均感知器模型。然而,据我所知,AP通常不用于回归。对于回归模型,AP是否提供任何收敛保证?是否有其他正式的理由表明它不适用?还是它与我的需求相当匹配?
我应该研究哪些其他选项?SVM可能会提供更高的准确性,但二次训练时间是不可接受的。如果可以访问线性时间的SVM算法,那可能会很好。
潜在的优势:
- 在线训练
- 有开源实现(理想情况下是Java)。如果必要,我们可以自己实现,但如果可能,我会避免这样做。
感谢您的输入。
回答:
这是大规模SVM的经典问题。如果添加新特征或新数据(如果您不使用在线SVM),则需要重新训练SVM模型。一些选项:
实用选项(现成可用):
LIBLINEAR – 如果您可以使用线性SVM,有一些算法可以利用线性核来提供优于二次的训练时间。查看LIBLINEAR,它来自与libsvm相同的研究小组。他们在昨天发布的1.91版本中刚刚添加了回归功能。 http://www.csie.ntu.edu.tw/~cjlin/liblinear/
Oracle ODM – Oracle在其ODM包中提供了SVM。他们采取了一种实用的方法,基本上提供“足够好”的SVM,而不支付寻找真正最优解的计算成本。他们使用了一些抽样和模型选择技术 – 您可以在这里找到相关信息: http://www.oracle.com/technetwork/database/options/advanced-analytics/odm/overview/support-vector-machines-paper-1205-129825.pdf
SHOGUN – SHOGUN机器学习工具箱旨在进行大规模学习,它与许多SVM实现以及其他方法接口。我从未使用过它,但可能值得一看: http://www.shogun-toolbox.org
Kernel-machines.org 有一个软件包列表: http://www.kernel-machines.org/software
其他SVM研究
如果您想自己实现,有许多技术试图将SVM扩展到大型数据集,这些技术已在研究论文中发表,但代码不一定可用、可用或像上述例子那样得到维护。它们声称有良好的结果,但每种方法都有其自身的一套缺点。许多涉及进行某种程度的数据选择。例如,几篇研究论文使用线性时间聚类算法来聚类数据,并基于这些聚类训练连续的SVM模型,以便在不使用所有数据的情况下构建模型。核心向量机声称具有线性训练时间,但对于它们的准确性是否如他们声称的那样高存在一些批评。许多论文使用不同的启发式算法来尝试选择最可能的支持向量候选者。许多这些是用于分类的,但可能可以适应回归。如果您想了解更多关于这些研究的信息,我可以添加一些参考文献。
探索算法的工具
您可能已经熟悉这些,但我还是在这里提一下以防万一:
还有其他一些算法在大型数据集上具有良好的运行时间,但它们是否会工作得好很难说,这取决于您数据的构成。由于运行时间很重要,我会从较简单的模型开始,然后逐步过渡到更复杂的模型。ANN、决策树回归、贝叶斯方法、局部加权线性回归,或者像模型树这样的混合方法(决策树的叶节点是线性模型),都可以在大型数据集上比SVM更快地完成,并且可能会产生良好的结果。
WEKA – Weka是一个探索选项的好工具。我会使用Weka在不同算法中尝试您数据的子集。如果您选择了某些东西,源代码是开放的,并且是Java,您可以根据需要进行调整。 http://www.cs.waikato.ac.nz/ml/weka/
R – R编程语言也实现了许多算法,并且类似于在Matlab中编程。 http://www.r-project.org/
我不建议在大规模数据集上使用Weka或R,但它们是用来尝试缩小哪些算法可能适合您的有用工具。