2012-05-08 31 views
5

我在R中使用caret庫生成模型。我想生成一個earth(又名MARS)模型,我想爲此模型生成指定degree參數。根據documentation(第11頁),earth方法支持此參數。插頁::火車:指定模型生成參數

我得到指定參數時出現以下錯誤信息:

指定degree參數時,我怎樣才能避免這個錯誤?

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.UTF-8  LC_COLLATE=en_GB.UTF-8  
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] earth_3.2-3 plotrix_3.4 plotmo_1.3-1 leaps_2.9  caret_5.15-023 
[6] foreach_1.4.0 cluster_1.14.2 reshape_0.8.4 plyr_1.7.1  lattice_0.20-6 

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 compiler_2.15.0 grid_2.15.0  iterators_1.0.6 
[5] tools_2.15.0 

回答

7

我發現瞭如何做到這一點,joran把我帶進了正確的方向:

創建生成培訓網新功能。該功能必須接受lendata這兩個參數。爲了檢索原始訓練網格,您可以致電caret軟件包提供的createGrid方法。然後您可以根據需要修改網格。例如,要在尼夫參數nprune不變,從1到5使用下面的代碼添加degree

createMARSGrid <- function(len, data) { 
     g = createGrid("earth", len, data) 
     g = expand.grid(.nprune=g$.nprune, .degree=seq(1,5)) 
     return(g) 
    } 

然後調用它是這樣的:

train(formula, data=data, method='earth', tuneGrid = createMARSGrid) 
+0

謝謝@theomega。這非常有幫助。你知道'createGrid'中的'len'和'tuneLength'('train'的參數)之間的連接是什麼?另外,爲什麼'createGrid'需要接收某些模型的數據? ('?createGrid'並沒有多說這個) –

+0

請問一個新的問題,我會很樂意爲你效勞 – theomega

+0

謝謝theomega:這是我的問題:http://stackoverflow.com/questions/14839730/caret-錯誤與 - creategrid換RF-隨機森林。我仍然錯過了一個答案,澄清'tuneLength'和'createGrid'中的len參數之間的關係,例如它們可以一起使用嗎?他們的關係是什麼? –

9

,我經常發現的功能在插入符號既有益又有點鬱悶了。這是發生了什麼。

您正試圖通過參數...將參數傳遞給earthtrain。爲train文檔包含此描述爲這樣的說法:

參數傳遞到分類或迴歸程序(如 隨機森林)。如果調諧參數值爲 ,則會發生錯誤。

調整參數,呃?那麼,如果您向下滾動並檢查每種型號的調整參數的正式列表,則會看到對於earth,它們是degreenprune

所以這裏的問題是,train,旨在自動化一些電網一起調整參數搜索,而...參數是用於傳遞進一步的參數模型擬合函數的除了那些調整參數。

如果你想設置你需要使用其他參數,像這樣的調整參數:

train(Volume~Girth+Height, data=trees, method='earth', 
     tuneGrid = data.frame(.degree = 1,.nprune = 5)) 

注意列的命名方式與領先的週期。另外,令人沮喪的是,因爲npruneearth的默認值是NULL,所以我不確定您是否可以通過這種方式僅傳遞默認值。 (一般來說,在數據幀設置的事情NULL將簡單地將其刪除。)

+1

感謝您的溶液。問題是:我如何將'nprune'保持爲默認值?我在源代碼中查找並發現使用私有(不可調用)函數'marsSeq'來調用默認值,因此它不是固定值。正如你所說,你不能離開它。 – theomega

+0

查看我的答案,下面提供了我的(和你的)問題的解決方案。 – theomega