Я вручную вычисляю прогнозы для дерева решений на основе правил, извлеченных алгоритмом. Затем я хотел сравнить свои прогнозы с прогнозами, сделанными с помощью partykit, и обнаружил различия. Копаясь внутри и проводя (много) экспериментов, я обнаружил, что несоответствия как-то связаны с использованием весов в случае пропусков в наборе данных.
Проверьте этот пример, сделанный с набором данных iris:
DF <- iris
for(i in 1:4) DF[sample(1:nrow(iris), 30, replace = T) %>% unique, i] <- NA #create missings at random
## weights for bootstrap simulation
ids <- sample(1:nrow(DF), replace = T)
w <- factor(ids, levels = 1:nrow(DF)) %>% table %>% as.vector()
tree <- ctree(factor(Species == 'versicolor') ~ ., weights = w, data = DF, majority = T)
mod <- list(
DF = DF,
mod = tree,
ids = ids,
w = w
)
r <- partykit:::.list.rules.party(tree, i = 2)
print(r)
# First set of results
mod$DF %>% mutate(w = mod$w) %>% filter(eval(parse(text = r))) %>% with(sum(w)) %>% print
data_party(mod$mod, id = 1) %>% filter(eval(parse(text = r))) %>% with(sum(`(weights)`)) %>% print
enter code here
# Second set of results
data_party(mod$mod, id = 2) %>% with(sum(`(weights)`)) %>% print
predict_party(mod$mod, id = 2, FUN = function(y, w) sum(w)) %>% print
Последние 4 строки дают одинаковые результаты, если в данных нет NA. Если есть NA, иногда (не могу понять, почему не всегда), вы получите два разных набора результатов, в зависимости от того, используете ли вы подмножество данных, используя правила явно или с помощью предсказанного узла.
Проблема является то, что ctree, как предполагается, предсказывает узел, даже если переменная, включенная в правило, отсутствует, суррогатами. Вы можете проверить это здесь.
DF %>% mutate(rule = eval(parse(text = r)), pred = predict(tree, type = 'node')) %>% filter(rule == T | pred == 2) %>% View
Как следует интерпретировать различные результаты? какой прогнозируемый эффект я должен рассмотреть?