Imputação antes ou depois da divisão no trem e no teste?

18

Eu tenho um conjunto de dados com N ~ 5000 e faltando cerca de 1/2 em pelo menos uma variável importante. O principal método analítico serão os riscos proporcionais de Cox.

Eu pretendo usar várias imputações. Também estarei me dividindo em um trem e um conjunto de testes.

Devo dividir os dados e depois imputar separadamente, ou imputar e depois dividir?

Se é importante, eu vou estar usando PROC MIno SAS.

Peter Flom - Restabelece Monica
fonte
2
50% de valores ausentes para uma variável crucial? Ugh. Em vez de imputar, por que não criar uma categoria 'Em falta' para a variável?
robertf
Nenhuma variável tem 50% de falta, mas cerca de 50% está ausente em pelo menos uma. Além disso, eles são contínuos, então "desaparecer" atrapalharia as coisas.
Peter Flom - Restabelece Monica
Ah Fico nervoso usando a imputação. Eu me pergunto sobre o mérito de ter uma variável contínua com valores de 50% imputados versus converter o cont. variável para categorizar com uma categoria 'Em falta' mais compartimentos suficientes para capturar o comportamento dos valores não ausentes?
precisa saber é o seguinte
Não gosto de agrupar variáveis ​​contínuas.
Peter Flom - Restabelece Monica

Respostas:

20

Você deve dividir antes do pré-processamento ou imputação.

A divisão entre treinamento e conjunto de testes é uma tentativa de replicar a situação em que você possui informações passadas e está construindo um modelo que será testado em informações futuras ainda desconhecidas: o conjunto de treinamento substitui o passado e o conjunto de testes assume o lugar do futuro, para que você só teste seu modelo treinado uma vez.

Tendo em mente a analogia do passado / futuro, isso significa qualquer coisa que você faça para pré-processar ou processar seus dados, como imputar valores ausentes, que você deve fazer apenas no conjunto de treinamento. Você pode se lembrar do que fez no seu conjunto de treinamento se o seu conjunto de testes também precisar de pré-processamento ou imputação, para que você faça da mesma maneira nos dois conjuntos.

Adicionado a partir dos comentários: se você usar os dados de teste para afetar os dados de treinamento, os dados de teste serão usados ​​para criar seu modelo, portanto, eles deixarão de ser dados de teste e não fornecerão um teste justo do seu modelo. Você corre o risco de se ajustar demais e foi para desencorajar isso que você separou os dados do teste em primeiro lugar

Henry
fonte
Quando você diz "você faz da mesma maneira nos dois conjuntos", você quer dizer: "use o mesmo método para imputar dados ausentes no conjunto de teste, mas NÃO os mesmos dados"?
Timwiz 5/05
@colorlace Use a analogia passada / futura. Você usou o conjunto de treinamento no passado e imputou alguns valores. Agora você obtém o teste definido no futuro e deseja atribuir alguns de seus valores; você provavelmente vai usar o mesmo método de antes aplicada aos dados de teste (embora você está livre para incorporar o que você aprendeu com os dados de treinamento)
Henry
Se você "é livre para incorporar o que aprendeu dos dados de treinamento", então como isso é diferente de simplesmente não se dividir antes da imputação.
Timwiz
1
@colorlace: esse ponto final é exatamente o que estou dizendo: nada do que você faz com os dados de treinamento deve ser informado pelos dados de teste (a analogia é que o futuro não deve afetar o passado), mas o que você faz com os dados de teste pode ser informado pelos dados de treinamento (a analogia é que você pode usar o passado para ajudar a prever o futuro)
Henry
1
@colorlace - se você usar os dados de teste para afetar os dados de treinamento, os dados de teste serão usados ​​para criar seu modelo, de modo que deixem de ser dados de teste e não fornecerão um teste justo do seu modelo. Você corre o risco overfitting, e foi para desencorajar este que você separou os dados de teste em primeiro lugar
Henry
1

Acho melhor você se separar antes de imputar. Por exemplo, você pode atribuir valores ausentes à média da coluna. Nesse caso, se você atribuir primeiro o conjunto de dados train + válido e dividir a seguir, utilizou o conjunto de dados de validação antes de criar seu modelo, e é assim que um problema de vazamento de dados entra em cena.

Mas você pode perguntar, se eu imputar após a divisão, pode ser muito tedioso quando eu precisar fazer a validação cruzada. Minha sugestão para isso é usar o pipeline do sklearn. Ele realmente simplifica seu código e reduz a chance de cometer um erro. Consulte Pipeline

cc458
fonte
0

Só para adicionar o exposto, eu também favoreceria a divisão antes da imputação ou qualquer tipo de pré-processamento. Nada do que você faz com os dados do treinamento deve ser informado pelos dados do teste (a analogia é que o futuro não deve afetar o passado). Você pode se lembrar do que fez no seu conjunto de treinamento, se ele também precisar de pré-processamento ou imputação, para que você faça da mesma maneira nos dois conjuntos (a analogia é que você pode usar o passado para ajudar a prever o futuro) .

Se você usar os dados de teste para afetar os dados de treinamento de alguma forma, os dados de teste estão sendo usados ​​para construir seu modelo; portanto, deixam de ser dados de teste e não fornecerão um teste justo de seu modelo. Você corre o risco de se adaptar, e foi para desencorajar isso que você separou os dados do teste em primeiro lugar!

Eu acho que o pacote de intercalação em r é muito útil nesse cenário. Achei especificamente que esse post é extremamente útil https://topepo.github.io/caret/model-training-and-tuning.html

ALEX.VAMVAS
fonte