Como se supera facilmente?

7

Esta é uma pergunta estranha, eu sei.

Eu sou apenas um noob e tentando aprender sobre diferentes opções de classificadores e como elas funcionam. Então, eu estou fazendo a pergunta:

Dado um conjunto de dados de n1-dimensões e n2-observações em que cada observação pode ser classificada em n3-buckets, qual algoritmo com mais eficiência (idealmente com apenas uma iteração de treinamento) produz um modelo (limite de classificação) que classificaria perfeitamente todas as observações no conjunto de dados (completamente super ajuste)?

Em outras palavras, como alguém supera facilmente?

(Por favor, não me ensine sobre 'não ajustar demais'. Isso é apenas para fins educacionais teóricos.)

Suspeito que a resposta seja mais ou menos assim: "Bem, se seu número de dimensões for maior que seu número de observações, use o algoritmo X para desenhar os limites, caso contrário, use o algoritmo Y".

Também suspeito que a resposta diga: "Você pode traçar um limite suave, mas mais computacionalmente caro do que desenhar linhas retas entre todas as diferentes observações classificadas".

Mas é isso que minha intuição me guiará. Você pode ajudar?

Eu tenho um exemplo desenhado à mão do que acho que estou falando em 2D com classificação binária.

Basicamente, basta dividir a diferença, certo? Que algoritmo faz isso de forma eficiente para n-dimensões?

Basicamente, basta dividir a diferença, certo?  Qual algoritmo faz isso com eficiência?

Pilha legítima
fonte
5
knn com ? k=1
Shimao 01/05/19
@ shimao Suponho que funcionaria, não? Sim, não vejo por que não. Muito obrigado!
Legit Stack
@ shimao Essa é a maneira mais eficiente de codificar o limite? Provavelmente certo? Como não sabemos se os dados são inteiramente aleatórios ou não, o uso dos dados como modelo codificado com o algoritmo KNN é provavelmente o melhor que você pode fazer em geral. Direita?
Legit Stack
2
@ shimao: você deseja postar seu comentário como resposta (talvez com um pouco mais de detalhes)?
Stephan Kolassa
O título não é muito informativo sobre o conteúdo. A grande maioria dos usuários que acessam esta página procurando respostas encontrará a pergunta real muito diferente do que eles esperavam. Por favor revise.
OrangeSherbet

Respostas:

7

Desde que todas as observações sejam únicas, os vizinhos K mais próximos com K definido como 1 e com qualquer métrica de distância válida arbitrária fornecerão um classificador que se encaixa perfeitamente no conjunto de treinamento (já que o vizinho mais próximo de cada ponto do conjunto de treinamento é trivial , em si). E é provavelmente o mais eficiente, pois nenhum treinamento é necessário.

Essa é a maneira mais eficiente de codificar o limite? Provavelmente certo? Como não sabemos se os dados são inteiramente aleatórios ou não, o uso dos dados como modelo codificado com o algoritmo KNN é provavelmente o melhor que você pode fazer em geral. Direita?

É o mais eficiente em termos de tempo, mas não necessariamente o mais eficiente em termos de espaço.

shimao
fonte
Se você deseja eficiência de espaço, armazene os códigos de hash. Observe também que você só precisa analisar os buckets N-1.
Mooing Duck
11
Se você deseja obter o limite, pode calcular o mosaico Voronoi.
Davidmh
5

Você não pode.

Pelo menos não em geral, na medida que você deseja, se você deseja um ajuste perfeito com dados arbitrários e dimensionalidade arbitrária.

Como exemplo, suponha que tenhamos dimensões preditivas (ou seja, nenhuma) e observações classificadas em buckets. As duas observações são classificadas em dois baldes diferentes , a saber "chocolate" e "baunilha".n1=0n2=2n3=2

Como você não possui preditores, não poderá classificá-los perfeitamente, ponto final.


Se você possui pelo menos um preditor que aceita valores diferentes em cada observação , pode realmente superestimar arbitrariamente mal, simplesmente usando ordens polinomiais arbitrariamente altas para um preditor numérico (se o preditor for categórico com valores diferentes em cada observação, você não nem precisa se transformar). A ferramenta ou modelo é praticamente secundário. Sim, é fácil exagerar.

Aqui está um exemplo. As 10 observações são completamente independentes do único preditor numérico. Ajustamos regressões ou poderes logísticos cada vez mais complexos do preditor e classificamos usando um limite de 0,5 (o que não é uma boa prática ). Os pontos corretamente ajustados estão marcados em verde, os pontos incorretos em vermelho.

sobreajuste

Código R:

nn <- 10
set.seed(2)

predictor <- runif(nn)
outcome <- runif(nn)>0.5

plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.1,1.6))
axis(2,c(0,1),c("FALSE","TRUE"))

orders <- c(1,2,3,5,7,9)
xx <- seq(min(predictor),max(predictor),0.01)

par(mfrow=c(3,2))
for ( kk in seq_along(orders) ) {
    plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.2,1.2),main=paste("Order:",orders[kk]))
    axis(2,c(0,1),c("FALSE","TRUE"))

    model <- glm(outcome~poly(predictor,orders[kk]),family="binomial")
    fits_obs <- predict(model,type="response")
    fits <- predict(model,newdata=data.frame(predictor=xx),type="response")

    lines(xx,fits)
    correct <- (fits_obs>0.5 & outcome) | ( fits_obs<0.5 & !outcome)
    points(predictor[correct],outcome[correct],cex=1.4,col="green",pch="o")
    points(predictor[!correct],outcome[!correct],cex=1.4,col="red",pch="o")
}
Stephan Kolassa
fonte