2014-07-22 16 views
12

Tôi đã sử dụng caret gói để điều chỉnh mô hình hồi quy logistic glmnet. Trong khi giá trị lambda từ giai điệu tốt nhất là một trong những giá trị tôi đã chỉ định trong tuneGrid, các lambda giá trị của mô hình cuối cùng là hoàn toàn khác nhau:R caret train glmnet mô hình cuối cùng lambda giá trị không theo quy định

require(caret) 
set.seed(1) 
x <- matrix(runif(1000), nrow = 100) 
y <- factor(rbinom(100, 1, 0.5)) 
lambda.seq <- exp(seq(log(1e-5), log(1e0), length.out = 20)) 

model <- train(x, y, 
       method ="glmnet", 
       family = "binomial", 
       tuneGrid = expand.grid(alpha = 1, 
             lambda = lambda.seq)) 
model$bestTune 
# alpha lambda 
# 13  1 0.0143845 
model$finalModel$lambdaOpt 
# [1] 0.0143845 

model$finalModel$lambda 
# [1] 0.1236344527 0.1126511087 0.1026434947 0.0935249295 0.0852164325 0.0776460395 
# [7] 0.0707481794 0.0644631061 0.0587363814 0.0535184032 0.0487639757 0.0444319185 
# [13] 0.0404847094 0.0368881594 0.0336111170 0.0306251980 0.0279045398 0.0254255774 
# [19] 0.0231668392 0.0211087610 0.0192335169 0.0175248642 0.0159680036 0.0145494502 
# [25] 0.0132569171 0.0120792091 0.0110061255 0.0100283716 0.0091374787 0.0083257303 
# [31] 0.0075860954 0.0069121676 0.0062981097 0.0057386030 0.0052288013 0.0047642890 
# [37] 0.0043410427 0.0039553964 0.0036040099 0.0032838396 0.0029921123 0.0027263013 
# [43] 0.0024841042 0.0022634233 0.0020623470 0.0018791337 0.0017121967 0.0015600899 
# [49] 0.0014214958 0.0012952140 0.0011801508 0.0010753094 0.0009797819 0.0008927408 

model$finalModel$lambdaOpt %in% lambda.seq 
# [1] TRUE 

giá trị tối ưu Mô hình thức của lambda cũng không có trong danh sách lambda cùng một kiểu được cho là đã sử dụng:

model$finalModel$lambdaOpt %in% model$finalModel$lambda 
# [1] FALSE 

Điều gì giải thích những khác biệt này trong lambda?

Trả lời

9

Mô hình cuối cùng về cơ bản là tái trang bị với toàn bộ dữ liệu toàn bộ SAU alphalambda của bạn được tối ưu hóa bằng kỹ thuật lấy mẫu lại.

Nếu bạn in model$finalModel$call bạn nhìn thấy các cuộc gọi được thực hiện (bỏ qua x, cấu trúc y cho khó):

Call: glmnet(x, y, family = "binomial", alpha = 1) 

Ở đây, alpha được thiết lập (nếu bạn đã thiết lập một chuỗi nó sẽ là tối ưu alpha tìm thấy), nhưng không có lambda được chỉ định nào được đặt để đào tạo và do đó một chuỗi tự động được tạo dựa trên dữ liệu của bạn và mô hình được trang bị. Sau đó nó dự đoán với cùng một tập huấn luyện với lambdaOpt (và phần còn lại của chuỗi bạn đã cung cấp). Hãy xem glmnet vignette và cách bạn có thể chỉ định khác nhau lambda sau khi đào tạo.

Nếu bạn gõ:

> names(model$modelInfo) 
    [1] "label" "library" "type" "parameters" "grid" "loop"  
    [7] "fit" "predict" "prob" "predictors" "varImp" "levels"  
    [13] "tags" "sort" "trim" 

và sau đó đi bộ qua từng phần đó, bạn có thể có một cái nhìn vào những gì train đang làm. Bạn có thể xem trong model$modelInfo$predict cách dự đoán trên lambdaOpt và phần còn lại của chuỗi của bạn.

Khi bạn in model$results bạn thực sự nhận danh sách các lambda và hiệu suất trên toàn đào tạo thiết với mỗi người:

alpha  lambda Accuracy  Kappa AccuracySD KappaSD 
1  1 1.000000e-05 0.5698940 0.15166891 0.09061320 0.17133524 
2  1 1.832981e-05 0.5698940 0.15166891 0.09061320 0.17133524 
3  1 3.359818e-05 0.5698940 0.15166891 0.09061320 0.17133524 
4  1 6.158482e-05 0.5698940 0.15166891 0.09061320 0.17133524 
5  1 1.128838e-04 0.5698940 0.15166891 0.09061320 0.17133524 
6  1 2.069138e-04 0.5698940 0.15166891 0.09061320 0.17133524 
7  1 3.792690e-04 0.5698940 0.15166891 0.09061320 0.17133524 
8  1 6.951928e-04 0.5698940 0.15166891 0.09061320 0.17133524 
9  1 1.274275e-03 0.5675708 0.14690433 0.09071728 0.17085665 
10  1 2.335721e-03 0.5643334 0.14059590 0.09153010 0.17204036 
11  1 4.281332e-03 0.5629588 0.13822063 0.09403553 0.17715441 
12  1 7.847600e-03 0.5694974 0.15221600 0.08791315 0.16433922 
13  1 1.438450e-02 0.5700431 0.15448347 0.08864353 0.16509332 
14  1 2.636651e-02 0.5695053 0.15189752 0.08113581 0.15184619 
15  1 4.832930e-02 0.5635977 0.14112303 0.05833646 0.11617226 
16  1 8.858668e-02 0.5305835 0.08983718 0.08116759 0.14752307 
17  1 1.623777e-01 0.4800871 0.01124082 0.05827521 0.05715298 
18  1 2.976351e-01 0.4725241 0.00000000 0.04488500 0.00000000 
19  1 5.455595e-01 0.4725241 0.00000000 0.04488500 0.00000000 
20  1 1.000000e+00 0.4725241 0.00000000 0.04488500 0.00000000 

Để tóm tắt những gì đang xảy ra trong caret + glmnet:

  1. tối ưu hóa alphalambda trong điều chỉnhGrid bạn đã cung cấp bằng cách sử dụng các kỹ thuật lấy mẫu lại;

  2. refits mô hình, bây giờ trên tập huấn luyện toàn, với tối ưualpha;

  3. dự đoán trên toàn bộ bộ đào tạo có lambdaOpt được tìm thấy trong 1. và trên phần còn lại của chuỗi lambdas trong tuneGrid.

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