Estou examinando a seção LAB §6.6 sobre Regressão de Ridge / Lasso no livro 'Uma Introdução à Aprendizagem Estatística com Aplicações em R' de James, Witten, Hastie, Tibshirani (2013).
Mais especificamente, estou tentando aplicar o Ridge
modelo scikit-learn ao conjunto de dados 'Hitters' do pacote R 'ISLR'. Eu criei o mesmo conjunto de recursos, como mostrado no código R. No entanto, não consigo me aproximar dos resultados do glmnet()
modelo. Eu selecionei um parâmetro de ajuste L2 para comparar. (argumento 'alpha' no scikit-learn).
Pitão:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
R:
Observe que o argumento alpha=0
in glmnet()
significa que uma penalidade de L2 deve ser aplicada (regressão de Ridge). A documentação avisa para não inserir um único valor para lambda
, mas o resultado é o mesmo que no ISL, onde um vetor é usado.
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
O que causa as diferenças?
Edit:
Ao usar a penalized()
partir do pacote penalizado em R, os coeficientes são os mesmos do scikit-learn.
ridge.mod2 <- penalized(y,x,lambda2=11498)
Talvez a pergunta também possa ser: 'Qual é a diferença entre glmnet()
e penalized()
ao fazer a regressão de Ridge?
Novo wrapper python para o código Fortran real usado no pacote R glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
faz estimativa de interceptação não-penalizada (padrão) e a penalidade é tal que||Xb - y - intercept||^2 + alpha ||b||^2
é minimizadab
. Pode haver fatores1/2
ou1/n_samples
ambos na frente da penalidade, tornando os resultados diferentes imediatamente. Para fatorar o problema de escala da penalidade, defina a penalidade como 0 nos dois casos, resolva quaisquer discrepâncias e verifique o que a adição da penalidade faz. E entre IMHO aqui é o lugar certo para fazer esta pergunta.