Como fazer SVD e PCA com big data?

29

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?

David S.
fonte
Olá, e bem-vindo ao DS! Talvez você possa elaborar um pouco sobre o seu conjunto de dados. Quantas linhas e colunas você possui? Isso pode ter impacto em possíveis soluções.
S. Kolassa - Restabelece Monica
23711341 linhas e 8 colunas. Eu poderia tentar remover 1-2 colunas. Eles não parecem relacionados ao meu problema.
David S.
Você deve amostrar linhas antes das colunas aqui. Existe uma razão para você não poder amostrar linhas aleatoriamente para reduzir o tamanho dos dados? Estou assumindo linhas aqui estão relacionados a usuários ou algo
cwharland
Desculpe se não me esclareci. Meu objetivo é fazer o PCA. Acho que SVD em dados de amostra não pode me ajudar a fazer PCA, certo?
David S.
O PCA é geralmente implementado computando SVD na matriz de covariância. O cálculo da matriz de covariância é uma tarefa embaraçosamente paralela, portanto deve ser dimensionada facilmente com o número de registros.
Anony-Mousse

Respostas:

41

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:

  1. Se você não possui muitas dimensões (variáveis), basta usar algoritmos de aprendizado online.
  2. Se houver muitas observações, mas um número moderado de variáveis ​​(a matriz de covariância se encaixa na memória), construa a matriz de forma incremental e use SVD normal.
  3. Se o número de variáveis ​​for muito alto, use algoritmos incrementais.
amiga
fonte
3
No geral, gosto da sua resposta, mas a frase de abertura não está correta. O PCA não é adequado para muitas dimensões com baixa variação; em vez disso, é adequado para muitas dimensões com variação correlacionada . Para um determinado conjunto de dados, a variação pode ser alta em todas as dimensões, mas enquanto houver alta covariância, o PCA ainda poderá gerar uma redução significativa da dimensionalidade.
bogatron
1
@ Bogatron: boa captura, obrigado. Na verdade, eu estava me referindo à variação alta / baixa em algumas dimensões, possivelmente não originais. Por exemplo, nesta figura, essas dimensões são definidas por 2 setas, não pelos eixos x / y originais. O PCA procura encontrar esses novos eixos e os classifica pelo valor da variação ao longo de cada eixo. De qualquer forma, como você apontou, era uma redação ruim, então tentei reformular minha ideia. Felizmente, agora está mais claro.
ffriend 26/09
Isso faz sentido para mim. +1.
bogatron
7

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.

seanv507
fonte
1
+1 para você não deseja aplicar svd a apenas 8 colunas: você aplica quando possui muitas colunas.
S. Kolassa - Restabelece Monica
6

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.

Anony-Mousse
fonte
1

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 .

Emre
fonte
1

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.

sergulaydore
fonte
0

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.

ragingSloth
fonte