R中的内存高效分类器,用于极宽且不太长的训练集

Posted

技术标签:

【中文标题】R中的内存高效分类器,用于极宽且不太长的训练集【英文标题】:Memory efficient classifiers in R for extremely wide and not too long training set 【发布时间】:2013-05-23 23:40:40 【问题描述】:

训练数据集非常广泛(大约 200K 特征)并且非常短(数百个)。显然数据集占用了大量内存,但 R 读取它没有问题。

然后我训练了随机森林分类器,它的内存不足。所以我改用更简单的分类器,比如朴素贝叶斯。 NB也导致内存不足。

一般来说,最节省内存的分类器是什么?我怀疑逻辑回归和朴素贝叶斯应该列入名单......

UPD:

在使用随机森林之前,我最终使用了特征缩减方法。包caret 可以提供帮助,但在我的情况下,变量的初始数量没有帮助。

使用的功能缩减:

方差阈值过滤器(去除方差低于阈值的特征); 特征与预测值之间的相关性:移除了相关性较低的特征; 特征成对相关性:去除高成对相关性特征。

【问题讨论】:

你是如何努力让随机森林在 R 中高效运行的?并非所有默认设置都适用于像您这样的数据。 要补充 joran 所说的内容,我建议您在 randomForest(x, y,...) 公式中使用以下选项:ntreemtrynodesizemaxnodes。所有这些都会影响随机森林的构建速度。从您对数据集的简要描述来看,我想说您可能想尝试减少 mtry 并增加 nodesizemaxnodes 我确实感谢对随机森林的帮助,但我仍然希望看到其他分类器建议。 【参考方案1】:

glmnet 包可以处理稀疏矩阵,并且比集成更节省内存,但仍提供变量选择(通过套索/弹性网络)。代码可能如下所示:

library(glmnet)
df <- read.csv() #data
X <- sparse.model.matrix( ~ . - y, df) #Matrix with all variables in df except the y variable.
y <- df$y
model <- cv.glmnet(X, y, nfolds = 10, family='binomial' )

【讨论】:

【参考方案2】:

内存效率最高的算法是基于online learning 的算法(它不会将整个数据集加载到内存中,而是一次学习一个实例)和feature hashing,也称为散列技巧(它可以转通过使用散列将任意大的特征向量变为预定义/固定大小)。逻辑回归和线性 SVM 都具有在线学习和基于特征散列的实现(归结为分别优化逻辑损失或铰链损失)。

我不知道 R 中的实现(可能有,只是不太了解 R 库),但使用这些技术的一个非常扎实且广泛使用的学习者是 Vowpal Wabbit。它们也在Scikit-Learn 中实现。

【讨论】:

【参考方案3】:

Here is a paper 来自康奈尔计算机科学系,比较不同分类器的功效。它没有进入速度,但它超越了当今广泛使用的几乎所有分类算法的预测能力。最快的将是不是集成学习分类器的算法。任何构建多个模型并对结果进行平均的算法本质上都需要更长的时间。但是,如 pg 的表 2 所示。 5、最有效的分类器是集成技术。如果您想尽可能快地构建模型,那么您可能应该只使用单个决策树或逻辑回归。否则,您应该花一些时间了解集成学习技术并弄清楚如何优化该特定算法的速度。我使用类似于this 的技术并行化我的随机森林得到了很好的结果。

编辑以更准确地解决您的内存问题:内存使用量与您选择的哪种算法无关,而与您如何使用该算法有关。假设您对原始模型使用默认的随机森林调用,您将构建 500 个决策树,每个决策树具有约 450 个预测变量和与样本中的数据点一样多的终端节点。这将占用大量内存。我要说明的一点是,您可以调整任何这些分类模型以占用更少的内存并在 R 中更有效地运行。然而,如前所述,非集成技术(逻辑回归、朴素贝叶斯、CHAID/CART /etc 决策树)将默认使用最少的内存。

【讨论】:

我从来没有问过分类器的一般效率和速度——只问过 R 中的内存效率。我确实对集成分类器有很好的了解。不过感谢您的指点。 我的回答措辞不佳,但根据我的经验,速度问题归结为模型构建中的内存问题。当您在 200 多个预测变量上构建随机森林而不更改任何默认选项时,您实际上构建了 500 个模型(这是默认的树数,如 on p. 17 of the documentation 所示)。这些模型都存储在内存中,然后平均为您提供最终输出。如果您对参数不小心,这些技术中的任何一种都可能会占用内存...... 制作“200k+ 预测变量”

以上是关于R中的内存高效分类器,用于极宽且不太长的训练集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R 中经过训练的分类器预测新数据集?

如何在 Sklearn 的随机森林分类器中将训练模型用于另一个数据集?

如何找到分类器允许的最大训练集?

R中的朴素贝叶斯分类器仅预测一个类

R中的一类SVM分类

朴素贝叶斯分类器(MNIST数据集)