2016-02-27 62 views
1

我忙於比較R.中的不同機器學習技術。 這是這種情況:我創建了幾個函數,以自動方式 能夠創建每個不同的預測模型(例如:logistic迴歸,隨機森林,神經網絡,混合集成等),預測,混淆矩陣,若干統計量(例如AUC和Fscore)以及不同的圖。在R中創建S4對象

現在我想在R中創建一個S4(或S3?)對象的列表,其中每個對象包含模型,預測,繪圖,混淆矩陣,auc和fscore。

這個想法是,每個函數創建這樣的對象,然後將它附加到return語句中的對象列表。

我應該如何編程這樣的類?我怎樣才能定義每個模型可以是一些不同的類型(我認爲我創建的所有模型都是S3對象,那麼我怎麼能在我的S4類中定義這個?

最終結果應該能夠做這樣的事情:modelList [i] @plot應該舉例說明召喚請求的圖,name(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) 
    } 
) 
+0

相關:[1](http://adv-r.had.co.nz/OO-essentials.html),[2](http://www.cyclismo.org/tutorial/R/s4Classes。 html),[3](http://adv-r.had.co.nz/S4.html) – Laterow

回答

1

我會做什麼,是fo請在您的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的無數OO系統。

+0

我現在正在試驗S3類的創建。我會盡快提供更新。 S3也可以存儲地塊嗎? –

+0

這是一個正確的方法? 'modelObject < - 函數(MODELNAME,modelObject,modelPredictions,rocCurve,plotX,AUC,混淆矩陣,statX) { modelObject < - 列表( model.name = MODELNAME, model.object = modelObject, model.predictions = modelPredictions, roc.curve = rocCurve, plot.x = plotX, roc.auc = AUC, confusion.matrix =混淆矩陣, stat.x = statX ) ##爲類設置名稱 class(modelObject)< - append(class(modelObject),「model」) return(modelObject) }' –

+0

該代碼正在工作。但是現在我遇到了一個新問題。我將爲這個問題開闢新的威脅,因爲它與這個話題不同。 –

3

使用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([email protected]), "\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)。

+0

哇,所以如果我理解它的權利,這個代碼我可以用這個代碼創建一個統一的.ModelObject類,我可以用它作爲類或對象在我的代碼中: 'slots = c( modelName =「字符「 model =#應該包含一個glm,神經網絡,隨機森林等模型 predictions =#應該包含一個矩陣或數據框的custid和預測 rocCurve =#召喚時,ROC曲線應繪製 plotX =#當傳喚時,情節X應繪製爲 ),' 我該如何在這個對象中實施情節? –

+0

lattice和ggplot2包返回的對象有一個(S3)類,可以用類似的方式存儲 - setOldClass()'+'setClassUnion()'。但是,也許你的意思是你想爲(S3)劇情通用寫一個方法。你可以用'plot.ModelObject < - function(x,y,...){}'來做到這一點。 –

+0

我目前正忙於S3對象(請參閱對此問題的其他答案的評論),我認爲S3方法更直觀。我會盡快在我的代碼上測試它 –