Práticas recomendadas de aprendizado de máquina para grandes conjuntos de dados

9

Estou prestes a me formar no meu mestre e aprendi sobre aprendizado de máquina, além de ter realizado projetos de pesquisa com ele. Eu me pergunto sobre as melhores práticas do setor ao executar tarefas de aprendizado de máquina com grandes conjuntos de dados (como 100s GB ou TB). Avalie se outros cientistas de dados podem compartilhar sua experiência. Aqui estão as minhas perguntas:

  1. Obviamente, conjuntos de dados muito grandes levam mais tempo para treinar (pode levar dias ou semanas). Muitas vezes, precisamos treinar vários modelos (SVM, Rede Neural etc.) para comparar e encontrar um melhor modelo de desempenho. Suspeito que, em projetos do setor, queremos os resultados o mais rápido possível, mas produzimos o melhor desempenho. Existem dicas para reduzir o tempo de treinamento e teste? Se você recomendar o subconjunto do conjunto de dados, estarei interessado em aprender a melhor forma de subconjunto do conjunto de dados para cobrir todos ou a maioria dos cenários do conjunto de dados.
  2. Sabemos que executar a validação cruzada é melhor, pois pode reduzir o ajuste excessivo. No entanto, a validação cruzada também leva tempo para treinar e o modelo treinado com validação cruzada pode não ser implementado diretamente (falando da experiência do python sklearn: preciso treinar o modelo com o conjunto de dados novamente após o teste de validação cruzada para sua implementação). Você normalmente faz a validação cruzada em seus projetos de big data ou se dá bem com a divisão de teste de trem?

Aprecie o feedback.

iLoeng
fonte

Respostas:

8

