我正在尝试使用caret从一些数据中构建一个分类器。我想尝试的方法之一是从用PCA预处理的数据中进行简单的LDA。我发现如何使用caret来实现这一点:
fitControl <- trainControl("repeatedcv", number=10, repeats = 10, preProcOptions = list(thresh = 0.9))ldaFit1 <- train(label ~ ., data = tab, method = "lda2", preProcess = c("center", "scale", "pca"), trControl = fitControl)
正如预期的那样,caret正在比较不同维度值的LDA的准确性:
Linear Discriminant Analysis 158 samples1955 predictors 3 classes: '1', '2', '3'Pre-processing: centered (1955), scaled (1955), principal component signal extraction (1955)Resampling: Cross-Validated (10 fold, repeated 10 times)Summary of sample sizes: 142, 142, 143, 142, 143, 142, ...Resampling results across tuning parameters: dimen Accuracy Kappa 1 0.5498987 0.1151681 2 0.5451340 0.1298590Accuracy was used to select the optimal model using the largest value.The final value used for the model was dimen = 1.
我想做的是将PCA阈值添加到调整参数中,但我找不到这样做的方法。
caret中是否有简单的方法来解决这个问题?还是需要用不同的预处理选项重复训练步骤,最后选择最佳值?
回答:
多亏了@人名指出的链接,我设法将PCA的解释方差阈值集成到参数调整中:
library(caret)library(recipes)library(MASS)# 设置要尝试的阈值向量pca_varex <- c(0.8, 0.9, 0.95, 0.97, 0.98, 0.99, 0.995, 0.999)# 设置配方initial_recipe <- recipe(train, formula = label ~ .) %>% step_center(all_predictors()) %>% step_scale(all_predictors())# 定义模型网格models <- model_grid() %>% share_settings(data = train, trControl = caret::trainControl(method = "repeatedcv", number = 10, repeats = 10), method = "lda2") # 添加具有不同PCA阈值的模型for (i in pca_varex) { models <- models %>% add_model(model_name = sprintf("varex_%s", i), x = initial_recipe %>% step_pca(all_predictors(), threshold = i))}# 训练模型models <- models %>% train(.)
虽然查看了modelgrid和recipes的文档,tidymodels包可能是最直接的方式(https://www.tidymodels.org/)。