【问题标题】:Feature selection on subsets of feature set特征集子集的特征选择
【发布时间】:2017-01-21 00:52:55
【问题描述】:

我正在尝试使用 R 中的 Boruta 包进行功能选择。问题是我的功能集太大(70518 个功能),因此数据框太大(2Gb)并且无法由 Boruta 包处理立刻。我想知道我是否可以将数据框分成几组,每组都包含少量的特征?这对我来说听起来有点奇怪,因为如果不是所有特征都存在,我不确定算法是否能正确识别权重。 如果没有,如果有人能提出另一种方法,我将不胜感激。

【问题讨论】:

  • 你有多少条记录?
  • 我有 1157 个实例和 70518 个功能。其中我使用 786 作为训练集,使用 371 进行测试
  • 您最好取一半的实例再试一次。我认为您应该将所有功能放在一起。然而,Keith 已经建议使用 caret 包。应该可以使用您拥有的数据框大小进行特征选择。否则,您可以考虑执行单变量过滤器,例如:方差过滤以在您进行真正的特征选择之前进行特征预选。只是为了降低维度。

标签: r classification feature-selection


【解决方案1】:

我认为在这种情况下你最好的办法可能是首先尝试过滤掉一些信息量低(例如~零方差)或高度相关的特征。

caret packagesome useful functions to help with this

例如,findCorrelation() 可用于轻松删除冗余功能:

dat <- cor(dat, method='spearman')
dat[is.na(dat)] <- 0

features_to_ignore <- findCorrelation(dat, cutoff=0.75, verbose=FALSE)
dat <- dat[,-features_to_ignore]

这将删除 Spearman 相关性为 0.75 或更高的所有特征。

【讨论】:

  • 谢谢,但同样,这不适用于大型数据集。拆分会影响什么吗?
  • 直观地说,拆分数据不会完全有效。例如,如果两个高度相关的特征最终位于不同的分区中,则它们不会被排除在分析之外。数据集太大而无法立即保存在内存中的问题是什么?还是特别是 Boruta 包内存不足?
  • 它太大了,无法一次保存在内存中。抱歉不清楚
  • 在这种情况下,假设您无法访问具有更多内存的机器,您可能会考虑对行进行随机子采样(使用sample() 函数),尽可能多以适应记忆。可以肯定的是,您可以使用不同的样本多次重复该过程,然后在所有(或部分)样本中过滤出变量的交集。
  • 另外,另一种可行的方法是迭代过滤特征。正如我在上面的第一条评论中提到的那样,过滤在单个分区中不会有效,因为它可能错过相关特征等,但假设能够过滤掉每个分区中的相关/低方差特征分区,然后您可以重新组合过滤的数据集并重做特征选择。如有必要,您可以重复多次以慢慢恢复到完整的组合数据集。
【解决方案2】:

我将首先问你为什么相信这甚至可以工作?在这种情况下,不仅是p &gt;&gt; n,而且是p &gt;&gt;&gt;&gt;&gt;&gt; n。你总是会发现虚假的关联。更重要的是,即使你可以做到这一点(比如通过在云计算服务中租用足够大的机器,这是我建议的方法),你正在寻找一个荒谬的计算量,因为计算复杂性构建单个决策树是O(n * v log(v)),其中n 是记录数,v 是每条记录中的字段数。为每棵树构建一个 RF 需要这么多。

您可能希望从头开始重新考虑问题,而不是按照所述解决问题。您真正想在这里做什么?你能回到最初的原则并重新考虑吗?

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2016-03-16
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2014-02-05
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多