Мы можем отследить ошибку до predict_model
, что вызывает predict.textmodel_nb_fitted
(я использовал только первые 10 строк train_raw
для ускорения вычислений):
traceback()
# 7: stop("feature set in newdata different from that in training set")
# 6: predict.textmodel_nb_fitted(x, newdata = newdata, type = type,
# ...)
# 5: predict(x, newdata = newdata, type = type, ...)
# 4: predict_model.default(explainer$model, case_perm, type = o_type)
# 3: predict_model(explainer$model, case_perm, type = o_type)
# 2: explain.data.frame(train_raw[1:10, 1:5], explainer, n_labels = 1,
# n_features = 5, cols = 2, verbose = 0)
# 1: lime::explain(train_raw[1:10, 1:5], explainer, n_labels = 1,
# n_features = 5, cols = 2, verbose = 0)
Проблема в том, что predict.textmodel_nb_fitted
ожидает dfm, а не фрейм данных.Например, predict(nb_model, test_raw[1:5])
выдает ту же ошибку «набор функций в новых данных, отличающийся от ошибки в обучающем наборе».Однако explain
принимает в качестве аргумента x
фрейм данных.
Решение состоит в том, чтобы написать собственный textmodel_nb_fitted
метод для predict_model
, который выполняет необходимые преобразования объектов перед вызовом predict.textmodel_nb_fitted
:
predict_model.textmodel_nb_fitted <- function(x, newdata, type, ...) {
X <- corpus(newdata)
X <- dfm_select(dfm(X), x$data$x)
res <- predict(x, newdata = X, ...)
switch(
type,
raw = data.frame(Response = res$nb.predicted, stringsAsFactors = FALSE),
prob = as.data.frame(res$posterior.prob, check.names = FALSE)
)
}
Это дает нам
explanation <- lime::explain(train_raw[1:10, 1:5],
explainer,
n_labels = 1,
n_features = 5,
cols = 2,
verbose = 0)
explanation[1, 1:5]
# model_type case label label_prob model_r2
# 1 classification 1 FALSE 0.9999986 0.001693861