получить pmml-представление модели типа glm, созданное функцией caret :: train

Я пытаюсь создать PMML из регрессионной модели, обученной caret с method='glm'. Пример модели:

library('caret')

data('GermanCredit')

set.seed(123)

train_rows <- createDataPartition(GermanCredit$Class, p=0.6, list=FALSE)

train_x <- GermanCredit[train_rows, c('Age','ForeignWorker','Housing.Own',
                                      'Property.RealEstate','CreditHistory.Critical') ]
train_y <- as.integer( GermanCredit[train_rows, 'Class'] == 'Good' )

some_glm <- train( train_x, train_y, method='glm', family='binomial', 
                   trControl = trainControl(method='none') )

summary(some_glm$finalModel)

Непринятый ответ на этот связанный вопрос для type='rf' предполагает, что это не можно сделать с помощью матричного интерфейса.

Поэтому я не могу получить pmml, используя синтаксис матрицы или формулы (который, я уверен, в любом случае дает идентичные finalModels):

library('pmml')

pmml(some_glm$finalModel) 
# Error in if (model$call[[1]] == "glm") { : argument is of length zero

# Same problem if I try:
some_glm2 <- train( Class ~ Age + ForeignWorker + Housing.Own + 
                      Property.RealEstate + CreditHistory.Critical, 
                    data=GermanCredit[train_rows, ], family="binomial", 
                    method='glm',
                    trControl = trainControl(method='none') )
pmml(some_glm2$finalModel)

Он действительно работает в базовом glm с интерфейсом формулы:

some_glm_base <- glm(Class ~ Age + ForeignWorker + Housing.Own + 
                     Property.RealEstate + CreditHistory.Critical, 
                     data=GermanCredit[train_rows, ], family="binomial")
pmml(some_glm_base) # works

Для обеспечения совместимости я хотел бы продолжать использовать caret. Есть ли способ преобразовать some_glm, созданный в caret, обратно в формат, который будет принимать pmml()? Или я вынужден использовать конструкцию glm(), если мне нужна функциональность pmml?


person C8H10N4O2    schedule 29.12.2015    source источник
comment
Вы прочитали предупреждение? Предупреждающее сообщение: В train.default (train_x, train_y, method = glm, family = binomial,: вы пытаетесь выполнить регрессию, и ваш результат имеет только два возможных значения. Вы пытаетесь выполнить классификацию? Если да, используйте коэффициент 2 уровня в качестве столбца результатов.   -  person IRTFM    schedule 29.12.2015
comment
После просмотра кода pmml.glm и структуры объекта some_glm эти усилия кажутся безнадежными, если только вы не сможете найти функцию, которая отображает содержимое объекта caret-glm в структуру объекта stats::glm.   -  person IRTFM    schedule 29.12.2015
comment
@ 42- Я видел предупреждение, но я не делаю классификацию, а просто регрессирую по двоичному результату. (Это почти то же самое, но мне просто нужна вероятность целевого класса, а не предсказание класса.)   -  person C8H10N4O2    schedule 29.12.2015
comment
Есть r2pmml-пакет. Я установил версию 0.4.3 из исходного кода с GitHub и необходимых зависимостей (но у нее нет страниц справки). Я получаю сообщение об ошибке при попытке конвертации: r2pmml(some_glm, "train-rf.pmml") Error in .jnew("org/jpmml/rexp/Main") : java.lang.UnsupportedClassVersionError: org/jpmml/rexp/Main : Unsupported major.minor version 51.0. Я использую Mac (с последней версией Java), поэтому пользователи других ОС могут захотеть попробовать.   -  person IRTFM    schedule 29.12.2015
comment
Проблема в том, что caret::train() преобразует вызовы интерфейса формулы в вызовы интерфейса матрицы перед выполнением какой-либо работы (вероятно, из соображений производительности).   -  person user1808924    schedule 29.12.2015
comment
@ 42- спасибо за предложение, посмотрю r2pmml   -  person C8H10N4O2    schedule 30.12.2015


Ответы (1)


Если вы установите model$call[[1]], функция pmml будет работать правильно.

Итак, в вашем случае вы хотели бы:

library('pmml')

some_glm$finalModel$call[[1]] <- "glm"
pmml(some_glm$finalModel)
person Jake Gillberg    schedule 21.04.2016
comment
Я пробовал ваше решение, но получил следующее Error in .pmmlDataDictionary(field, weights = weights, transformed = transforms) : character class is not supported for features. Supported classes: numeric, logical, factor. - person hshihab; 17.08.2017