Извършете кръстосано валидиране на randomForest с R

Използвам пакета randomForest за R, за да обуча модел за класификация. За да го сравня с други класификатори, имам нужда от начин да покажа цялата информация, дадена от доста многословния метод за кръстосано валидиране в Weka. Следователно скриптът R трябва да изведе нещо като [a] от Weka.

  1. Има ли начин за валидиране на R модел чрез RWeka за получаване на тези мерки?
  2. Ако не, как се извършва кръстосано валидиране на произволна гора само в R?
  3. Възможно ли е да използвате rfcv от пакета randomForest тук? Не можах да го накарам да работи.

Знам, че грешката извън пакета (OOB), използвана в randomForest, е някакъв вид кръстосано валидиране. Но имам нужда от пълната информация за подходящо сравнение.

Това, което опитах досега, използвайки R, е [b]. Въпреки това, кодът също създава грешка в моята настройка [c] поради липсващи стойности.

И така, можете ли да ми помогнете с кръстосаното валидиране?


Приложение

[a] Weka:

=== Stratified cross-validation ===
=== Summary ===

Correctly Classified Instances        3059               96.712  %
Incorrectly Classified Instances       104                3.288  %
Kappa statistic                          0.8199
Mean absolute error                      0.1017
Root mean squared error                  0.1771
Relative absolute error                 60.4205 %
Root relative squared error             61.103  %
Coverage of cases (0.95 level)          99.6206 %
Mean rel. region size (0.95 level)      78.043  %
Total Number of Instances             3163     

=== Detailed Accuracy By Class ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 0,918    0,028    0,771      0,918    0,838      0,824    0,985     0,901     sick-euthyroid
                 0,972    0,082    0,991      0,972    0,982      0,824    0,985     0,998     negative
Weighted Avg.    0,967    0,077    0,971      0,967    0,968      0,824    0,985     0,989     

=== Confusion Matrix ===

    a    b   <-- classified as
  269   24 |    a = sick-euthyroid
   80 2790 |    b = negative

[b] Код досега:

library(randomForest) #randomForest() and rfImpute()
library(foreign) # read.arff()
library(caret) # train() and trainControl()

nTrees <- 2 # 200
myDataset <- 'D:\\your\\directory\\SE.arff' # http://hakank.org/weka/SE.arff

mydb = read.arff(myDataset)
mydb.imputed <- rfImpute(class ~ ., data=mydb, ntree = nTrees, importance = TRUE)
myres.rf <- randomForest(class ~ ., data=mydb.imputed, ntree = nTrees, importance = TRUE)
summary(myres.rf)

# specify type of resampling to 10-fold CV
fitControl <- trainControl(method = "rf",number = 10,repeats = 10)
set.seed(825)

# deal with NA | NULL values in categorical variables
#mydb.imputed[is.na(mydb.imputed)] <- 1
#mydb.imputed[is.null(mydb.imputed)] <- 1

rfFit <- train(class~ ., data=mydb.imputed,
             method = "rf",
             trControl = fitControl,
             ## This last option is actually one
             ## for rf() that passes through
             ntree = nTrees, importance = TRUE, na.action = na.omit)
rfFit

Грешката е:

Error in names(resamples) <- gsub("^\\.", "", names(resamples)) : 
  attempt to set an attribute on NULL

Използване на traceback()

5: nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, 
       method = models, ppOpts = preProcess, ctrl = trControl, lev = classLevels, 
       ...)
4: train.default(x, y, weights = w, ...)
3: train(x, y, weights = w, ...)
2: train.formula(class~ ., data = mydb.imputed, method = "rf", 
       trControl = fitControl, ntree = nTrees, importance = TRUE, 
       sampsize = rep(minorityClassNum, 2), na.action = na.omit)
1: train(class~ ., data = mydb.imputed, method = "rf", trControl = fitControl, 
       ntree = nTrees, importance = TRUE, sampsize = rep(minorityClassNum, 
           2), na.action = na.omit) at #39

[c] Информация за версия R чрез sessionInfo()

R version 3.1.0 (2014-04-10)
Platform: i386-w64-mingw32/i386 (32-bit)

[...]

other attached packages:
 [1] e1071_1.6-3        caret_6.0-30       ggplot2_1.0.0      foreign_0.8-61     randomForest_4.6-7 DMwR_0.4.1        
 [7] lattice_0.20-29    JGR_1.7-16         iplots_1.1-7       JavaGD_0.6-1       rJava_0.9-6

person mab    schedule 23.06.2014    source източник


Отговори (1)


Не знам за weka, но направих моделиране на randomForest в R и винаги съм използвал функция за прогнозиране в R, за да направя това.

Опитайте да използвате тази функция

predict(Model,data)

Свържете изхода с оригиналните стойности и използвайте командата table, за да получите матрицата на объркването.

person Koundy    schedule 23.06.2014
comment
Благодаря ви за отговора. Все пак трябваше да отбележа, че вече опитах myres.rf (или print(myres.rf)), за да получа матрицата на объркване. Което работи. Но имам нужда от F-Measure и може би също от ROC. Между другото, table(predict(myres.rf, mydb.imputed)) не извежда матрица за объркване. - person mab; 23.06.2014
comment
Функцията за прогнозиране ви дава само примерни идентификатори и етикет за прогнозиране. трябва да добавите оригинален етикет, да го конвертирате в рамка с данни и след това да приложите функцията за таблица. - person Koundy; 23.06.2014
comment
Можете ли да доставите кода за това? Не можах да разбера частта, където трябва да добавя оригиналния етикет. Следното преобразуване се извършва от as.data.frame(), нали? - person mab; 24.06.2014
comment
Това няма да даде желания резултат. това просто ще даде матрица на объркване. - person Koundy; 25.06.2014
comment
PredictedLabels ‹ - прогнозиране (RFModel, данни); datatable ‹ - as.data.frame(PredictedLabels,OriginalLabels); таблица (с данни) - person Koundy; 25.06.2014