Opções de análise de dados fora do núcleo

18

Uso SAS profissionalmente há quase 5 anos. Eu o instalei no meu laptop e frequentemente tenho que analisar conjuntos de dados com 1.000 a 2.000 variáveis ​​e centenas de milhares de observações.

Tenho procurado alternativas ao SAS que me permitam realizar análises em conjuntos de dados de tamanhos semelhantes. Estou curioso para saber o que outras pessoas usam para situações como essa. Isso certamente não é "Big Data" da maneira que é usada hoje. Meus conjuntos de dados também não são pequenos o suficiente para armazenar na memória. Preciso de uma solução que possa aplicar algoritmos aos dados armazenados no disco rígido. Estas são as coisas que eu investiguei sem sucesso:

  1. O R - BigMemory pode criar matrizes armazenadas sem memória, mas os elementos devem ter o mesmo modo. Eu trabalho com dados que são quase uma divisão 50/50 entre caracteres e numéricos. O pacote FF se aproxima do que eu preciso, mas não entendo quais procedimentos são compatíveis com ele. Eu acho que o apoio é um pouco limitado.
  2. Pandas - fiquei muito empolgado com uma alternativa pitônica ao R. No entanto, ele também tem que armazenar todos os dados na memória.
  3. Revolução R - Este mostra bastante promessa. Tenho uma cópia no meu computador doméstico (grátis se você se inscrever no Kaggle) e ainda não o testou como alternativa viável ao SAS. Comentários sobre o Revolution R como uma alternativa do SAS são muito apreciados.

obrigado

ATUALIZAÇÃO 1

Edição para acrescentar que estou procurando soluções práticas e reais que as pessoas usaram com sucesso. Na maioria das vezes, o SAS me permite vasculhar arquivos grandes sem me preocupar um pouco com as restrições de memória. No entanto, o SAS foi implementado, eles descobriram como tornar o gerenciamento de memória transparente para o usuário. Mas, é com pesar que eu usei o SAS para o meu trabalho (preciso) e adoraria uma alternativa de software livre que me permita trabalhar em dados "grandes" sem ter que pensar muito sobre onde os dados estão localizados em um local. hora específica (na memória ou no disco).

As coisas mais próximas que me deparei são o pacote FF de R e algo no horizonte para Python chamado Blaze . E, no entanto, esses problemas existem há muitos anos, então o que os analistas estão fazendo nesse meio tempo? Como eles estão lidando com esses mesmos problemas com os limites de memória? A maioria das soluções oferecidas parece ser:

  • Obtenha mais RAM - esta não é uma boa solução, imo. É fácil encontrar um conjunto de dados que pode exceder a RAM e ainda caber em um disco rígido. Além disso, o fluxo de trabalho deve acomodar todas as estruturas criadas durante a análise exploratória dos dados.
  • Subconjunto dos dados - isso é bom para exploração, mas não para finalização de resultados e relatórios. Eventualmente, quaisquer processos desenvolvidos em um subconjunto terão que ser aplicados a todo o conjunto de dados (no meu caso, de qualquer maneira).
  • Analise os dados - é sobre isso que gostaria de saber mais das pessoas que realmente implementam esse fluxo de trabalho. Como isso é feito? Com quais ferramentas? Isso pode ser feito de maneira transparente para o usuário? (ou seja, crie alguma estrutura de dados em disco e o trabalho de estrutura cuida da parte sob o capô).
Zelazny7
fonte
1
As versões mais recentes do Stata em máquinas de 64 bits não têm problemas com conjuntos de dados desse tamanho (porque 5 GB se encaixam facilmente na RAM hoje em dia), mas você tem algum interesse em alternativas comerciais ao SAS ou está olhando apenas para o FOSS?
whuber
1
Sim, as soluções FOSS são o que estou procurando. Concordo que um conjunto de dados pode caber em 5 GB de RAM, mas também precisa lidar com as operações e estruturas de dados adicionais criadas durante a análise exploratória de dados. Junte isso a laptops comerciais equipados com 4 GB de RAM e a sobrecarga consumida pelo sistema operacional e pelos erros de memória aparecem rapidamente.
Zelazny7
2
@ Zelazny7: Adicionar outros 4Gigs a um laptop deve ser bem barato nos dias de hoje. :)
curious_cat
3
Outra opção é armazenar os dados em um banco de dados (SQL ou outro). Frequentemente, uma análise requer apenas um subconjunto de dados (variáveis ​​1:10, mas não 1: 1000) que cabe na memória. Se o subconjunto ainda for maior que a memória, a análise poderá ser feita em pedaços (carregar os dados do banco de dados 1000 observações por vez, agrupar adequadamente os resultados no final).
jthetzel
1
Certifique-se de revisar as questões de big data no SO, bem como a visão de tarefas de computação de alto desempenho no CRAN para discussões adicionais, se você ainda não o tiver.
jthetzel

