Caret:使用矩阵式操作自定义特征选择

时间:2014-09-19 17:20:30

标签: r feature-selection r-caret

简短的问题:是否可以在caretSBF $得分函数中使用矩阵式运算?

动机:在R中处理大矩阵时,以矩阵方式本地工作的操作[例如rowMeans(X)]通常比一行一行快得多[例如apply(X,1,mean)]。这是一个基准示例,使用具有一百万行和100列的矩阵:

rows = 1000000
cols = 100
X <- matrix(rnorm(rows*cols),nrow = rows)

ptm <- proc.time()
tt <- apply(X, 1, function(x) { t.test(x[1:50],x[51:100], var.equal = FALSE)$p.value })
proc.time() - ptm
#    user  system elapsed
# 312.420   0.685 313.633

library(genefilter)
ptm <- proc.time()
ftt <- rowFtests(X, fac = factor(c(rep(0,50), rep(1,50))), var.equal=FALSE)
proc.time() - ptm
#    user  system elapsed
#  21.400   1.336  23.257

详细信息:在插入符号包中,caretSBF函数得分过滤器可用于选择交叉验证建模的功能。我想使用自定义评分函数代替caretSBF $得分(这部分我可以做),但我希望它是矩阵式的(如上所述 - 这部分我做不到)。当我第一次看到函数时,我看不出明显的原因,为什么这不起作用。我想做这样的事情:

mySBF$score <- function(x, y) {
  genefilter::rowFtests(x, fac = y)$p.value
}

取代默认值:

$score
function (x, y) 
{
    if (is.factor(y)) 
        anovaScores(x, y)
    else gamScores(x, y)
}
<environment: namespace:caret>

但我不能让它发挥作用。 caretSBF是否不支持矩阵式操作?

1 个答案:

答案 0 :(得分:2)

  

caretSBF是否不支持矩阵式操作?

不,不是真的。 score函数一次只能提供一个预测变量。

但是,您可以使用train中的自定义模型到达那里。 Here是在建模之前进行特征提取的示例。您可以使用多变量过滤器对其进行调整,并使用子集来拟合模型。这是一个非常糟糕的例子:

> library(caret)
> set.seed(1)
> training <- LPH07_1(200)
> 
> crappy <- getModelInfo("lm", regex = FALSE)[[1]]
> crappy$fit <- function (x, y, wts, param, lev, last, classProbs, ...)  {
+   dat <- if (is.data.frame(x)) x else as.data.frame(x)
+   ## randomly filter all but 3 predictors
+   dat <- dat[, sample(1:ncol(dat), 3)]
+   dat$.outcome <- y
+   lm(.outcome ~ ., data = dat, ...)
+ }
> crappy$predict <-  function (modelFit, newdata, submodels = NULL) {
+   if (!is.data.frame(newdata)) 
+     newdata <- as.data.frame(newdata)
    ## make sure to apply the subsetting part here too
+   predict(modelFit, newdata[, predictors(modelFit$terms)])
+ }
> 
> 
> mod <- train(y ~ ., data = training, 
+              method = crappy)
> mod
Linear Regression 

200 samples
 10 predictor

No pre-processing
Resampling: Bootstrapped (25 reps) 

Summary of sample sizes: 200, 200, 200, 200, 200, 200, ... 

Resampling results

  RMSE  Rsquared  RMSE SD  Rsquared SD
  3.08  0.077     0.258    0.0864     


> predictors(mod)
[1] "Var08" "Var03" "Var04"

最高