【问题标题】:Caret: customizing feature selection using matrix-wise operationsCaret:使用矩阵操作自定义特征选择
【发布时间】:2015-01-11 13:52:24
【问题描述】:

小问题:是否可以在 caretSBF$score 函数中使用矩阵运算?

动机:在 R 中处理大矩阵时,本机以矩阵方式工作的操作 [e.g. rowMeans(X) ] 通常比一次一行的方法快得多 [例如。应用(X,1,平均值)]。下面是一个基准示例,使用一百万行和 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

详细信息:在 caret 包中,caretSBF 函数 scorefilter 可用于选择用于交叉验证建模的特征。我想使用自定义评分函数代替 caretSBF$score (这部分我可以做),但我希望它是矩阵式的(就像上面一样——这部分我不能做)。当我第一次查看这些功能时,我看不出为什么它不起作用的明显原因。我想做这样的事情:

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 不支持矩阵运算吗?

【问题讨论】:

    标签: r feature-selection r-caret


    【解决方案1】:

    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"
    

    最大

    【讨论】:

    • 感谢这个糟糕的例子 :) 我喜欢建议的解决方法。但我无法让它适用于 glmnet 模型。使用 newdata[, predictors(modelFit$terms)] 预测中的子集不起作用,但如果我使用 newdata[, rownames(modelFit$beta)] 则可以工作 - 但是如果我在 trainControl 中设置 classProbs=TRUE 也会中断.知道怎么了?我将使用更新的示例编辑我的问题。
    • 这表明SBF的在线文档不正确?它说:“[分数] 函数将预测变量和结果分别作为 x 和 y 对象的输入。输出应该是分数的命名向量,其中名称对应于列名x。”这听起来 x 必须是矩阵 - 因为函数如何输出分数向量? help(sbfControl) 有类似的语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2018-08-13
    • 1970-01-01
    • 2023-03-07
    • 2018-07-10
    相关资源
    最近更新 更多