Eu tenho um grande conjunto de dados (cerca de 8 GB). Eu gostaria de usar o aprendizado de máquina para analisá-lo. Então, acho que devo usar SVD e PCA para reduzir a dimensionalidade dos dados para obter eficiência. No entanto, MATLAB e Octave não podem carregar um conjunto de dados tão grande.
Quais ferramentas eu posso usar para fazer SVD com uma quantidade tão grande de dados?
bigdata
data-mining
dimensionality-reduction
David S.
fonte
fonte
Respostas:
Em primeiro lugar, a redução de dimensionalidade é usada quando você tem muitas dimensões covariadas e deseja reduzir o tamanho do problema girando os pontos de dados em uma nova base ortogonal e utilizando apenas eixos com maior variação. Com 8 variáveis (colunas), seu espaço já é de baixa dimensão; é improvável que reduzir ainda mais o número de variáveis resolva problemas técnicos com o tamanho da memória, mas pode afetar muito a qualidade do conjunto de dados. No seu caso concreto, é mais promissor dar uma olhada no aprendizado on - linemétodos. Grosso modo, em vez de trabalhar com todo o conjunto de dados, esses métodos usam uma pequena parte deles (geralmente chamados de "mini-lotes") de cada vez e constroem um modelo de forma incremental. (Eu pessoalmente gosto de interpretar a palavra "online" como uma referência a uma fonte infinitamente longa de dados da Internet, como um feed do Twitter, onde você simplesmente não pode carregar todo o conjunto de dados de uma só vez).
Mas e se você realmente quisesse aplicar a técnica de redução de dimensionalidade, como o PCA, em um conjunto de dados que não se encaixa na memória? Normalmente, um conjunto de dados é representado como uma matriz de dados X de tamanho n x m , em que n é o número de observações (linhas) e m é um número de variáveis (colunas). Normalmente, os problemas de memória vêm de apenas um desses dois números.
Muitas observações (n >> m)
Quando você tem muitas observações , mas o número de variáveis é pequeno a moderado, é possível construir a matriz de covariância incrementalmente . De fato, o PCA típico consiste em construir uma matriz de covariância de tamanho m x m e aplicar decomposição de valor singular a ela. Com m = 1000 variáveis do tipo float64, uma matriz de covariância tem tamanho 1000 * 1000 * 8 ~ 8Mb, que cabe facilmente na memória e pode ser usada com SVD. Portanto, você só precisa criar a matriz de covariância sem carregar um conjunto de dados inteiro na memória - tarefa bastante tratável .
Como alternativa, você pode selecionar uma pequena amostra representativa do seu conjunto de dados e aproximar a matriz de covariância . Essa matriz terá todas as mesmas propriedades que o normal, apenas um pouco menos precisa.
Variáveis demais (n << m)
Por outro lado, às vezes, quando você tem muitas variáveis , a própria matriz de covariância não se encaixa na memória. Por exemplo, se você trabalha com imagens de 640x480, todas as observações têm 640 * 480 = 307200 variáveis, o que resulta em uma matriz de covariância de 703Gb! Definitivamente, não é isso que você gostaria de manter na memória do seu computador ou mesmo na memória do seu cluster. Portanto, precisamos reduzir as dimensões sem criar uma matriz de covariância.
Meu método favorito para fazer isso é a projeção aleatória . Em resumo, se você tiver um conjunto de dados X de tamanho n x m , poderá multiplicá-lo por uma matriz aleatória esparsa R de tamanho m x k (com k << m ) e obter uma nova matriz X ' de tamanho muito menor n x k com aproximadamente as mesmas propriedades que a original. Por que isso funciona? Bem, você deve saber que o PCA visa encontrar um conjunto de eixos ortogonais (componentes principais) e projetar seus dados nos primeiros kdeles. Acontece que vetores aleatórios esparsos são quase ortogonais e, portanto, também podem ser usados como uma nova base.
E, é claro, você não precisa multiplicar todo o conjunto de dados X por R - você pode converter todas as observações x na nova base separadamente ou em mini-lotes.
Também existe um algoritmo similar chamado Random SVD . Não tenho nenhuma experiência real com ele, mas você pode encontrar um exemplo de código com explicações aqui .
Como resultado, aqui está uma pequena lista de verificação para redução da dimensionalidade de grandes conjuntos de dados:
fonte
Não se incomode.
Primeira regra de programação - que também se aplica à ciência de dados: faça tudo funcionar em um pequeno problema de teste.
então, pegue uma amostra aleatória de seus dados, digamos 100.000 linhas. experimente algoritmos diferentes etc. Depois de ter conseguido tudo funcionar de maneira satisfatória, experimente conjuntos de dados maiores (e maiores) - e veja como o erro de teste diminui à medida que você adiciona mais dados.
além disso, você não deseja aplicar svd a apenas 8 colunas: aplica-o quando tiver muitas colunas.
fonte
O PCA é geralmente implementado computando SVD na matriz de covariância.
O cálculo da matriz de covariância é uma tarefa paralelamente embaraçosa , por isso é linear com o número de registros e é trivial para distribuir em várias máquinas!
Basta fazer uma passagem sobre seus dados para calcular os meios. Em seguida, uma segunda passagem para calcular a matriz de covariância. Isso pode ser feito com redução de mapa facilmente - essencialmente é o mesmo que computar os meios novamente. Termos de soma como covariância são triviais para paralelizar! Você pode precisar prestar atenção apenas aos valores numéricos ao somar muitos valores de magnitude semelhante.
As coisas ficam diferentes quando você tem um grande número de variáveis . Mas em um sistema de 8 GB, você deve poder executar o PCA em até 20.000 dimensões na memória com as bibliotecas BLAS. Mas você pode ter o problema de que o PCA não é mais tão confiável, porque ele tem muitos graus de liberdade. Em outras palavras: adapta-se facilmente. Vi a recomendação de ter pelo menos 10 * d * d registros (ou foi d ^ 3). Portanto, para 10000 dimensões, você deve ter pelo menos um bilhão de registros (de 10000 dimensões ... isso é muito!) Para que o resultado seja estatisticamente confiável.
fonte
Embora você possa provavelmente encontrar algumas ferramentas que permitirão fazê-lo em uma única máquina, você está entrando no intervalo em que faz sentido considerar ferramentas de "big data" como o Spark, especialmente se você acha que seu conjunto de dados pode aumentar. O Spark possui um componente chamado MLlib que suporta PCA e SVD. A documentação tem exemplos .
fonte
Implementamos o SVD em um conjunto de dados maior usando o PySpark. Também comparamos a consistência entre diferentes pacotes. Aqui está o link.
fonte
Eu recomendaria o python se você preguiçosamente avaliar o arquivo, terá uma minúscula área de memória e o numpy / scipy lhe dará acesso a todas as ferramentas que o Octave / Matlab faria.
fonte