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.Respostas:
Minha resposta está faltando um fator de . Consulte @visitors answer abaixo para obter a comparação correta.1N
Aqui estão duas referências que devem esclarecer o relacionamento.
A documentação do sklearn diz que
linear_model.Ridge
otimiza a seguinte função objetivoO artigo glmnet diz que a rede elástica otimiza a seguinte função objetivo
Observe que as duas implementações usam maneiras totalmente diferentes, o sklearn usa para o nível geral de regularização, enquanto o glmnet usa para esse fim, reservando para negociação entre a regularização do cume e do laço.α α λ α
Comparando as fórmulas, parece que a configuração e no glmnet deve recuperar a solução .α=0 λ=2αsklearn
linear_model.Ridge
fonte
standardize = FALSE
emglmnet()
obter os resultados idênticos.linear_model.Ridge
para qualquer análise do mundo real.linear_model.Ridge
modelo sklearn padroniza os recursos automaticamente. A normalização é opcional. Gostaria de saber por que preciso desativar a padronizaçãoglmnet()
para que os modelos produzam resultados idênticos.A resposta de Matthew Drury deve ter um fator de 1 / N. Mais precisamente...
A documentação da glmnet afirma que a rede elástica minimiza a função de perda
A documentação do sklearn diz que
linear_model.Ridge
minimiza a função de perdao que equivale a minimizar
Para obter a mesma solução do glmnet e do sklearn, as duas funções de perda devem ser iguais. Isso significa configurar e no glmnet.α=0 λ=2Nαsklearn
Saída glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955
Saída do sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921
fonte