r - 插入符号的训练函数中的 PCA 预处理参数
问题描述
我正在knn
对我的数据进行回归,并希望:
a) 交叉验证repeatedcv
以找到最优的k
;
b)在构建knn模型时,使用PCA
水平90%
阈值来降低维度。
library(caret)
library(dplyr)
set.seed(0)
data = cbind(rnorm(20, 100, 10), matrix(rnorm(400, 10, 5), ncol = 20)) %>%
data.frame()
colnames(data) = c('True', paste0('Day',1:20))
tr = data[1:15, ] #training set
tt = data[16:20,] #test set
train.control = trainControl(method = "repeatedcv", number = 5, repeats=3)
k = train(True ~ .,
method = "knn",
tuneGrid = expand.grid(k = 1:10),
#trying to find the optimal k from 1:10
trControl = train.control,
preProcess = c('scale','pca'),
metric = "RMSE",
data = tr)
我的问题:
(1) 我注意到有人建议更改trainControl中的pca参数:
ctrl <- trainControl(preProcOptions = list(thresh = 0.8))
mod <- train(Class ~ ., data = Sonar, method = "pls",
trControl = ctrl)
如果我更改trainControl中的参数,是否意味着PCA仍在KNN期间进行?与此问题类似的担忧
(2) 我找到了另一个适合我情况的示例- 我希望将阈值更改为 90% 但我不知道在哪里可以更改它Caret
的train
功能,特别是我仍然需要该scale
选项。
对于我冗长的冗长描述和随机引用,我深表歉意。先感谢您!
(感谢 Camille 提出的使代码正常工作的建议!)
解决方案
要回答您的问题:
我注意到有人建议更改 trainControl 中的 pca 参数:
mod <- train(Class ~ ., data = Sonar, method = "pls",trControl = ctrl)
如果我更改trainControl中的参数,是否意味着PCA仍在KNN期间进行?
是的,如果你这样做:
train.control = trainControl(method = "repeatedcv", number = 5, repeats=3,preProcOptions = list(thresh = 0.9))
k = train(True ~ .,
method = "knn",
tuneGrid = expand.grid(k = 1:10),
trControl = train.control,
preProcess = c('scale','pca'),
metric = "RMSE",
data = tr)
您可以在 preProcess 下检查:
k$preProcess
Created from 15 samples and 20 variables
Pre-processing:
- centered (20)
- ignored (0)
- principal component signal extraction (20)
- scaled (20)
PCA needed 9 components to capture 90 percent of the variance
这将回答 2),即单独使用 preProcess:
mdl = preProcess(tr[,-1],method=c("scale","pca"),thresh=0.9)
mdl
Created from 15 samples and 20 variables
Pre-processing:
- centered (20)
- ignored (0)
- principal component signal extraction (20)
- scaled (20)
PCA needed 9 components to capture 90 percent of the variance
train.control = trainControl(method = "repeatedcv", number = 5, repeats=3)
k = train(True ~ .,
method = "knn",
tuneGrid = expand.grid(k = 1:10),
trControl = train.control,
metric = "RMSE",
data = predict(mdl,tr))
推荐阅读
- javascript - Brotli/gzip 压缩启用但不工作?
- pine-script - 我如何绘制从今天开始关闭的会话?
- javascript - 为什么我不能在这个草率模式函数中访问 arguments.callee?
- c - 为什么我们在 c 变量中使用后缀?
- javascript - React 原生 flatlist 图像列表
- android-studio - 在 Android Studio 上使用场景形式以编程方式更改 3D 模型的纹理
- java - 线程之间的共享变量可以在任何时候不完整/无效吗?
- html - 我的选择标签内的文本字段查找选项
- android - 如何在 Jetpack Compose 中创建表格?
- c - GLIB D-BUS 蓝牙 - 如何获取文件描述符?