我正在尝试训练gbm使用caretR中的包.我最初得到以下错误,并认为这是由于缺少输入,所以我创建了gbmGrid但仍然得到相同的错误消息.
sub4Collect1 <- data.frame(testing$row_id)
>
> cl <- makeCluster(10, type = "SOCK")
> registerDoSNOW(cl)
> ptm <- proc.time()
>
> for(i in 2:7){
+ trainClass <- postPrior1[,i]
+ testClass <- postTest1[,i]
+ gbmGrid <- expand.grid(.interaction.depth = (1:5) * 2, .n.trees = (1:5)*50, .shrinkage = .1)
+ bootControl <- trainControl(number = 1)
+ set.seed(2)
+ gbmFit <- train(prePrior1[,-c(2,60,61,161)], trainClass, method = "gbm", tuneLength = 5,
+ trControl = bootControl
+ ##, scaled = FALSE
+ …Run Code Online (Sandbox Code Playgroud) 我有一些数据,Y变量是一个因素 - 好或坏.我正在使用'caret'包中的'train'方法构建一个支持向量机.使用'train'功能,我能够最终确定各种调整参数的值,并获得最终的支持向量机.对于测试数据,我可以预测"类".但是当我试图预测测试数据的概率时,我得到的误差低于(例如我的模型告诉我测试数据中的第一个数据点y ='good',但我想知道获得'好'的概率是多少...通常在支持向量机的情况下,模型将计算预测的概率.如果Y变量有2个结果,则模型将预测每个结果的概率.具有最大概率的结果被认为是最终解决方案)
**Warning message:
In probFunction(method, modelFit, ppUnk) :
kernlab class probability calculations failed; returning NAs**
Run Code Online (Sandbox Code Playgroud)
示例代码如下
library(caret)
trainset <- data.frame(
class=factor(c("Good", "Bad", "Good", "Good", "Bad", "Good", "Good", "Good", "Good", "Bad", "Bad", "Bad")),
age=c(67, 22, 49, 45, 53, 35, 53, 35, 61, 28, 25, 24))
testset <- data.frame(
class=factor(c("Good", "Bad", "Good" )),
age=c(64, 23, 50))
library(kernlab)
set.seed(231)
### finding optimal value of a tuning parameter
sigDist <- sigest(class ~ ., data = trainset, frac = 1)
### creating …Run Code Online (Sandbox Code Playgroud) 这个问题是这里相同主题的延续.以下是本书的最小工作示例:
Wehrens R. Chemometrics在自然科学和生命科学领域进行R多元数据分析.第1版.海德堡; 纽约:施普林格.2011.(第250页).
这个例子取自本书及其包ChemometricsWithR.它强调了使用交叉验证技术进行建模时的一些缺陷.
目标:
一种交叉验证的方法,使用相同的重复CV集来执行已知的策略,PLS通常由LDA逻辑回归,SVM,C5.0,CART或caret包的精神进行.因此,每次调用等待分类器之前都需要PLS,以便对PLS 得分空间进行分类而不是对观察本身进行分类.PCA在使用任何分类器建模之前,插入符号包中最近的方法是作为预处理步骤.下面是一个PLS-LDA程序,只有一个交叉验证来测试分类器的性能,没有10倍的CV或任何重复.下面的代码取自上面提到的书,但有一些更正否则会引发错误:
library(ChemometricsWithR)
data(prostate)
prostate.clmat <- classvec2classmat(prostate.type) # convert Y to a dummy var
odd <- seq(1, length(prostate.type), by = 2) # training
even <- seq(2, length(prostate.type), by = 2) # holdout test
prostate.pls <- plsr(prostate.clmat ~ prostate, ncomp = 16, validation = "CV", subset=odd)
Xtst <- scale(prostate[even,], center = colMeans(prostate[odd,]), scale = apply(prostate[odd,],2,sd))
tst.scores <- Xtst %*% prostate.pls$projection # …Run Code Online (Sandbox Code Playgroud) 无论如何,当caret::train并行使用该函数时,我们是否可以打印迭代?我知道有一个称为“详细”的选项,但是如果使用多核,它似乎什么也不会打印。
caret通过caretSBF和caretFuncs提供嵌套特征选择的功能.
caretSBF:用于筛选选择
lmSBF
rfSBF
treebagSBF
ldaSBF
nbSBF
Run Code Online (Sandbox Code Playgroud)
caretFuncs:用于递归特征选择 - (我假设只是出于历史原因,caretFuncs不被称为caretRFE?)
lmFuncs
rfFuncs
treebagFuncs
ldaFuncs
nbFuncs
gamFuncs
lrFuncs
Run Code Online (Sandbox Code Playgroud)
为什么这个辅助函数列表比插入符号的完整模型列表更有限?例如,没有为glmnet的弹性网方法,kernlab的svm方法等定制的特征选择方法.
是因为:
感谢阅读并感谢插入点包维护者的出色工作.
我正在努力使用插入符号包来执行分类树几天.问题是我的因素变量.我生成了树,但是当我尝试使用最佳模型对测试样本进行预测时,它失败了,因为列车函数为我的因子变量创建了虚拟对象,然后预测函数无法在测试集中找到这些新创建的虚拟对象.我该如何处理这个问题?
我的代码如下:
install.packages("caret", dependencies = c("Depends", "Suggests"))
library(caret)
db=data.frame(read.csv ("db.csv", head=TRUE, sep=";", na.strings ="?"))
fix(db)
db$defaillance=factor(db$defaillance)
db$def=ifelse(db$defaillance==0,"No","Yes")
db$def=factor(db$def)
db$defaillance=NULL
db$canal=factor(db$canal)
db$sect_isodev=factor(db$sect_isodev)
db$sect_risq=factor(db$sect_risq)
#delete zero variance predictors
nzv <- nearZeroVar(db[,-78])
db_new <- db[,-nzv]
inTrain <- createDataPartition(y = db_new$def, p = .75, list = FALSE)
training <- db_new[inTrain,]
testing <- db_new[-inTrain,]
str(training)
str(testing)
dim(training)
dim(testing)
Run Code Online (Sandbox Code Playgroud)
用于训练/测试的str()函数示例如下:
$ FDR : num 1305 211 162 131 143 ...
$ FCYC : num 0.269 0.18 0.154 0.119 0.139 ...
$ BFDR : num 803 164 …Run Code Online (Sandbox Code Playgroud) 我在R中有一个data.table,我想用插入包
set.seed(42)
trainingRows<-createDataPartition(DT$variable, p=0.75, list=FALSE)
head(trainingRows) # view the samples of row numbers
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用data.table选择行.相反,我必须转换为data.frame
DT_df <-as.data.frame(DT)
DT_train<-DT_df[trainingRows,]
dim(DT_train)
Run Code Online (Sandbox Code Playgroud)
data.table替代方案
DT_train <- DT[.(trainingRows),] requires the keys to be set.
Run Code Online (Sandbox Code Playgroud)
除了转换为data.frame之外还有更好的选择吗?
我试图使用Caret附带的包装中未包含的火车,但收到一个我无法弄清楚的错误,知道吗?我使用以下链接开始
bmsMeth<-list(type="Regression",library="BMS",loop=NULL,prob=NULL)
prm<-data.frame(parameter="mprior.size",class="numeric",label="mprior.size")
bmsMeth$parameters<-prm
bmsGrid<-function(x,y,len=NULL){
out<-expand.grid(mprior.size=seq(2,3,by=len))
out
}
bmsMeth$grid<-bmsGrid
bmsFit<-function(x,y,param, lev=NULL) {bms(cbind(y,x),burn=5000,iter=100000,nmodel=1000,mcmc="bd",g="UIP",mprior.size=param$mprior.size)}
bmsMeth$fit<-bmsFit
bmsPred<-function(modelFit,newdata,preProcess=NULL,submodels=NULL){predict(modelFit,newdata)}
bmsMeth$predict<-bmsPred
library(caret)
data.train<-data.frame(runif(100),runif(100),runif(100),runif(100),runif(100))#synthetic data for testing
bms(cbind(data.train[,1],data.train[,-1]),burn=5000,iter=100000,nmodel=1000,mcmc="bd",g="UIP",mprior.size=2)#function out of caret is working
preProcess=c('center','scale')
myTimeControl <- trainControl(method = "timeslice",initialWindow = 0.99*nrow(data.train), horizon = 1, fixedWindow = FALSE)
tune <- train(data.train[,-1],data.train[,1],preProcess=preProcess,method = bmsMeth,tuneLength=2,metric= "RMSE",trControl =myTimeControl,type="Regression")
Run Code Online (Sandbox Code Playgroud)
错误我得到:
train.default(data.train [,-1],data.train [,1],preProcess = preProcess,中的错误:正在停止:警告消息:1:在eval(expr,envir,enclos)中:模型拟合失败对于Training1:mprior.size = 2方法中的错误$ fit(x = x,y = y,wts = wts,param = tuneValue,lev = obsLevels,:未使用的参数(wts = wts,last = last,classProbs = classProbs,类型=“回归”)
2:在nominalTrainWorkflow(x = x,y = y,wts =权重,info …
我正在使用插入符号运行弹性净正则化glmnet。
我将值序列传递给trainControlalpha和lambda,然后执行repeatedcv以获得alpha和lambda的最佳调整。
这是一个示例,其中alpha和lambda的最佳调整分别为0.7和0.5:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7, 6, 8, 11, 11, 6, 2, 10, 14, 7, 12, 6, 9, 10, 14, 7)
gender <- make.names(as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1)))
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88, 0.83, 0.48, 0.99, 0.80, 0.85,
0.50, 0.91, 0.29, …Run Code Online (Sandbox Code Playgroud) recipes作为机器学习管道的一部分,我一直在探索变量转换的新包.我选择了这种方法 - 由于所有新的扩展而从使用caret的preProcess功能升级.但我发现这些包为转换后的数据提供了截然不同的结果:
library(caret) # V6.0-79
library(recipes) # V0.1.2
library(MASS) # V7.3-47
# transform variables using recipes
rec_box <- recipe(~ ., data = as.data.frame(state.x77)) %>%
step_BoxCox(., everything()) %>%
prep(., training = as.data.frame(state.x77)) %>%
bake(., as.data.frame(state.x77))
> head(rec_box)
# A tibble: 6 x 8
Population Income Illiteracy `Life Exp` Murder `HS Grad` Frost Area
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 8.19 138. 0.647 60171653. 6.89 651. 20. 56.0
2 5.90 185. 0.376 61218586. …Run Code Online (Sandbox Code Playgroud)