Vou listar algumas práticas que achei úteis, espero que ajude:

  1. Independentemente de os dados serem enormes ou não, a validação cruzada é essencial na construção de qualquer modelo. Se isso levar mais tempo do que o consumidor final está disposto a esperar, talvez seja necessário redefinir suas expectativas ou obter hardware / software mais rápido para construir o modelo; mas não pule a validação cruzada. A plotagem de curvas de aprendizado e a validação cruzada são etapas eficazes para nos ajudar a reconhecer e corrigir erros no início do processo. Eu experimentei casos em que um simples conjunto de testes de trem não revela nenhum problema até executar validações entre dobras e encontrar uma grande variação no desempenho do algoritmo em diferentes dobras.

  2. Antes de dimensionar um conjunto de dados, elimine os registros com valores ausentes de variáveis-chave e outliers, colunas de variáveis ​​altamente correlacionadas e variáveis ​​de variação quase zero. Isso fornecerá uma estimativa muito melhor do conjunto de dados utilizável real. Às vezes, você pode acabar com apenas uma fração do conjunto de dados disponível que pode realmente ser usado para criar um modelo.

  3. Ao dimensionar um conjunto de dados para criar um modelo, é mais fácil estimar os recursos de computação se você enumerar o conjunto de dados em linhas e colunas e o tamanho da memória da matriz numérica final. Como todo algoritmo de aprendizado de máquina acabará convertendo o conjunto de dados em uma matriz numérica, enumerar o tamanho do conjunto de dados em termos de GB / TBs de dados brutos de entrada (que podem ser na maioria cadeias / variáveis ​​nominais textuais / etc.) Geralmente é enganoso e o O conjunto de dados pode parecer mais assustador e gigantesco para se trabalhar do que é.

  4. Depois de conhecer (ou estimar) o tamanho final utilizável do seu conjunto de dados, verifique se você possui uma máquina adequada para poder carregá-lo na memória e treinar o modelo. Se o tamanho do seu conjunto de dados for menor que a memória disponível / utilizável pelo software, você não precisará mais se preocupar com o tamanho.

  5. Se o tamanho do conjunto de dados for maior que a memória disponível para treinar um modelo, tente estas abordagens (começando pelas mais simples primeiro):

    • Use uma máquina com mais memória: se você estiver usando um provedor de serviços em nuvem, a abordagem mais simples pode ser fornecer mais memória e continuar construindo o modelo como de costume. Para máquinas físicas, tente adquirir RAM adicional, o preço continuará a reduzir e, se o conjunto de dados permanecer grande ou aumentar com o tempo, será um bom investimento.
    • Adicionar nós ao cluster: para implantações de computação em cluster baseadas no Hadoop e Spark, o treinamento em um conjunto de dados maior é tão fácil quanto adicionar mais máquinas ao cluster.
    • Muitas vezes, as tarefas de classificação exigem treinamento em dados com classes altamente desequilibradas; a proporção de classes positivas para negativas pode às vezes chegar a 1: 1000 ou mais. Um método simples para melhorar a precisão nesses casos é superestimar a classe minoritária ou subestimar a classe majoritária ou fazer as duas coisas juntas. Se você tiver um grande conjunto de dados, a subamostragem da classe majoritária é uma opção muito boa, que melhorará a precisão do algoritmo e reduzirá o tempo de treinamento.
    • Construa um conjunto: divida o conjunto de dados aleatoriamente e treine vários alunos básicos em cada parte, depois combine-os para obter a previsão final. Isso usaria com mais eficiência o grande conjunto de dados e produziria um modelo mais preciso. Mas você precisa gastar mais tempo para construir cuidadosamente o conjunto e evitar as armadilhas comuns da construção de conjuntos.
    • Se você estiver usando um conjunto, treine muitos modelos de rosca única em paralelo. Quase todos os softwares ML fornecem recursos para treinar vários modelos em diferentes núcleos ou nós separados.
    • Avalie vários algoritmos diferentes no tempo necessário para treiná-los para seu conjunto de dados específico versus a precisão deles. Embora não haja uma resposta universal, mas eu descobri que ao usar dados ruidosos, os SVMs levam muito mais tempo para serem treinados do que um conjunto cuidadosamente construído de modelos de regressão regularizados, mas podem ser apenas um pouco mais precisos no desempenho; e uma rede neural bem construída pode levar muito tempo para treinar em comparação com uma árvore CART, mas tem um desempenho significativamente mais preciso que a árvore.
    • Para reduzir o tempo necessário para construir o modelo, tente automatizar o máximo possível do processo. Algumas horas gastas na automação de uma tarefa manual complexa e sujeita a erros podem salvar sua equipe cem horas depois no projeto.
    • Se disponível, use as implementações de algoritmos que usam processamento paralelo, matrizes esparsas e computação com reconhecimento de cache, que reduzem significativamente o tempo de processamento. Por exemplo, use xgboost em vez de uma implementação de núcleo único do GBM.
    • Se nada mais funcionar, treine o modelo em um conjunto de dados menor; como Emre sugeriu em sua resposta, use curvas de aprendizado para corrigir o menor tamanho de amostra necessário para o treinamento do modelo, adicionando mais registros de treinamento que esse tamanho não melhora visivelmente a precisão do modelo. Aqui está um bom artigo que explora essa situação - http://web.mit.edu/vondrick/largetrain.pdf .
Sandeep S. Sandhu
fonte
Obrigado @Sandeep pela sua resposta exaustiva. Quanto ao ponto 3, enumerando o conjunto de dados em linhas e colunas e o tamanho da memória da matriz numérica final, você poderia elaborar mais? Isso significa encontrar o tamanho do seu conjunto de dados limpo usando sintaxes, como 'df.values.nbytes', 'df.shape' no quadro de dados do pandas? Obrigado.
iLoeng 8/09/16
Utilização: df.values.nbytes + df.index.nbytes + df.columns.nbytes
Sandeep S. Sandhu
4

A questão é: quantos dados são necessários para saturar seu modelo? Para determinar isso, você pode plotar curvas de aprendizado com quantidades variáveis ​​de dados, talvez aumentando / diminuindo de tamanho por um fator constante. Se o treinamento em todos os dados não for possível, a curva de aprendizado pode ajudá-lo a fazer uma troca informada.

A saturação do modelo também entra em jogo com a validação cruzada. Se você não estiver perto da saturação, o uso de um pequeno número de dobras fornecerá números de desempenho pessimistas, pois você estará treinando seu modelo com menos dados do que ele pode usar.

Por fim e vice-versa, você pode usar um modelo mais complexo em vez de "redimensionar" os dados para se adequar ao modelo.

Bem-vindo ao DataScience.SE.

Emre
fonte