С этим вопросом происходит много вещей, и не очень многое из этого ясно.
Я предполагаю, что это следующие проблемы, которые вам нужны, чтобы помочь
- Применение Случайные леса правильно
- Доступ к входным значениям из
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())
})