Как использовать реактивные элементы внутри data.frame () - PullRequest
0 голосов
/ 27 февраля 2020

Я импортировал свои наборы данных в мое приложение. Существует проблема при добавлении пользовательских входных данных в фрейм данных и о том, как получить выходные данные в виде Да или Нет после прогнозирования и отобразить выходные данные после использования предиката (). Это мое тело пользовательского интерфейса:

     box(mainPanel("ENTER THE DETAILS :",br(),br(),textInput("name","Name :","Name Here"),br(),
                                                numericInput("uiage",'Age :',value = 25,min = 25,max = 100),br(),
                                                 radioButtons("uigender","Gender :",c("Male","Female"),inline=TRUE),br(),
                                                textInput("uipurpose","Purpose Of Loan :","Car Loan"),br(),
                                                numericInput("uicredhist",'Cibil Score :',min=1,max=10,value = 9),br(),
                                                numericInput("uicredamt", 'Credit Amount',value = 10000),br(),
                                                numericInput("uicommitment","Intallment Commitment",value =2,min=0,max=6),br(),
                                                radioButtons("uiemplymentstatus","Employment Status :",c("Yes","No"),inline = TRUE),br(),br(),
                                                numericInput("uicheckingstatus",'Checking Status :',min=1,max=10,value = 9),br(),
                                                textInput("uipropmag","Property Magnitude:","real-estate/life-insurance/car/jewels"),br(),
                                                radioButtons("uihousing","Housing :",c("own","rent"),inline = TRUE),br(),
                                                radioButtons("uiforeign","Foreign Worker :",c("yes","no"),inline=TRUE),br(),
                                                radioButtons("uieducation","Educational Qualities :",c("Skilled","Un-Skilled"),inline = TRUE),br(),
                                            actionButton("submit",label = "Submit"),textOutput("text1")))


This is my server logic to get user inputs :

    text_reactive1 <- eventReactive( input$submit, {
    userage <- input$uiage
  })


    text_reactive2 <- eventReactive(input$submit,{
    usercredithist <- input$uicredhist
  })



    text_reactive3 <- eventReactive(input$submit,{
    usercredamt <- input$uicredamt
  })


    text_reactive4 <- eventReactive(input$submit,{
    usercommit <- input$uicommitment
  })

this is my algorithm :


    fit <- randomForest(df$class~df$age+df$credit_history+df$credit_amount+df$installment_commitment, data=datfr$df)

 randpred <-reactive({ predict(fit,dframe=data.frame(text_reactive1(),text_reactive2(),text_reactive3(),text_reactive4()))})

  output$text1 <- renderText({
  paste("Input cred hist is :",randpred())
  })

I нужен мой вывод как да или нет .. может кто-нибудь помочь мне решить эту проблему ..

enter image description here

1 Ответ

1 голос
/ 28 февраля 2020

С этим вопросом происходит много вещей, и не очень многое из этого ясно.

Я предполагаю, что это следующие проблемы, которые вам нужны, чтобы помочь

  1. Применение Случайные леса правильно
  2. Доступ к входным значениям из shiny

Случайные леса

Многое, что не так с вашим кодом, использует неверные аргументы, так как вы не предоставил воспроизводимый пример данных, я продолжу с набором данных iris.

fit <- randomForest(formula = Species~Sepal.Width+Sepal.Length,
                    data = iris)

при вызове randomForest с формулой нотации, вам не нужно ( и, вероятно, не должны) обращаться к векторам с помощью $, но вместо этого использовать их имена символов. Это в основном различие с использованием predict для новых данных.

predict аргумент для проверки вашей модели на новых данных: newdata , а не dframe. Поскольку dframe никогда не оценивается (из-за ленивых вычислений), функция по умолчанию predict просто возвращает значения исходных предсказанных значений. Через секунду я вернусь к вашим прогнозным значениям, но сначала я хочу показать, что вам нужно сделать с аргументом newdata.

#If I did random forests accessing vectors with $
dim(iris)
#[1] 150   5
fit <- randomForest(formula = iris$Species~iris$Sepal.Width+iris$Sepal.Length,
                    data = iris)
predict(fit) # default returns predicted values
predict(fit, newdata = data.frame(Sepal.width = c(1:10), Sepal.Length = c(21:30)) #throws an error
#Error in x[...] <- m : NAs are not allowed in subscripted assignments
#In addition: Warning message:
#'newdata' had 10 rows but variables found have 150 rows

Поскольку аргумент randomForest formula был задан вектор длиной 150, он ожидает, что новый размер данных будет такого же размера. Это все еще проблема, хотя, даже если размеры newdata удовлетворены, подгонка почти всегда одинакова ...

test1 <- predict(fit, newdata = data.frame(rnorm(150,2194192,409), rnrom(150, -12359,21885999)))
test2 <- predict(fit, newdata = data.frame(rnorm(150, 10000),rnorm(150, -1000000)))
all(test1==test2)
#TRUE

Используя правильные обозначения, тогда:

fit <- randomForest(formula = Species~Sepal.Width+Sepal.Length,
                    data = iris)
predict(fit, newdata = data.frame(Sepal.Width = 1:10, Sepal.Length = 10:1))
#        1         2         3         4         5         6         7         8         9        10 
#virginica virginica virginica virginica    setosa    setosa    setosa    setosa    setosa    setosa 
#Levels: setosa versicolor virginica

Примечание : фрейм данных newdata должен иметь те же заголовки столбцов, что и значения ответа в вашей подгонке randomForest, в противном случае вы получите ошибку.

Теперь я хочу поговорить о вашей прогностической переменной. Поскольку вы не предоставили пример того, как выглядят ваши данные, я предполагаю, что df$class - это то, что вы пытаетесь классифицировать. Поскольку ваш вывод predict предоставляет вам число - я предполагаю, что df$class является либо непрерывным значением, либо сохраняется как целое число 0 или 1. Если вы sh хотите, чтобы randomForest вернул "yes" или "no", тогда df$class должен быть вектором-фактором, содержащим "yes" или "no".

Логики сервера c

Опять же, я точно не знаю, есть ли какие-либо ошибки в представленном вами коде, потому что нет воспроизводимого примера, но я бы сжал логи вашего сервера c как таковые.

server <- function(input, output){
#somewhere load and assign datfr
fit <- randomForest(class~age+credit_history+credit_amount+installment_commitment,
                    data=datfr$df)
rv <- reactiveValues(userage = NULL,
                     usercredithist = NULL,
                     usercredamt = NULL,
                     usercommit = NULL)
observeEvent(input$submit,{
    req(input$uiage, input$uicredhist, input$uicredamt, input$uicommitment)
    rv$userage <- input$uiage
    rv$usercredithist <- input$uicredhist
    rv$usercredamt <- input$uicredamt
    rv$usercommit <- input$uicommitment
    }
)

randpred <-reactive({
    predict(fit,
            newdata=data.frame(age=rv$userage,
                               credit_history=rv$usercredithist,
                               credit_amount=rv$usercredamt,
                               installment_commitment=rv$usercommit))
})

output$text1 <- renderText({
    paste("Input cred hist is :",randpred())
})
...