Связывание SelectId с моделью случайного леса в Shiny

Я относительный новичок в R, и еще новее в использовании Shiny, и у меня возникли проблемы с привязкой selectInput к модели randomForest в Shiny.

Я создал модель RandomForest, которая прогнозирует стоимость страхования для клиента, и, похоже, она работает хорошо. Я хочу иметь возможность использовать эту модель в Shiny и позволить пользователям изменять информацию о рисках с помощью ползунков и раскрывающихся списков, чтобы стоимость обновлялась соответствующим образом. Это прекрасно работает с числовыми полями, но как только я добавляю список selectImput (список значений парковки input = "garage"), я получаю следующую ошибку;

    Warning: Error in predict.randomForest: New factor levels not present in the training data
Stack trace (innermost first):
    85: predict.randomForest
    84: predict
    83: pred [#10]
    82: renderText [#2]
    81: func
    80: origRenderFunc
    79: output$guess
     4: <Anonymous>
     3: do.call
     2: print.shiny.appobj
     1: <Promise>

Я предположил, что значение в раскрывающемся списке отсутствует в модели, поэтому я пошел в объект RandomForest, чтобы выбрать действительные значения и поместить их в код.

> rf$forest$xlevels$Parking
[1] "Driveway"                   "Locked garage"              "On the road at home"        "On the road away from home"
[5] "Other"                      "Residential car park"       "Work car park"  

Снова та же ошибка вернулась. Класс данных для парковки в модели RF - фактор. Значения парковки связаны с входом = "гараж".

Пожалуйста, смотрите копию моего кода ниже. Любая помощь с этим была бы очень признательна, поскольку я так близок к тому, чтобы заставить это работать.

library(shiny)
library(randomForest)
library(datasets)


ui <- fluidPage(  titlePanel("Van Market Premium - alpha"),

                  checkboxInput(inputId = "comp", label = "Comprehensive"),
                  sliderInput(inputId = "age", label = "Age of Driver", value = 25, min = 17, max = 100),
                  sliderInput(inputId = "ncd", label = "No Claims Discount", value = 0, min = 0, max = 9),
                  numericInput(inputId = "cc", label = "CC", value = 1600, min = 250, max = 5000),
                  sliderInput(inputId = "value", label = "Current Van Value", value = 2000, min = 50, max = 20000, step = 250),
                  sliderInput(inputId = "aov", label = "Age of Van [years]", value = 5, min = 0, max = 50),
                  numericInput(inputId = "volxs", label = "Voluntary Excess", value = 0, min = 0, max = 1500),
                  sliderInput(inputId = "mileage", label = "Annual Mileage", value = 5000, min = 1000, max = 50000, step = 1000),
                  sliderInput(inputId = "length", label = "Ownership Length", value = 12, min = 0, max = 120, step = 6),
                  checkboxInput(inputId = "fuel", label = "Petrol?"),
                  checkboxInput(inputId = "auto", label = "Automatic?"),
                  selectInput(input = "garage", label = "Overnight Location", choices = as.factor(c("On the road at home",
                                                                                          "Driveway",
                                                                                          "Locked garage",
                                                                                          "Other",
                                                                                          "Residential car park",
                                                                                          "Work car park", 
                                                                                          "On the road away from home"))),
                  textOutput("guess")
                  )


RF <- get(load("C:/Users//Documents/R/RF3.RData"))

pred <- function(co, ag, nc, cc, val, aov, vol, mil, len, fuel, auto, garage) {

                                    inputdata <- c(co, ag, nc, cc, val, aov, vol, mil, len, fuel, auto, garage)

                                    pred_data <- as.data.frame(t(inputdata))

                                    colnames(pred_data) <- c("Comp" , "Age" , "NCD" , "CC" , "Value" , "AgeOfVehicle", "VoluntaryExcess"
                                                             ,"AnnualMileage", "LengthOwned", "petroldiesel", "auto", "Parking")

                                    prob_out <- predict(RF, pred_data)
                                    prob_out <- exp(prob_out)
                                    return(prob_out)

                                  }


server <- function(input, output) {
                                    output$guess <- renderText({pred(input$comp, input$age, input$ncd, input$cc, input$value, input$aov, 
                                                                     input$volxs, input$mileage, input$length, input$fuel, input$auto, input$garage
                                                                                              )})


                                  }

shinyApp(ui = ui, server = server)   

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

Ура Марк

1 ответ

Я не могу сказать наверняка, так как мы не можем увидеть или получить доступ к вашей модели, но я несколько уверен, что ваши символьные переменные должны быть преобразованы в фактор для использования в randomForest, надеюсь, это поможет

Другие вопросы по тегам