Como treino uma regressão (logística?) Em R usando a função de perda L1?

11

Eu posso treinar uma regressão logística Rusando

glm(y ~ x, family=binomial(logit)))

mas, IIUC, isso otimiza a probabilidade do log.

Existe uma maneira de treinar o modelo usando a função de perda linear ( ) (que neste caso é igual à distância total da variação )?L1

Ou seja, dado um vetor numérico e um vetor bit (lógico) y , quero construir uma função monotônica (de fato, crescente) f de modo que | f ( x ) - y | é minimizado.xyf|f(x)y|

Veja também

sds
fonte
O que você deseja não existe e, para ser franco, não faz muito sentido. Podemos discutir alternativas, mas você precisa declarar mais detalhadamente o que está tentando fazer. Por que você deseja ajustar um modelo logístico com uma perda de L1?
User603 22/05
@ user603: Porque eu quero avaliar o meu modelo usando TVD
sds
Você parece estar falando sobre ajustar uma curva logística aos dados, em vez de ajustar dados distribuídos binomialmente - isto é, uma forma de regressão não linear , mas usando em vez da norma L 2 . De fato, a função de perda | f ( x ) - y | sugere que o máximo não é 1 (se for esse o caso, faz referência ao binômio GLM enganoso). Por outro lado, se realmente estiver restrito a 0-1, a função de perda não faz sentido. Você pode dar detalhes da sua situação atual, por favor? L1L2|f(x)y|1
Glen_b
Observe que a ajuda solicita que você não publique a mesma pergunta em vários sites, mas escolha um único site. Se, posteriormente, você mudar de idéia sobre qual site é melhor, sinalize-o para atenção do moderador e peça que seja movido.
Glen_b -Reinstate Monica
@Glen_b: Eu acho que o "vetor bit (lógico) y" implica resposta 0/1.
Sds

Respostas:

21

O que você quer fazer não existe porque é, por falta de palavras melhores, matematicamente falho.

Mas primeiro, enfatizarei por que acho que as premissas da sua pergunta são sólidas. Tentarei então explicar por que acho que as conclusões que você tira delas se baseiam em um mal-entendido do modelo logístico e, finalmente, vou sugerir uma abordagem alternativa.

Vou denotar suasnobservações (as letras em negrito denotam vetores) que se encontram noespaço dimensionalp(a primeira entrada de x{(xxi,yi)}i=1nnpxxip<nyi[0,1]f(xxi)=f(xxiββ)xxiββnp

Você está certo de que, se pretende usar o TVD como critério para avaliar o modelo ajustado, é razoável esperar que seu ajuste otimize o mesmo critério entre todos os candidatos possíveis em seus dados. Conseqüentemente

ββ=argminββRp||yyf(xxiββ)||1

ϵi=yif(xxiββ)E(ϵϵ)=0ϵi yixxiϵi1f(xxiββ)yi=1f(xxiββ)f(xxiββ)yi=11f(xxiββ)

Essas considerações em conjunto implicam que:

var(ϵϵ)=E(ϵϵ2)=(1f(xxββ))2f(xxββ)+(f(xxββ))2(1f(xxββ))=(1f(xxββ))f(xxββ)=E(yy|xx)E(1yy|xx)

var(ϵϵ)xxE(y|xx).5

l1ββxxE(yy|xx).5ββ=ββ:f(xxββ).5

Uma solução, como fica claro na exposição acima, é abandonar a exigência de imparcialidade. Uma maneira popular de influenciar o estimador (com alguma interpretação bayesiana anexada) é incluir um termo de encolhimento. Se redimensionarmos a resposta:

yi+=2(yi.5),1in

f(xxββ)g(xx,[c,γγ])=xx[c,γγ]cp1γγ||γγ||2

[c,γγ]=argmin[[c,γγ]Rpi=1nmax(0,1yi+xxi[[c,γγ])+12||γγ||2

xx[[c,γ]l1[c,γγ]ββ[c,γγ]

user603
fonte
Eu gostaria de poder dar a você mais de 25 pontos :-)
sds 23/05
@sds; obrigado: foi uma ótima pergunta :) Volto durante o dia e preenche os detalhes, corrija algum erro de digitação.
User603 23/05
8

Não sei por que você desejaria usar a perda L1 para algo restrito entre 0 e 1. Dependendo do seu objetivo, considere algo como perda de dobradiça, que é semelhante à perda L1 em ​​uma direção e horizontalmente. no outro.

De qualquer forma, o código abaixo deve fazer o que você pediu. Observe que a resposta ideal é basicamente uma função de etapa.

set.seed(1)

# Fake data
x = seq(-1, 1, length = 100)
y = rbinom(100, plogis(x), size = 1) # plogis is the logistic function

# L1 loss
loss = function(y, yhat){
  sum(abs(y - yhat))
}

# Function to estimate loss associated with a given slope & intercept
fn = function(par){
  a = par[1]
  b = par[2]
  loss(y = y, yhat = plogis(a + b * x))
}

# Find the optimal parameters
par = optim(
  par = c(a = 0, b = 0),
  fn = fn
)$par

# Plot the results
plot(y ~ x)
curve(plogis(par[1] + par[2] * x), add = TRUE, n = 1000)
David J. Harris
fonte
0

Você pode usar o pacote glmnet para ajustar os modelos L1, L2. Não se limita à regressão logística, mas a inclui.

Aqui está a vinheta: http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html

Há também um webminar: https://www.youtube.com/watch?v=BU2gjoLPfDc

Liblinear é bom, mas achei o glmnet mais fácil de começar. O Glmnet inclui uma função que faz validação cruzada e seleciona um parâmetro de regularização para você com base em diferentes métricas, como a AUC.

Em relação à teoria, eu lia o artigo tibshiarini sobre o laço (regularização de L1) e o capítulo sobre elementos do aprendizado estatístico. http://statweb.stanford.edu/~tibs/lasso/lasso.pdf

Sobre a perda de log, é apenas para avaliar modelos. Não é uma função de perda para o ajuste do modelo.

marbel
fonte