Como a interceptação é calculada no GLMnet?

8

Estou implementando a versão GLMNET da rede elástica para regressão linear com outro software que não o R. Comparei meus resultados com a função R glmnet no modo de laço nos dados de diabetes .

A seleção da variável é boa ao variar o valor do parâmetro (lambda), mas obtenho valores ligeiramente diferentes de coeficientes. Por essa e outras razões, acho que vem da interceptação no loop de atualização, quando computo o ajuste atual, porque não vario a interceptação (que considero a média da variável de destino) em todo o algoritmo: explicado no artigo de Trevor Hastie ( Caminhos de regularização para modelos lineares generalizados via descida de coordenadas , página 7, seção 2.6):

a interceptação não é regularizada, [...] para todos os valores de [...] lambda [o parâmetro de restrição L1]

Mas, apesar do artigo, a função R glmnet fornece valores diferentes para a interceptação no caminho da regularização (os valores lambda diferentes). Alguém tem uma pista sobre como os valores do Intercept são calculados?

yelh
fonte

Respostas:

8

Descobri que a interceptação no GLMnet é calculada após a convergência das novas atualizações de coeficientes. A interceptação é calculada com as médias dos 's e a média dos ' s. A fórmula é semelhante à anterior, mas com as 's após o loop de atualização: .yixijβjβ0=y¯j=1pβj^xj¯

Em python, isso fornece algo como:

        self.intercept_ = ymean - np.dot(Xmean, self.coef_.T)

que encontrei aqui na página scikit-learn.

EDIT: os coeficientes devem ser padronizados antes de:

        self.coef_ = self.coef_ / X_std

β0=y¯j=1pβj^xj¯i=1nxij2 .

yelh
fonte
Devo acrescentar que essa é uma maneira padrão de calcular a interceptação, assumindo que o modelo seja linear e que os erros tenham média zero.
Mpgtas
De fato, no entanto, os autores disseram explicitamente em seu artigo: para todos os valores de e e, além disso, eles não dizem em que ponto do algoritmo é computadoβ0=y¯ αλ
yelh
Como os autores assumem que , isso é verdade. Observe que, no início da página 3, eles afirmam que assumimos que os preditores estão centralizados, mas isso não é restritivo, pois os "... resultados generalizam naturalmente ..." para casos não-padronizados. A fórmula que você encontra é essa generalização natural. x¯=0
precisa saber é o seguinte
No entanto, mesmo quando a padronização é aplicada (e, portanto, centralizada) nos preditores do algoritmo, eles recebem os dados não padronizados (portanto, , em geral) para ajustar as diferentes intercepções exibidas por . Eles usam o mesmo para atualizar os coeficientes, mas ajustam uma interceptação aos dados brutos e o fazem a posteriori. x¯0glmnetβ0=constant=y¯
yelh
3

que eu tomo como a média da variável alvo

Acho que pode ser que você esteja errado: ao contrário do modelo linear, não é possível remetereter os preditores de forma que eles sempre sejam ortogonais à interceptação, portanto, a interceptação não pode ser apenas calculada como a média.

Simon Byrne
fonte
Peguei a média da variável explicada porque, no artigo que citei, os autores deste método escrevem que usam a média do Y_i (as observações da variável explicada) para todos os valores de alfa e lambda. Agora, olhando para a saída da função glmnet, acho que não é o caso de todas as lambdas. Portanto, isso não me diz como calcular as interceptações para cada parâmetro de regularização lambda.
29511
Meu palpite é que eles usem a média ponderada (como os pesos serão alterados com ). λ
Simon Byrne
Você poderia precisar sua idéia, por favor? Qual expressão de pesos devo considerar?
29511
No papel, cada "loop interno" é um penalizado, ponderado de mínimos quadrados problema, com os pesos sendo definida pelo valor ajustado anterior através equação 17.
Simon Byrne
1
Tudo bem, encontrei a resposta olhando para o código python scikit-learn (porque o código-fonte glmnet está no Fortran e não é minha xícara de chá). Vou compartilhar mais tarde, se alguém estiver interessado. Obrigado mesmo assim!
yelh