В следующем коде я ожидаю, что два оператора печати будут печатать один и тот же результат, поскольку я явно передаю параметр s
обеим функциям прогнозирования.
library(glmnet)
set.seed(1)
x=rnorm(100)
eps=rnorm(100)
y = 1 + x + x^2 + x^3 + eps
xmat=model.matrix(y~poly(x,10,raw=T),data=data.frame(x=x))
grid=10^seq(10,-2,length=100)
lasso.mod = glmnet(xmat,y, alpha=1,lambda=grid)
lasso.coef=predict(lasso.mod,type="coefficients",s=0.01495444)[1:10,]
print(lasso.coef)
lasso.mod = glmnet(xmat,y, alpha=1,lambda=5)
lasso.coef=predict(lasso.mod,type="coefficients",s=0.01495444)[1:10,]
print(lasso.coef)
Однако результаты сильно отличаются, и хотелось бы понять, почему.
(Intercept) (Intercept) poly(x, 10, raw = T)1
1.1329454011 0.0000000000 1.3081576745
poly(x, 10, raw = T)2 poly(x, 10, raw = T)3 poly(x, 10, raw = T)4
0.6887020751 0.6576599481 0.0336098492
poly(x, 10, raw = T)5 poly(x, 10, raw = T)6 poly(x, 10, raw = T)7
0.0566899437 0.0002744787 0.0006870169
poly(x, 10, raw = T)8
0.0001053833
(Intercept) (Intercept) poly(x, 10, raw = T)1
2.092266 0.000000 0.000000
poly(x, 10, raw = T)2 poly(x, 10, raw = T)3 poly(x, 10, raw = T)4
0.000000 0.000000 0.000000
poly(x, 10, raw = T)5 poly(x, 10, raw = T)6 poly(x, 10, raw = T)7
0.000000 0.000000 0.000000
poly(x, 10, raw = T)8
0.000000
Я провел эксперимент, в котором я изменил lasso.mod = glmnet(xmat,y, alpha=1,lambda=5)
на lasso.mod = glmnet(xmat,y, alpha=1,lambda=0.015)
, и результаты были намного ближе.
Кажется, что функция прогнозирования зависит от grid
, который передается функции обучения, но в документации, похоже, указано, что параметр s
в predict
должен переопределять его. Есть ли зависимость, и если да, то какая и как ее обойти к коэффициентам для произвольных s
?
Обновление 1: я нашел загадочное предупреждение в документации для glmnet
.
Do not
supply a single value for 'lambda' (for predictions after CV
use 'predict()' instead). Supply instead a decreasing
sequence of 'lambda' values. 'glmnet' relies on its warms
starts for speed, and its often faster to fit a whole path
than compute a single fit.
Предупреждение относится только к производительности, а не к точности/стабильности, но я пытался варьировать различные последовательности уменьшения grid
, и результаты predict
все равно различались.