试图更好地了解如何train(tuneLength = )运作{caret}.我试图理解SVM方法之间的一些差异时发生了混乱,{kernlab}我已经阅读了文档(这里)和插入符号培训页面(这里).
我的玩具示例是使用iris数据集创建五个模型.结果在这里,可重现的代码在这里(它们相当长,所以我没有复制并粘贴到帖子中).
从{caret}文档:
tuneLength
一个整数,表示调整参数网格中的粒度量.默认情况下,此参数是列车应生成的每个调整参数的级别数.如果trainControl具有选项search ="random",则这是随机搜索将生成的调整参数组合的最大数量.(注意:如果给定,则必须命名此参数.)
在这个例子中,trainControl(search = "random")和train(tuneLength = 30),但似乎有67个结果,而不是30个(调整参数组合的最大数量)?我试着四处看看是否有30个独特的ROC价值观,甚至是ydim价值观,但按照我的统计,他们不是.
对于玩具示例,我创建了下表:
有没有办法看到"引擎盖下"发生了什么?例如,M1(svmRadial)和M3(svmRadialSigma)都采用和给出相同的调谐参数,但基于调用$results似乎使用不同的方式?
我的理解train(tuneLength = 9)是,这两种模式会产生的结果sigma和C每个9 values, 9 times由于9是每个调谐参数(唯一的例外是随机搜索)水平是多少?同样,M4将9^3因为train(tuneLength = 9)和有3调整参数?
迈克尔
我想使用.将度量标准从RMSE更改为RMSLE
caret library
Run Code Online (Sandbox Code Playgroud)
给出一些样本数据:
ivar1<-rnorm(500, mean = 3, sd = 1)
ivar2<-rnorm(500, mean = 4, sd = 1)
ivar3<-rnorm(500, mean = 5, sd = 1)
ivar4<-rnorm(500, mean = 4, sd = 1)
dvar<-rpois(500, exp(3+ 0.1*ivar1 - 0.25*ivar2))
data<-data.frame(dvar,ivar4,ivar3,ivar2,ivar1)
ctrl <- rfeControl(functions=rfFuncs,
method="cv",
repeats = 5,
verbose = FALSE,
number=5)
model <- rfe(data[,2:4], data[,1], sizes=c(1:4), rfeControl=ctrl)
Run Code Online (Sandbox Code Playgroud)
在这里,我想更改为RMSLE并保持图形的概念
plot <-ggplot(model,type=c("g", "o"), metric="RMSE")+ scale_x_continuous(breaks = 2:4, labels = names(data)[2:4])
Run Code Online (Sandbox Code Playgroud) 我有一个由20个特征和大约300,000个观测值组成的数据集.我正在使用插入符号来训练带有doParallel和四个核心的模型.对于我尝试的方法(rf,nnet,adabag,svmPoly),即使对我的数据进行10%的训练也需要8个多小时.我正在重新采样3次,我的tuneLength是5.我能做些什么来加速这个令人痛苦的缓慢过程?有人建议使用底层库可以加快我的过程10倍,但在我走下去之前我想确保没有其他选择.
我用caret+ 训练了一个随机森林ranger.
fit <- train(
y ~ x1 + x2
,data = total_set
,method = "ranger"
,trControl = trainControl(method="cv", number = 5, allowParallel = TRUE, verbose = TRUE)
,tuneGrid = expand.grid(mtry = c(4,5,6))
,importance = 'impurity'
)
Run Code Online (Sandbox Code Playgroud)
现在我想看看变量的重要性.但是,这些都不起作用:
> importance(fit)
Error in UseMethod("importance") : no applicable method for 'importance' applied to an object of class "c('train', 'train.formula')"
> fit$variable.importance
NULL
> fit$importance
NULL
> fit
Random Forest
217380 samples
32 predictors
No pre-processing
Resampling: Cross-Validated (5 …Run Code Online (Sandbox Code Playgroud) mlp包中的方法caret调用mlp函数RSNNS.在RSNNS包中,我可以通过设置size参数在神经网络中设置尽可能多的隐藏层,例如
data(iris)
#shuffle the vector
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]
irisValues <- iris[,1:4]
irisTargets <- decodeClassLabels(iris[,5])
#irisTargets <- decodeClassLabels(iris[,5], valTrue=0.9, valFalse=0.1)
iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
iris <- normTrainingAndTestSet(iris)
model <- mlp(iris$inputsTrain, iris$targetsTrain, size=c(5,7), learnFuncParams=c(0.1),
maxit=50, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)
Run Code Online (Sandbox Code Playgroud)
将建立一个神经网络,分别有5个和7个节点的两个隐藏层.我想使用该caret包,因为它具有进行参数/模型搜索的功能,以及集群的并行实现.在caret,当我查找方法时,它只能用一个参数进行调整size,例如
data(iris)
mlpGrid <- data.frame(.size=3)
model2<-caret::train(Species~. , iris, method='mlp', tuneGrid=mlpGrid)
Run Code Online (Sandbox Code Playgroud)
建立具有3节点单隐藏层的神经网络.
我已经尝试过添加其他列mlpGrid等等,但caret似乎不允许添加第二个(或更多)隐藏层.
我试图通过将"knnImpute"传递给Caret的train()方法的preProcess参数来估算值.根据以下示例,似乎不会估算值,保留为NA,然后忽略.我究竟做错了什么?
任何帮助深表感谢.
library("caret")
set.seed(1234)
data(iris)
# mark 8 of the cells as NA, so they can be imputed
row <- sample (1:nrow (iris), 8)
iris [row, 1] <- NA
# split test vs training
train.index <- createDataPartition (y = iris[,5], p = 0.80, list = F)
train <- iris [ train.index, ]
test <- iris [-train.index, ]
# train the model after imputing the missing data
fit <- train (Species ~ .,
train,
preProcess = c("knnImpute"),
na.action = na.pass,
method …Run Code Online (Sandbox Code Playgroud) 我不明白随机森林模型的varImp函数(caret包)和importance函数(randomForest包)之间的区别是什么:
我计算了一个简单的RF分类模型,当计算变量重要性时,我发现两个函数的预测变量的"排名"并不相同:
这是我的代码:
rfImp <- randomForest(Origin ~ ., data = TAll_CS,
ntree = 2000,
importance = TRUE)
importance(rfImp)
BREAST LUNG MeanDecreaseAccuracy MeanDecreaseGini
Energy_GLCM_R1SC4NG3 -1.44116806 2.8918537 1.0929302 0.3712622
Contrast_GLCM_R1SC4NG3 -2.61146974 1.5848150 -0.4455327 0.2446930
Entropy_GLCM_R1SC4NG3 -3.42017102 3.8839464 0.9779201 0.4170445
...
varImp(rfImp)
BREAST LUNG
Energy_GLCM_R1SC4NG3 0.72534283 0.72534283
Contrast_GLCM_R1SC4NG3 -0.51332737 -0.51332737
Entropy_GLCM_R1SC4NG3 0.23188771 0.23188771
...
Run Code Online (Sandbox Code Playgroud)
我以为他们使用相同的"算法"但我现在不确定.
编辑
为了重现该问题,ionosphere可以使用数据集(kknn包):
library(kknn)
data(ionosphere)
rfImp <- randomForest(class ~ ., data = ionosphere[,3:35],
ntree = 2000,
importance = TRUE) …Run Code Online (Sandbox Code Playgroud) 我想在使用插入符的同时并行化xgboost的模型拟合过程.从我在xgboost的文档中看到的,该nthread参数控制在拟合模型时使用的线程数,在这种意义上,以并行方式构建树.Caret的train功能将执行并行化,例如,在k-fold CV中运行每次迭代的过程.这种理解是否正确,如果是,是否更好:
doMC包和registerDoMC函数),nthread=1通过插入符号列表函数设置,以便将该参数传递给xgboost,设置allowParallel=TRUE为trainControl,并让caret交叉验证处理并行化; 要么allowParallel=FALSE并且没有并行后端注册)并设置nthread为物理核心数,因此并行化仅包含在xgboost中.或者没有"更好"的方法来执行并行化?
编辑:我运行了@topepo建议的代码,用tuneLength = 10和search="random",并nthread=1在最后一行指定(否则我明白xgboost将使用多线程).有我得到的结果:
xgb_par[3]
elapsed
283.691
just_seq[3]
elapsed
276.704
mc_par[3]
elapsed
89.074
just_seq[3]/mc_par[3]
elapsed
3.106451
just_seq[3]/xgb_par[3]
elapsed
0.9753711
xgb_par[3]/mc_par[3]
elapsed
3.184891
Run Code Online (Sandbox Code Playgroud)
最后,事实证明,对于我的数据和此测试用例,让插入符号处理并行化在运行时方面是更好的选择.
我想使用R包rsample来生成我的数据的重采样.
该软件包提供了rolling_origin生成重采样的功能,以保持数据的时间序列结构.这意味着训练数据(在被调用的包中analysis)总是在测试数据(assessment)的过去.
另一方面,我想执行数据的块样本.这意味着在采样期间将行组保持在一起.这可以使用该功能完成group_vfold_cv.人们可以想到的是几个月.比如说,我们希望时间序列交叉验证始终保持数月.
有没有办法将这两种方法结合起来rsample?
我自己给出每个程序的例子:
## generate some data
library(tidyverse)
library(lubridate)
library(rsample)
my_dates = seq(as.Date("2018/1/1"), as.Date("2018/8/20"), "days")
some_data = data_frame(dates = my_dates)
some_data$values = runif(length(my_dates))
some_data = some_data %>% mutate(month = as.factor(month(dates)))
Run Code Online (Sandbox Code Playgroud)
这给出了以下形式的数据
A tibble: 232 x 3
dates values month
<date> <dbl> <fctr>
1 2018-01-01 0.235 1
2 2018-01-02 0.363 1
3 2018-01-03 0.146 1
4 2018-01-04 0.668 1
5 2018-01-05 0.0995 1
6 2018-01-06 0.163 1 …Run Code Online (Sandbox Code Playgroud) 我想使用来自插入符号模型的折叠预测来训练包含一些原始预测变量的第二阶段模型.我可以收集如下的折叠预测:
#Load Data
set.seed(1)
library(caret)
library(mlbench)
data(BostonHousing)
#Build Model (see ?train)
rpartFit <- train(medv ~ . + rm:lstat, data = BostonHousing, method="rpart",
trControl=trainControl(method='cv', number=folds,
savePredictions=TRUE))
#Collect out-of-fold predictions
out_of_fold <- rpartFit$pred
bestCP <- rpartFit$bestTune[,'.cp']
out_of_fold <- out_of_fold[out_of_fold$.cp==bestCP,]
Run Code Online (Sandbox Code Playgroud)
这很好,但它们的顺序错误:
> all.equal(out_of_fold$obs, BostonHousing$medv)
[1] "Mean relative difference: 0.4521906"
Run Code Online (Sandbox Code Playgroud)
我知道该train对象返回一个列表,其中列出了用于训练每个折叠的索引:
> str(rpartFit$control$index)
List of 10
$ Fold01: int [1:457] 1 2 3 4 5 6 7 8 9 10 ...
$ Fold02: int [1:454] 2 3 4 8 10 11 12 …Run Code Online (Sandbox Code Playgroud)