从插入符号模型列表中提取训练和预测指标

问题描述 投票:0回答:1

[我正在尝试使用R中的caretcaretEnsemble包构建机器学习工作流程。我提供了一个示例数据集,我的实际数据大约是其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。我需要:

  1. 预测测试数据adultBySexTest
  2. [创建具有因子水平(MaleFemale)的数据框作为具有ROC的行和列,以及从confusionMatrix函数返回的指标,即灵敏度,特异性,准确性或我为每种模型选择的任意值。任何帮助表示赞赏!

我正在尝试使用R中的caret和caretEnsemble软件包构建机器学习工作流。我提供了一个示例数据集,我的实际数据大约是8-10倍。目标是运行...

r machine-learning caret
1个回答
0
投票

这里是使用基数R和caretmtcars数据子集上运行基本线性模型的示例,其中使用柱面数作为拆分变量。

© www.soinside.com 2019 - 2024. All rights reserved.