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:
- Erro ao classificar no compartimento errado
- 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:
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)
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.