Создание объекта 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).

Другие вопросы по тегам