Distribuição diferente do conjunto de testes e do conjunto de treinamento


14

Estou trabalhando em uma competição de ciência de dados para a qual a distribuição do meu conjunto de testes é diferente do conjunto de treinamento. Quero subamostrar observações do conjunto de treinamento que se assemelha muito ao conjunto de teste.

Como posso fazer isso?


Subamostragem aleatória, Sobre-amostragem aleatória, Sobre-amostragem baseada em cluster, informada sobre amostragem: Técnica de sobre-amostragem de minorias sintéticas, Técnica de sobre-amostragem de minorias sintéticas modificada (MSMOTE) etc.
Aditya

É melhor marcar uma das respostas como "Resposta Aceita" se estiver satisfeito com alguma delas.
TwinPenguins

Respostas:


16

Ótima pergunta, isso é o que é conhecido no paradigma de Machine Learning como "Covariate Shift" ou "Model Drift" ou "Nonstationarity" e assim por diante.

Uma das suposições críticas que se faria para construir um modelo de aprendizado de máquina para previsões futuras é que dados não vistos (teste) vêm da mesma distribuição que dados de treinamento! No entanto, na realidade, essa suposição bastante simples quebra facilmente e os dados futuros (sua distribuição) mudam ao longo do tempo por vários motivos. Para aqueles que podem não estar familiarizados com este problema muito importante, incentivo a procurar aqui ou postar !

Para mim, sua pergunta se enquadra na mesma categoria. Embora eu não tenha a solução perfeita (uma implementação a oferecer), mas acho que você pode procurar:

  • Esta postagem no blog fornece uma maneira simples de lidar com a subamostragem de dados de treinamento com o código fornecido no Python!
  • Confira este trabalho de pesquisa . Eles propõem resolver o problema reponderando os dados do treinamento para que a distribuição do treinamento seja mais próxima da distribuição do teste usando o Procedimento de Estimativa de Importância de Kullback-Leibler, com base no teorema " divergência de Kullback-Leibler ". Não sei se eles fornecem uma implementação ou ela pode ser implementada facilmente, mas acho que vale a pena cavar, pois parece uma maneira profissional de lidar com a incompatibilidade de distribuição.

Atualização RÁPIDA (uma boa solução) : Encontrei uma implementação em Python do algoritmo KLIEP desse trabalho de pesquisa (último ponto) para encontrar esses pesos. Parece bastante fácil de usar! Basicamente, reanalisa o treinamento colocando pesos (através do algoritmo KLIEP), de modo que a suposição de ter uma distribuição semelhante de treinamento e teste seja verdadeira o máximo possível.


5

Quero subamostrar observações do conjunto de treinamento que se assemelha muito ao conjunto de teste.

Não tenho certeza de que você queira fazer isso. O objetivo é treinar seu algoritmo para que ele generalize bem os dados não vistos.

Normalmente, deve-se adaptar seus dados de teste aos dados do trem (por exemplo, padronizar os dados de teste de acordo com os dados do trem ) e não o contrário. Na prática, você não conhece seus dados de teste.


3

A subamostragem do conjunto de trens pode não ser a melhor solução!

As diferenças entre o conjunto de teste / execução e a distribuição / recursos do conjunto de treinamento são muito comuns nas tarefas de aprendizado supervisionado (esse é um dos motivos pelos quais competições como o Kaggle são desafiadoras). É por isso que dizemos que o desempenho passado pode (apenas) ser usado como um guia para estimar o desempenho futuro, mas não o indica / garante . Portanto, os modelos generalizáveis sempre foram preferidos aos modelos ajustados, que podem ter um desempenho muito bom no (sub) conjunto de trens, mas apresentam um desempenho ruim em dados não vistos.

Embora essa diferença seja normal, a diferença muito grande entre a amostra passada e futura pode ser referida como exemplos de desvio de conceito, que é um campo de pesquisa ativo por si só. Dada a sua pergunta, não posso julgar que o seu caso é normal ou que o conceito está realmente acontecendo.

Estas são as minhas sugestões:

  1. Treine vários modelos com alta capacidade de generalização. Usando inicialização amostragem do conjunto de dados de trem, você pode facilmente calcular viés e variância componentes de erros. Lembre-se de que você está procurando um modelo de baixa variação (em que as alterações nos dados teriam um efeito marginal no desempenho), em vez de modelos de baixa polarização, mas de alta variação (que podem se adequar ao seu (sub) conjunto de treinamento). Agora, você pode selecionar os melhores algoritmos e avaliá-los em relação ao conjunto de testes. Observe que no tempo de treinamento não deveríamos olhar para o conjunto de testes!

  2. Em vez de várias amostragens aleatórias, procure padronização / normalização e seleção / engenharia de recursos. Essas técnicas podem ser práticas no aprendizado de modelos mais gerais. Por exemplo, às vezes o alcance do domínio do recurso pode mudar ao longo do tempo, enquanto a forma da distribuição (seja ela qual for) permanece quase a mesma (por exemplo, a mesma distribuição que é deslocada para a esquerda ou direita). Nesse caso, uma padronização simples (ou seja, mapeamento do trem e amostras de teste para um espaço predefinido, como [0,1] usando diferentes funções de mapeamento) pode reduzir os sintomas.

  3. A redução da amostragem sistemática pode ser apenas uma solução apropriada se você fizer isso com base em algum conhecimento sobre o problema (não apenas com o objetivo de obter uma melhor precisão no conjunto de dados de teste). Por exemplo, você pode saber que alguns dos registros nos dados de trem são amostrados há muito tempo, de campo distante, ou afetados por fatores específicos que nenhum deles acontecerá no futuro (na coleta de dados de teste). Nesse caso, você pode remover as amostras que podem ser irrelevantes, pois está confiante de que não verá esses padrões no futuro (quero dizer, você deve ter uma lógica por trás da seleção do subconjunto de treinamento, em vez de examinar o conjunto de testes que na realidade, você não tem acesso a ele). Nesse caso, eu chamo de remoção externa em vez de reduzir a amostragem.


11
p(y|x)

-1

Existe um bom pacote em python (scikit learn)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Você pode subamostrar suas observações do conjunto de treinamento usando este pacote.


11
Até onde eu entendi a pergunta, as distribuições de trem / teste são diferentes e, se não levadas em conta, levariam ao que é conhecido "Covariate Shift". Uma subamostra simples usando a implementação "train_test_split" no scikit learn mencionada aqui não levará em conta as distribuições durante a divisão! Portanto, a resposta não é relevante.
TwinPenguins
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.