Respostas:

3

se você estiver no máximo com 500.000 registros x 2.000 variáveis, eu gastaria um pouco mais de dinheiro em RAM para o seu laptop e pronto. se você tiver 16 GB, provavelmente poderá ler diretamente o conjunto de dados que está descrevendo no R. e nesse ponto, você poderá fazer muito mais - e muito rapidamente .. mas você diz que não é uma opção, então:

observe os pacotes baseados em SQL para R., que permitem conectar-se a bancos de dados externos e acessar essas tabelas via SQL. Como o SQL é bastante universal (e o R é de código aberto), seu código não será perdido se você mudar de emprego ou perder o acesso ao SAS. o banco de dados externo mais fácil de configurar é, RSQLitemas de longe o mais rápido MonetDB.R( testes de velocidade )

provavelmente existem algumas boas soluções para o seu problema declarado, meu palpite é que praticamente todas elas envolvem R;)

Anthony Damico
fonte
2

Talvez não seja tanto sobre os aplicativos / problemas que você está buscando, e suas características, mas mais sobre os algoritmos e variantes que você está usando. Mais concretamente, para lidar com big data, muitas variantes baseadas na descida estocástica de gradientes de algoritmos populares, como o SVM, surgiram e são capazes de lidar com isso.

O Scikit oferece suporte para alguns desses algoritmos (SVM, kNN, kmeans, ...). Eu acho que esse bom gráfico pode ajudá-lo a descobrir rapidamente, se o scikit faz sentido para você.

espero que ajude

NOTA: O que se segue é uma resposta ao comentário de zelazny7

Agora eu entendi você. O que você está procurando é pandas . Dê uma olhada na seção de palestras. Há uma apresentação comparando o fluxo de trabalho do Panda e o do Panda brevemente. O Panda permite importar dados em diferentes formatos e manipular arquivos bgu através da integração de tabelas HDF5 . Além disso, você pode interagir com o Scikit.

jpmuc
fonte
Obrigado! Os algoritmos definitivamente teriam que funcionar on-lineou em partes dos dados lidos na memória e gravados de volta no disco. O Scikit é ótimo e é realmente isso que eu gostaria de usar, mas que ferramentas / fluxos de trabalho / abordagens existem para as etapas muito necessárias de exploração, munging e preparação de dados antes de aplicar esses algos? Esses idiomas podem lidar com essas etapas, mas estou realmente procurando um exemplo real de alguém que precise lidar com esses problemas de memória.
Zelazny7
Eu editei a minha resposta com o que você está procurando (ou então eu acredito!)
jpmuc
2

Você já parece confortável com o SAS e seus conjuntos de dados são pequenos o suficiente para caber na RAM, mas talvez você não possa caber RAM suficiente no laptop. Se você não se importa em continuar com o SAS, que tal se conectar ao SAS executando remotamente em um computador com muita RAM? Não tenho ideia de como isso funciona, mas esses links podem ajudar você a começar.

Há outras ótimas razões para usar o Pandas ou o R, mas acho que você não precisa se preocupar com os limites de memória. Se você não conseguir acomodar memória suficiente no seu laptop, execute a instância Python ou R em outro lugar e conecte-se ao SSH, iPython Notebook ou RStudio.

Thomas Levine
fonte
1

O Graphchi é excelente e pode lidar com grandes conjuntos de dados. É um pouco trabalhoso trabalhar, mas ele pode lidar com dados gráficos e não gráficos.

Zach
fonte
1

