Как построить окончательную модель дерева решений c50 (библиотека C50) из объекта caret :: train - PullRequest
2 голосов
/ 06 апреля 2020

Я обучил Дерево решений модель с использованием поезд функция из Caret Библиотека:

gr = expand.grid(trials = c(1, 10, 20), model = c("tree", "rules"), winnow = c(TRUE, FALSE))
dt = train(y ~ ., data = train, method = "C5.0", trControl = trainControl(method = 'cv', number = 10), tuneGrid = gr)

Теперь я хотел бы построить Дерево решений для окончательной модели. Но эта команда не работает:

plot(dt$finalModel)

Error in data.frame(eval(parse(text = paste(obj$call)[xspot])), eval(parse(text = paste(obj$call)[yspot])),  : 
  arguments imply differing number of rows: 4160, 208, 0

Кто-то уже спрашивал об этом здесь: topi c

Предлагаемое решение заключалось в использовании bestTune от установленного поезда объекта для определения соответствующей c5.0 модели вручную. А затем напишите, что c5.0 модель обычно:

c5model = C5.0(x = x, y = y, trials = dt$bestTune$trials, rules = dt$bestTune$model == "rules", control = C5.0Control(winnow = dt$bestTune$winnow))
plot(c5model)

Я пытался это сделать. Да, это позволяет построить модель c5.0 , НО прогнозируемые вероятности для поезда объекта и вручную воссозданной c5.0 модели дон не совпадают Я думаю, это потому, что в воссозданной вручную модели c5.0 мы не реализуем 10-кратную перекрестную проверку .

Итак, мой вопрос: возможно ли извлечь конечную модель c5.0 из caret :: train объект и построить это Дерево решений

1 Ответ

2 голосов
/ 06 апреля 2020

Прогнозируемые вероятности должны быть одинаковыми, см. Ниже:

library(MASS)
library(caret)
library(C50)
library(partykit)

traindata = Pima.tr
testdata = Pima.te

gr = expand.grid(trials = c(1, 2), 
model = c("tree"), winnow = c(TRUE, FALSE))

dt = train(x = traindata[,-ncol(testdata)], y = traindata[,ncol(testdata)], 
method = "C5.0",trControl = trainControl(method = 'cv', number=3),tuneGrid=gr)

c5model = C5.0.default(x = traindata[,-ncol(testdata)], y = traindata[,ncol(testdata)], 
trials = dt$bestTune$trials, rules = dt$bestTune$model == "rules", 
control = C5.0Control(winnow = dt$bestTune$winnow))

all.equal(predict(c5model,testdata[,-ncol(testdata)],type="prob"),
predict(dt$finalModel,testdata[,-ncol(testdata)],type="prob"))
[1] TRUE

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

Ошибка, которую вы видите при построении окончательной Модель из каретки взята из того, что хранится в $ call, что странно, мы можем заменить ее вызовом, который будет работать для построения графика:

plot(c5model)

enter image description here

finalMod = dt$finalModel
finalMod$call = c5model$call
plot(finalMod)

enter image description here

Или вы можете переписать его, как если бы это было с результатами вашего обучения, но вы можете увидеть, что это немного усложняет выражение (или по крайней мере, я не очень хорошо с этим):

newcall = substitute(C5.0.default(x = X, y = Y, trials = ntrials, rules = RULES, control = C5.0Control(winnow = WINNOW)),
list(
X = quote(traindata[, -ncol(traindata)]),
Y = quote(traindata[, ncol(traindata)]),
RULES = dt$bestTune$model == "rules",
ntrials = dt$bestTune$trials,
WINNOW = dt$bestTune$winnow)
)

finalMod = dt$finalModel
finalMod$call = newcall
...