[我正在尝试使用R中的caret
和caretEnsemble
包构建机器学习工作流程。我提供了一个示例数据集,我的实际数据大约是其8-10倍。
目标是在下面的示例中按因子的每个级别运行以下步骤,因为它是sex
我的真实数据将具有100的级别
- Data Prep
- Preprocess
- split into training and test set
- train
- evaluate
- predict and evaluate
这第一段代码按预期运行,除了最后两个步骤外,所有代码都执行。结果是分组变量modelsBySex
的每个级别的插入符号模型sex
的列表
library(caret) library(caretEnsemble) library(healthcareai) library(tidyverse) #Data Prep adult <- read.table('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data', sep = ',', fill = F, strip.white = T) colnames(adult) <- c('age', 'workclass', 'fnlwgt', 'educatoin', 'educatoin_num', 'marital_status', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_per_week', 'native_country', 'income') adult= adult %>% dplyr::select(age,race,educatoin_num,income,sex) %>% mutate(ID=row_number(),race=factor(ifelse(race=="White","White","non-White")), educatoin_num=factor(ifelse(educatoin_num<=12,"H1","H2")), income=factor(ifelse(income=="<=50K","Under","Over"))) adultBySex <- split(adult,adult$sex) ##Preprocessing adultBySex <- lapply(adultBySex,function(x){nzv <- nearZeroVar(x) if(length(nzv)!=0){x=x[,-nzv ]}}) adultBySex <- lapply(adultBySex ,function(x){ cor_x=Filter(x,f=is.numeric) highlyCorrelated <- findCorrelation(cor(cor_x), cutoff=0.8,names=TRUE) if(length(highlyCorrelated)!=0){x=x %>% dplyr::select(-highlyCorrelated)} else {x}} ) #Train -Test Split adultBySexTrain<-lapply(adultBySex,function(x){ adultBySexTrain=split_train_test(x,outcome=ID,seed=10, percent_train=.8)$train}) adultBySexTest<-lapply(adultBySex,function(x){ adultBySexTrain=split_train_test(x,outcome=ID,seed=10, percent_train=.8)$test}) adultBySexTrain <- lapply(adultBySexTrain,function(x){x= x %>% dplyr::select(-ID)}) adultBySexTest <- lapply(adultBySexTest,function(x){x= x %>% dplyr::select(-ID)}) adultBySexTrain <- lapply(adultBySexTrain,function(x){ outcome=x %>% dplyr::select(income) predictors=x %>% dplyr::select(-income) xDummy <- dummyVars( ~ ., data = predictors) predictors=as.data.frame(predict(xDummy, newdata = predictors)) x=bind_cols(outcome,predictors) }) adultBySexTest <- lapply(adultBySexTest,function(x){ outcome=x %>% dplyr::select(income) predictors=x %>% dplyr::select(-income) xDummy <- dummyVars( ~ ., data = predictors) predictors=as.data.frame(predict(xDummy, newdata = predictors)) x=bind_cols(outcome,predictors) }) #Training modelsBySex=lapply(adultBySexTrain ,function(dat){ #will putting seed here assure same results? set.seed(9) fitControl <- trainControl( method = "cv", number = 3, search="grid", classProbs=TRUE, savePredictions="final", summaryFunction=twoClassSummary, sampling = "down", returnResamp="final" ) model_list <- caretList( x=dat[,-1],y=dat[,1], trControl=fitControl, metric = "ROC", preProcess=c("range"), tuneList = list(NN=caretModelSpec(method="nnet",trace=FALSE), GLM=caretModelSpec(method="glmnet",family="binomial",data=dat), rf=caretModelSpec(method="rf",data=dat), NB=caretModelSpec(method="nb"))) })
我想为分组因子的每个级别构建重采样结果的数据框。这就是它在一个级别上的工作方式。
# single level Female resamps=resamples(modelsBySex$Female) resamps$values
我不知道如何递归地取消列出这些值并添加一个表示级别的列,在这种情况下,该列为
Female
,因此我可以按因子级别进行进一步分析。
我完全无法成功地将预测应用于modelsBySex
。我需要:
adultBySexTest
Male
,Female
)的数据框作为具有ROC的行和列,以及从confusionMatrix
函数返回的指标,即灵敏度,特异性,准确性或我为每种模型选择的任意值。任何帮助表示赞赏!我正在尝试使用R中的caret和caretEnsemble软件包构建机器学习工作流。我提供了一个示例数据集,我的实际数据大约是8-10倍。目标是运行...
这里是使用基数R和caret
在mtcars
数据子集上运行基本线性模型的示例,其中使用柱面数作为拆分变量。