r-获得由carte::train生成的glm类型模型的pmml表示



我正试图从caretmethod='glm'中训练的回归模型中生成PMML。示例型号:

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。有没有办法将caret中生成的some_glm转换回pmml()可以接受的格式?或者,如果我想要pmml功能,我是否被迫使用glm()构造?

如果设置model$call[[1]]pmml函数将正常工作。

所以在你的情况下,你会想:

library('pmml')
some_glm$finalModel$call[[1]] <- "glm"
pmml(some_glm$finalModel)

最新更新