R Могу ли я применить функцию обучения в курсоре к списку фреймов данных?

Я использую отличный пакет R, каретку, и я хотел бы запустить функцию обучения в списке нескольких наборов обучающих данных. Теперь я понимаю, что документация для функции поезда говорит, что аргумент данных должен быть фреймом данных, поэтому то, что я пытаюсь сделать, может быть просто невозможно, и это может быть лучше предложено в качестве улучшения для каретки, но я хотел посмотреть, если кто-нибудь пытался сделать это.

Используя данные Sonar в иллюстративных целях, я создал список (названный обоими), состоящий из двух кадров данных, каждый из которых представляет собой отдельный набор обучающих данных. Затем я использую mapply, чтобы применить функцию поезда к каждому элементу в списке. К сожалению, я получаю пугающие результаты. В частности, я надеялся, что метрики в pls1.3..A[[2]] будут идентичны метрикам в pls1.3..B2. Как видите, это не так. Как ни странно, pls1.3..A[[1]] соответствуют pls1.3..B1. Есть ли что-то очевидное, что я делаю неправильно, или это просто невозможно (сейчас)? (Я использую R 3.1.1 на 1,4 ГГц Intel Core i5 Mac.)

Воспроизводимый код (и вывод закомментирован) выглядит следующим образом:

    require(doMC)
    registerDoMC(cores = 2) 

    library(caret) 
    library(mlbench) 
    data(Sonar) 
    set.seed(1234) 
    inTrain <- createDataPartition(y = Sonar$Class, 
                                   p = .75, 
                                    list = FALSE) 

    training <- Sonar[ inTrain,] 
    training2  <- Sonar[-inTrain,] 

    both <- list(training, training2) 
    #both_test <- list(training[c(1:100),], training2[c(1:35),]) #SILLY test data for functionality testing only 

    set.seed(1234) 

    labels <- list() 
    for(i in 1:length(both)) { 
        labels[i] <- list(both[[i]]$Class) 
        } 

    #NEW CODE -- ADDED BASED ON @Josh W's comment -- removing the label (Class) variable from the feature matrix
    both <- lapply(both, function(x) {
        subset(x[,c(1:60)])
        })

    #NEW CODE -- changed from using the formula implementation of caret to the x (feature matrix), y (label/outcome vector)

    pls1.3..A <- mapply(function(x,y) train(x, y, method = "pls", preProc = c("center", "scale")), x = both, y = labels, SIMPLIFY = FALSE) 
    pls1.3..A 

    #[[1]]
    #Partial Least Squares 

    #157 samples
    # 60 predictor
    #  2 classes: 'M', 'R' 

    #Pre-processing: centered, scaled 
    #Resampling: Bootstrapped (25 reps) 

    #Summary of sample sizes: 157, 157, 157, 157, 157, 157, ... 

    #Resampling results across tuning parameters:

    #  ncomp  Accuracy   Kappa      Accuracy SD  Kappa SD  
    #  1      0.6889679  0.3756821  0.06015197   0.11605511
    #  2      0.7393776  0.4742204  0.04962609   0.09775688
    #  3      0.7410997  0.4793703  0.04856698   0.09412599

    #Accuracy was used to select the optimal model using  the largest value.
    #The final value used for the model was ncomp = 3. 

    #[[2]]
    #Partial Least Squares 

    #51 samples
    #60 predictors
    # 2 classes: 'M', 'R' 

    #Pre-processing: centered, scaled 
    #Resampling: Bootstrapped (25 reps) 

    #Summary of sample sizes: 51, 51, 51, 51, 51, 51, ... 

    #Resampling results across tuning parameters:

    #  ncomp  Accuracy   Kappa      Accuracy SD  Kappa SD 
    #  1      0.6452693  0.2929118  0.08076455   0.1525176
    #  2      0.6468405  0.2902136  0.09686340   0.1790924
    #  3      0.6559113  0.3087227  0.08025215   0.1547317

    #Accuracy was used to select the optimal model using  the largest value.
    #The final value used for the model was ncomp = 3.          

    set.seed(1234)
    pls1.3..B1 <- train(both[[1]],
                    labels[[1]],
                    method = "pls",
                    preProc = c("center", "scale"))
    pls1.3..B1
    #Partial Least Squares 

    #157 samples
    # 60 predictor
    #  2 classes: 'M', 'R' 

    #Pre-processing: centered, scaled 
    #Resampling: Bootstrapped (25 reps) 

    #Summary of sample sizes: 157, 157, 157, 157, 157, 157, ... 

    #Resampling results across tuning parameters:

    #  ncomp  Accuracy   Kappa      Accuracy SD  Kappa SD  
    #  1      0.6889679  0.3756821  0.06015197   0.11605511
    #  2      0.7393776  0.4742204  0.04962609   0.09775688
    #  3      0.7410997  0.4793703  0.04856698   0.09412599

    #Accuracy was used to select the optimal model using  the largest value.
    #The final value used for the model was ncomp = 3. 

    set.seed(1234)
    pls1.3..B2 <- train(both[[2]],
                    labels[[2]],
                    method = "pls",
                    preProc = c("center", "scale"))
    pls1.3..B2

    #Partial Least Squares 

    #51 samples
    #60 predictors
    # 2 classes: 'M', 'R' 

    #Pre-processing: centered, scaled 
    #Resampling: Bootstrapped (25 reps) 

    #Summary of sample sizes: 51, 51, 51, 51, 51, 51, ... 

    #Resampling results across tuning parameters:

    #  ncomp  Accuracy   Kappa      Accuracy SD  Kappa SD 
    #  1      0.6127279  0.2518488  0.11925682   0.1959400
    #  2      0.6792163  0.3618657  0.09386771   0.1776549
    #  3      0.6673662  0.3343716  0.07524373   0.1476405

    #Accuracy was used to select the optimal model using  the largest value.
    #The final value used for the model was ncomp = 2.  

person IamWill    schedule 30.05.2015    source источник


Ответы (1)


Если вы используете следующее, вы получите результат (близкий к ожидаемому):

set.seed(1234) 
pls1.3..B <- train(labels[[2]]~ ., 
                   data = both[[2]], 
                   method = "pls", 
                   preProc = c("center", "scale")) 
pls1.3..B 

Я считаю, что это из-за того, как вы указали формулу. В формуле object ~ . используются все данные, кроме столбца object. Указанный в вызове mapply, это basically external object ~ entire data.frame, включая метки класса. Поэтому я считаю, что это похоже на обучение с вашей переменной ответа в наборе данных.

person Josh W.    schedule 31.05.2015
comment
Джош В. - очень хорошее замечание. Я отредактировал код, чтобы устранить эту проблему, удалив столбец результатов из списка с именем «оба». Делая это, исправляет определенную ошибку. Спасибо. К сожалению, это не решает проблему, как показывает мой отредактированный пост. - person IamWill; 31.05.2015