Создание объекта S4 в R
Я занят сравнением различных методов машинного обучения в R. Это тот случай: я сделал несколько функций, которые в автоматическом режиме способны создавать каждую отдельную модель прогнозирования (например: логистическая регрессия, случайный лес, нейронная сеть, гибридный ансамбль и т. д.), прогнозы, матрицы путаницы, несколько статистических данных (например, AUC и Fscore) и различные графики.
Теперь я хотел бы создать список объектов S4 (или S3?) В R, где каждый объект содержит модель, предсказания, графики, матрицу путаницы, auc и fscore.
Идея состоит в том, что каждая функция создает такой объект и затем добавляет его в список объектов в операторе возврата.
Как мне запрограммировать такой класс? И как я могу определить, что каждая модель может иметь какой-то другой тип (я полагаю, что все модели, которые я создаю, являются объектами S3, так как я могу определить это в своем классе S4?
Конечный результат должен быть в состоянии сделать что-то вроде этого: modelList[i]@plot должен, например, вызывать запрошенный график. и names(modelList[i]) должен давать имя используемой модели (если это невозможно, то будет использоваться modelList[i]@name). Кроме того, должна быть возможность выбрать лучшую модель из списка на основе параметра, такого как AUC. У меня нет опыта в создании такого объекта, поэтому этот код / идея у меня есть на данный момент:
modelObject <- setClass(
# Set the name for the class
"modelObject",
# Define the slots
slots = c(
modelName = "character"
model = #should contain a glm, neural network, random forest , etc model
predictions = #should contain a matrix or dataframe of custid and prediction
rocCurve = #when summoned, the ROC curve should be plotted
plotX = #when summoned, plot X should be plotted
AUC = "numeric" #contains the value of the AUC
confusionMatrix = "matrix" #prints the confusion matrix in the console
statX = "numeric"#contains statistic X about the confusion matrix e.g. Fscore
),
# Set the default values for the slots. (optional)
prototype=list(
# I guess i can assign NULL to each variable of the S4 object
),
# Make a function that can test to see if the data is consistent.
# This is not called if you have an initialize function defined!
validity=function(object)
{
#not really an idea how to handle this
}
return(TRUE)
}
)
2 ответа
Что бы я сделал, для каждого слота вы хотите в вашем modelObject
класс, определить диапазон ожидаемых значений. Например, ваш model
Слот должен поддерживать все возможные классы объектов, которые могут быть возвращены функциями обучения модели (например, lm(), glm(), nnet() и т. д.). В этом примере вы видите возвращенные следующие объекты:
`` `
x <- y <- 1:10
class(lm(x~y))
class(glm(x~y))
class(nnet(x~y, size=10))
`` `
Поскольку среди возвращаемых объектов нет общего класса, возможно, имеет смысл использовать S3, который имеет менее строгий синтаксис и позволяет назначать различные классы вывода одному и тому же имени поля. На ваш вопрос на самом деле довольно сложно ответить, учитывая, что существует множество различных подходов к множеству ОО-систем R.
Использование setOldClass()
продвигать каждый класс S3 до его эквивалента S4
setOldClass("lm")
setOldClass(c("glm", "lm"))
setOldClass(c("nnet.formula", "nnet"))
setOldClass("xx")
использование setClassUnion()
вставить общий базовый класс в иерархию
setClassUnion("lmORnnetORxx", c("lm", "nnet", "xx"))
.ModelObject <- setClass("ModelObject", slots=c(model="lmORnnetORxx"))
setMethod("show", "ModelObject", function(object) {
cat("model class: ", class(object@model), "\n")
})
В бою:
> library(nnet)
> x <- y <- 1:10
> .ModelObject(model=lm(x~y))
model class: lm
> .ModelObject(model=glm(x~y))
model class: glm lm
> .ModelObject(model=nnet(x~y, size=10, trace=FALSE))
model class: nnet.formula nnet
Я думаю, что вы также хотели бы реализовать Models
объект, который содержит список, в котором все элементы ModelObject
; ограничение будет наложено методом валидности (см. ?setValidity
).