Por que reduzir um modelo de regressão para um modelo de classificação por discretização de saída melhora um modelo?

7

Em problemas de regressão, se a saída for discretizada em posições / categorias / clusters e usada como etiquetas, o modelo será reduzido a um modelo de classificação.

Minha pergunta é: qual é a motivação teórica ou aplicada por trás dessa redução? Nas minhas experiências particulares em prever a localização a partir do texto, muitas vezes vi melhorias quando modelo o problema como classificação e não como regressão.

No meu caso particular, a saída é 2d, mas estou procurando uma explicação mais geral para isso.

Atualização: suponha que a entrada seja texto BoW e a saída seja coordenadas (por exemplo, como nos dados geotagged do Twitter). Na regressão, a tarefa é prever o texto lat / lon dado usando a perda de erro ao quadrado. Se agruparmos os pontos de lat / lon de treinamento e assumirmos que cada cluster é uma classe, poderemos prever uma classe otimizando a perda de entropia cruzada em um modelo de classificação.

Avaliação:

Para regressão, a distância média entre os locais previstos e os locais dourados.

Para classificação, a distância média entre o ponto médio de treinamento no cluster previsto e a localização do ouro.

Cinza
fonte
Há muito pouca informação, você pode aumentar? Especificamente, quais foram seus modelos?
Kjetil b halvorsen
Você está comparando regressão LINEAR com classificação multi-classe com função de pontuação linear? Nesse caso, o último é obviamente um modelo mais expressivo.
Sobi
Em que sentido você quer dizer "melhorar"? Como você está medindo isso?
Glen_b -Reinstate Monica
Suponha o texto de entrada MLP com BoW em que o destino é coordenadas 2D (regressão) e use a perda de erro ao quadrado e compare-o com o local em que você prevê uma cidade ou um cluster de k-médias como rótulos usando a perda de entropia cruzada.
Ash

Respostas:

8

Vejamos as fontes de erro para suas previsões de classificação, comparadas com as de uma previsão linear. Se você classificar, você tem duas fontes de erro:

  1. Erro ao classificar no compartimento errado
  2. Erro da diferença entre a mediana da posição no depósito e o valor alvo (a "localização do ouro")

Se seus dados tiverem pouco ruído, você geralmente será classificado na lixeira correta. Se você também tiver muitos compartimentos, a segunda fonte de erro será baixa. Se, por outro lado, você tiver dados de alto nível de ruído, poderá classificá-lo erroneamente com frequência na lixeira errada, e isso poderá dominar o erro geral - mesmo se você tiver muitas lixeiras pequenas, a segunda fonte de erro será pequena se você classificar corretamente. Por outro lado, se você tiver poucos compartimentos, classificará com mais freqüência corretamente, mas o erro dentro da lixeira será maior.

No final, provavelmente tudo se resume a uma interação entre o ruído e o tamanho da lixeira.

Aqui está um pequeno exemplo de brinquedo, que eu corri para 200 simulações. Uma relação linear simples com ruído e apenas dois compartimentos:

Treinamento

Agora, vamos executar isso com ruído baixo ou alto. (O conjunto de treinamento acima apresentava alto ruído.) Em cada caso, registramos as MPEs a partir de um modelo linear e de um modelo de classificação:

nn.sample <- 100
stdev <- 1
nn.runs <- 200
results <- matrix(NA,nrow=nn.runs,ncol=2,dimnames=list(NULL,c("MSE.OLS","MSE.Classification")))

for ( ii in 1:nn.runs ) {
    set.seed(ii)
    xx.train <- runif(nn.sample,-1,1)
    yy.train <- xx.train+rnorm(nn.sample,0,stdev)
    discrete.train <- yy.train>0
    bin.medians <- structure(by(yy.train,discrete.train,median),.Names=c("FALSE","TRUE"))

    # plot(xx.train,yy.train,pch=19,col=discrete.train+1,main="Training")

    model.ols <- lm(yy.train~xx.train)
    model.log <- glm(discrete.train~xx.train,"binomial")

    xx.test <- runif(nn.sample,-1,1)
    yy.test <- xx.test+rnorm(nn.sample,0,0.1)

    results[ii,1] <- mean((yy.test-predict(model.ols,newdata=data.frame(xx.test)))^2)
    results[ii,2] <- mean((yy.test-bin.medians[as.character(predict(model.log,newdata=data.frame(xx.test))>0)])^2)
}

plot(results,xlim=range(results),ylim=range(results),main=paste("Standard Deviation of Noise:",stdev))
abline(a=0,b=1)
colMeans(results)
t.test(x=results[,1],y=results[,2],paired=TRUE)

Barulho baixo Barulho alto

Como vemos, se a classificação melhora a precisão se reduz ao nível de ruído neste exemplo.

Você pode brincar um pouco com dados simulados ou com diferentes tamanhos de compartimento.

Por fim, observe que, se você estiver tentando tamanhos diferentes de lixeira e mantendo as que apresentam melhor desempenho, não deve se surpreender com o desempenho melhor que um modelo linear. Afinal, você está basicamente adicionando mais graus de liberdade e, se não tomar cuidado (validação cruzada!), Acabará ajustando demais as caixas.

Stephan Kolassa
fonte