Encontrei recentemente SFrames e GraphLab Create. Essas são as bibliotecas para Python que oferecem o tipo de funcionalidade que você procura No site Pypi: "SFrame é um dataframe escalonável e fora do núcleo, que permite trabalhar com conjuntos de dados maiores que a quantidade de RAM no seu sistema ". Então pense nisso como a funcionalidade de manipulação de dados e a API no Pandas, mas sem colocar todos os dados na memória primeiro. SFrame é gratuito e de código aberto, tanto quanto eu sei. Por outro lado, o GraphLab se baseia na funcionalidade SFrame para fornecer algoritmos para realizar análises descritivas e preditivas (aprendizado de máquina) sobre dados armazenados em SFrames. A criação do GraphLab Create não é de código aberto / gratuito, mas possui uma licença demo gratuita. De qualquer forma, dependendo da sofisticação de seus algoritmos, o SFrame pode ser suficiente para você.

Mateo
fonte
-1

Você já considerou uma linguagem "real" e não interpretada como o Fortran?

Parece que as sugestões até agora são muito dependentes do fornecedor ou interpretadas. Métodos interpretados são notoriamente ruins em aplicativos intensos de memória. O MatLab pode ter um nível de linguagem muito mais alto que o "C", mas as otimizações de manipulação de memória em C podem fazer com que ele lide com centenas de vezes mais rápidos conjuntos de dados milhões de vezes maiores.

Tanto o "R" quanto o "Python" são linguagens maravilhosas, de alto nível, tecnicamente ricas e altamente usadas. Eles também são interpretados.

Você pode considerar uma das instâncias do R-on-Hadoop. (Rhipe, outros) Isso tem a vantagem de poder converter R (alto nível, fácil de programar) em instruções MapReduce / Hadoop. O Hadoop pode criar um cluster de multiprocessamento interessante para os pobres.

http://www.datadr.org/ <- (link de Rhipe)

O Fortran vem sendo desenvolvido há décadas. Possui manipulação e compilação de memória muito eficientes. Ele também possui algumas bibliotecas de nível superior, para que possa executar operações muito sofisticadas tecnicamente com bastante simplicidade. Eu poderia fazer um CFD de brinquedo no MatLab, mas, para algo realista e auto-codificado, eu usaria o Fortran para o processamento "big-iron" e algo como MatLab ou R para apresentar / resumir dados. Ninguém cria software comercial de CFD cujo "mecanismo" é interpretado em vez de compilado. Vários fornecedores têm seu CFD de fabricante de dinheiro codificado em C ou Fortran. O SAS foi originalmente escrito em C ( link ).

Fortran e Rhipe são acessíveis. O MatLab custa dinheiro e, se meu trabalho não pagasse, eu estaria usando R ou Python agora.

UPDATE:
Meu argumento foi "compilado". O Python possui o cython que pode literalmente executar o mesmo código (fundamental) ~ 1000x mais rápido. Isso significa que você pode ter dados aproximadamente 1000x maiores e processá-los quase ao mesmo tempo. Conseguir um funcionamento limpo do Cython pode ser um desafio, mas ferramentas como o " Sage " o envolvem bem. Rcpp supostamente tem similar, mas eu pessoalmente não sei se é tão desenvolvido.

Se você pensar bem, os fundamentos de quase tudo o que você executa na computação científica, mesmo em linguagens interpretadas, é Fortran compilado ou C. compilado C. BLAS é BLAS; você não está reinventando o código toda vez que faz EDA . Sua linguagem interpretada está chamando essas bibliotecas, embora muito ineficientemente, quando é executada.

Como um aparte, você pode olhar para o JMP . Possui interface muito fácil de usar e é excelente para análise exploratória de dados ( EDA ) muito visual .

EngrStudent
fonte
2
Como você explora dados com uma linguagem compilada como o fortran? O apelo das linguagens interpretadas, para mim, é o REPL, que fornece introspecção rica e permite que eu aprenda rapidamente com o que estou lidando, além de brincar com as novas funções da biblioteca que talvez eu não conheça.
precisa saber é o seguinte
1
O Rcpp é muito bem desenvolvido (basta verificar o uso reverso no CRAN), mas não é realmente comparável ao cython. Se você tem alguma função definida, sim, você pode pegar a entrada R, processá-la em Cpp e retornar os dados para R. Mas você não estará compilando um script R inteiro em Cpp tão cedo.
19417 russellpierce