我在 R 和特征选择方面有点新手,并且尝试了 Boruta 包来选择(减少)我的变量数量(n = 40)。我认为这种方法也考虑了变量之间可能存在的相关性,但是,(选择的 20 个变量中)有两个是高度相关的,另外两个是完全相关的。这是正常的吗?Boruta 方法不应该将两者之一归类为不重要的吗?
Boruta 特征选择(在 R 中)是否考虑了变量之间的相关性?
... ,两个(选择的 20 个变量中的)高度相关,另外两个完全相关。这是正常的吗?Boruta 方法不应该将两者之一归类为不重要的吗?
是的,这很正常。Boruta 倾向于找到与响应变量相关的所有特征。严格地说,如果和在给定一些其他预测变量的情况下不是条件独立的(或者什么都不给定,这仅意味着和不独立) ,则称
考虑这个简单的例子:
set.seed(666)
n <- 100
x1 <- rnorm(n)
x2 <- x1 + rnorm(n,sd=0.5)
x3 <- rnorm(n)
y <- x2 + rnorm(n)
您会看到,然后与相关,因为和不是独立的。您还看到然后不独立于。无关的变量是,因为:
- 和是独立的
- 和的情况下是条件独立的
- 和是条件独立给定的
然后 Boruta 找到了预期的结果:
> library(Boruta)
> Boruta(data.frame(x1,x2,x3), y)
Boruta performed 30 iterations in 2.395286 secs.
2 attributes confirmed important: x1, x2.
1 attributes confirmed unimportant: x3.
和之间存在高度相关性,但 Boruta 并不介意:
> cor(x1,x2)
[1] 0.896883
它在于算法的本质。让我们假设我们有两个强相关的有意义的特征和。
从论文http://arxiv.org/abs/1106.5112(The All Relevant Feature Selection using Random Forest, Miron B. Kursa, Witold R. Rudnicki)我们可以对 boruta 算法做一个简短的描述:
“为了解决这个问题,我们开发了一种算法,它提供了选择重要属性的标准。该算法源于随机森林的精神——我们通过向系统添加更多随机性来应对问题。基本思想非常简单:我们制作系统的随机副本,将副本与原始系统合并并为该扩展系统构建分类器。为了评估原始系统中变量的重要性,我们将其与随机变量的重要性进行比较。只有重要性较高的变量比随机变量更重要。”
本质上,Boruta 算法在一组原始和随机特征上训练一个随机森林。训练期间的这个随机森林,就像每个随机森林一样,只在每个节点上看到所有特征的一个子集。因此,有时在为当前节点选择变量时它不会在和之间进行选择,并且它不能更喜欢两个变量和中的一个。
这就是 Boruta 不能将变量和之一分类为不重要的原因。必须修改底层的随机森林算法,以始终在每个节点上和及其随机阴影变量和然后,随机森林通常可以例如选择变量和,这将导致 Boruta 选择变量并拒绝。(这里被拒绝,因为的重要性高于)
是的,这很正常。Boruta 算法丢弃对分类器没有价值的属性,留下“所有相关”的属性集,其中可能包括相关的属性。将其与“最小最优”集(不应包含相关)进行对比。
那么,为什么要使用这种方法进行特征选择呢?您可能会发现原始论文中的这句话很有用:
查找所有相关属性,而不仅仅是非冗余属性,其本身可能非常有用。特别是,当人们有兴趣了解与感兴趣的主题相关的机制时,这是必要的,而不是仅仅建立一个黑盒预测模型。
例如,在处理癌症背景下的基因表达测量结果时,识别与癌症相关的所有基因对于完全理解该过程是必要的,而最小优化的一组基因可能更适合作为遗传标记。
因此,如果您的主要目标是了解预测变量和结果之间的因果关系,那么仅考虑最优变量集可能会使您误入歧途,您需要研究所有相关的变量集。
但是,如果您正在寻找适合的有效模型,则最好使用最小最优集。