简短的问题:是否可以在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是否不支持矩阵式操作?
答案 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"
最高