Не могу предсказать лес без присмотра - PullRequest
1 голос
/ 04 февраля 2020

У меня есть следующие данные df в R, используемые для обучения случайного леса:

feature1   feature2   feature3   mytarget
1          0          1          cool
0          0          1          cool
1          1          0          warm
0          1          0          warm
1          1          1          warm

Затем я использую df_test для проверки обученной модели:

feature1   feature2   feature3
1          0          1
0          0          1

Вот как я пытаюсь обучить случайный лес:

library(randomForest)

f <- paste('~', paste(colnames(df)[colnames(df)!="mytarget"], collapse = ' + '))

rf <- randomForest(as.formula(f), data=df, ntree=10, nodesize=10)

df_test$pr <- predict(rf, df_test, type="prob")[,2]

Это ошибка:

Ошибка вgnett.randomForest (rf, dtest, type = "prob"): Нет лесной компонент в объекте

Если я добавлю keep.forest=TRUE:

rf <- randomForest(as.formula(f), data=df, ntree=10, nodesize=10, keep.forest=TRUE)

..., то у меня git эта ошибка:

Error in predict.randomForest(rf, dtest, type = "prob") : 
  Can't predict unsupervised forest.

Почему случайный лес считается неконтролируемым, если у меня есть цель mytarget?

1 Ответ

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

Включите также ответ в formula с reformulate

library(randomForest)
rf <- randomForest(reformulate(response = 'mytarget', 
      names(df)[1:3]), data = df, ntree=10, nodesize=10)
predict(rf, df_test, type="prob")[,2]
#   1   2  
# 0.3 0.3 

или используйте paste

f <- paste('mytarget ~', paste(colnames(df)[colnames(df)!="mytarget"],
       collapse = ' + '))

rf <- randomForest(as.formula(f), data=df, ntree=10, nodesize=10)
predict(rf, df_test, type="prob")[,2]
#   1   2 
# 0.2 0.2 

Проблема в том, что terms не имеет переменной ответа, когда мы ее не предоставляем

rf$terms
#~feature1 + feature2 + feature3
#attr(,"variables")
#list(feature1, feature2, feature3)
#attr(,"factors")
#         feature1 feature2 feature3
#feature1        1        0        0
#feature2        0        1        0
#feature3        0        0        1
#attr(,"term.labels")
#[1] "feature1" "feature2" "feature3"

, и это изменяется, когда предоставляется

rf$terms
#mytarget ~ feature1 + feature2 + feature3
#attr(,"variables")
#list(mytarget, feature1, feature2, feature3)
#attr(,"factors")
#         feature1 feature2 feature3
#mytarget        0        0        0
#feature1        1        0        0
#feature2        0        1        0
#feature3        0        0        1
#attr(,"term.labels")
#[1] "feature1" "feature2" "feature3"

data

df <- structure(list(feature1 = c(1L, 0L, 1L, 0L, 1L), feature2 = c(0L, 
0L, 1L, 1L, 1L), feature3 = c(1L, 1L, 0L, 0L, 1L), mytarget = structure(c(1L, 
1L, 2L, 2L, 2L), .Label = c("cool", "warm"), class = "factor")), row.names = c(NA, 
-5L), class = "data.frame")

df_test <- structure(list(feature1 = 1:0, feature2 = c(0L, 0L), feature3 = c(1L, 
1L)), class = "data.frame", row.names = c(NA, -2L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...