2012-05-08 32 views
5

Tôi đang sử dụng thư viện caret trong R để tạo mô hình. Tôi muốn tạo ra một mô hình earth (aka MARS) và tôi muốn chỉ định tham số degree cho việc tạo mô hình này. Theo số documentation (trang 11), phương thức earth hỗ trợ tham số này.dấu mũ :: đào tạo: chỉ định mô hình tạo thông số

tôi nhận được thông báo lỗi sau khi xác định các tham số:

Làm thế nào tôi có thể tránh được lỗi này khi xác định các tham số 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 

Trả lời

7

tôi phát hiện ra làm thế nào để làm điều đó, Joran dẫn tôi vào đúng hướng:

Tạo một chức năng mới mà tạo ra các lưới đào tạo. Hàm này phải chấp nhận hai tham số lendata. Để truy xuất lưới đào tạo ban đầu, bạn có thể gọi phương thức createGrid do gói caret cung cấp. Sau đó, bạn có thể sửa đổi lưới theo nhu cầu của mình.Ví dụ để Neave các nprune tham số không thay đổi và thêm degree 1-5 sử dụng đoạn mã sau:

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

Sau đó gọi nó như thế này:

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

Cảm ơn @theomega. Điều này rất hữu ích. Bạn có biết kết nối giữa 'len' trong' createGrid' và 'tuneLength' (đối số với' train') là gì không? Ngoài ra, tại sao 'createGrid' cần nhận dữ liệu cho một số mô hình nhất định? ('? createGrid' không nói nhiều về điều này) –

+0

Vui lòng đặt câu hỏi mới và tôi sẽ sẵn lòng trợ giúp bạn – theomega

+0

Cảm ơn theomega: Đây là câu hỏi của tôi: http://stackoverflow.com/questions/14839730/caret- lỗi-với-creategrid-for-rf-randomforest. Tôi vẫn thiếu câu trả lời làm rõ kết nối giữa 'tuneLength' và tham số len trong' createGrid', ví dụ: chúng có thể được sử dụng cùng nhau không? mối quan hệ của họ là gì? –

9

Tôi đã luôn luôn tìm thấy các chức năng trong caret cả hữu ích và có phần điên. Đây là những gì đang xảy ra.

Bạn đang cố chuyển đối số đến earth qua đối số ... tới train. Tài liệu cho train chứa mô tả này cho đối số đó:

đối số được chuyển đến thường trình phân loại hoặc hồi quy (chẳng hạn như randomForest). Lỗi sẽ xảy ra nếu các giá trị cho thông số điều chỉnh là được truyền tại đây.

Thông số điều chỉnh, eh? Vâng, nếu bạn cuộn xuống và kiểm tra danh sách chính xác các thông số điều chỉnh cho từng loại mô hình, bạn sẽ thấy rằng đối với earth, chúng là degreenprune.

Vì vậy, vấn đề ở đây là train được thiết kế để tự động hóa một số lưới tìm kiếm cùng các thông số điều chỉnh, và lập luận ... được sử dụng để thông qua lập luận thêm với mô hình chức năng phù hợp trừ cho những thông số điều chỉnh.

Nếu bạn muốn thiết lập các thông số điều chỉnh, bạn sẽ cần phải sử dụng lập luận khác, như vậy:

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

Lưu ý cách các cột được đặt tên với giai đoạn đầu. Ngoài ra, thật đáng thất vọng vì giá trị mặc định trong earth cho npruneNULL, tôi không chắc chắn bạn chỉ có thể chuyển các giá trị mặc định theo cách này. (Nói chung, thiết lập điều cần NULL trong khung dữ liệu sẽ đơn giản loại bỏ chúng.)

+1

Cảm ơn cho các giải pháp. Vấn đề là: Làm thế nào tôi có thể giữ 'nprune' với giá trị mặc định của nó? Tôi tìm nó trong nguồn và phát hiện ra rằng giá trị mặc định được calucated bằng cách sử dụng hàm private (non-callable) 'marsSeq' do đó nó không phải là một giá trị cố định. Như bạn đã nói, bạn không thể bỏ nó ra. – theomega

+0

Xem câu trả lời của tôi dưới đây cung cấp giải pháp cho câu hỏi của tôi (và của bạn). – theomega

Các vấn đề liên quan