Comment faire SVD et PCA avec des mégadonnées?


29

J'ai un grand ensemble de données (environ 8 Go). J'aimerais utiliser l'apprentissage automatique pour l'analyser. Donc, je pense que je devrais utiliser SVD puis PCA pour réduire la dimensionnalité des données pour plus d'efficacité. Cependant, MATLAB et Octave ne peuvent pas charger un ensemble de données aussi volumineux.

Quels outils puis-je utiliser pour faire SVD avec une telle quantité de données?


Bonjour et bienvenue sur DS! Peut-être pourriez-vous élaborer un peu sur votre jeu de données. Combien de lignes et de colonnes avez-vous? Cela pourrait avoir un impact sur les solutions possibles.
S.Kolassa - Rétablir Monica du

23711341 lignes et 8 colonnes. Je pourrais essayer de supprimer 1-2 colonnes. Ils ne semblent pas liés à mon problème.
David S.

Vous devez échantillonner les lignes avant les colonnes ici. Y a-t-il une raison pour laquelle vous ne pouvez pas échantillonner des lignes au hasard pour réduire la taille des données? Je suppose que les lignes ici sont liées aux utilisateurs ou à quelque chose
cwharland

Désolé si je n'ai pas été clair. Mon objectif est de faire du PCA. Je pense que SVD sur des exemples de données ne peut pas m'aider à faire PCA, non?
David S.

PCA est généralement implémenté en calculant SVD sur la matrice de covariance. Le calcul de la matrice de covariance est une tâche parallèle embarrassante, elle devrait donc s'adapter facilement au nombre d'enregistrements.
Anony-Mousse

Réponses:


41

Tout d'abord, la réduction de dimensionnalité est utilisée lorsque vous avez de nombreuses dimensions covariables et que vous souhaitez réduire la taille du problème en faisant pivoter les points de données dans une nouvelle base orthogonale et en prenant uniquement des axes avec la plus grande variance. Avec 8 variables (colonnes), votre espace est déjà de faible dimension, une réduction supplémentaire du nombre de variables ne résoudra probablement pas les problèmes techniques liés à la taille de la mémoire, mais peut affecter considérablement la qualité de l'ensemble de données. Dans votre cas concret, il est plus prometteur de jeter un œil à l' apprentissage en ligneméthodes. En gros, au lieu de travailler avec l'ensemble de données, ces méthodes en prennent une petite partie (souvent appelées "mini-lots") à la fois et construisent un modèle de manière incrémentielle. (Personnellement, j'aime interpréter le mot "en ligne" comme une référence à une source de données infiniment longue provenant d'Internet comme un flux Twitter, où vous ne pouvez tout simplement pas charger l'ensemble de données en même temps).

Mais que se passe-t-il si vous vouliez vraiment appliquer une technique de réduction de dimensionnalité comme l'ACP à un ensemble de données qui ne tient pas dans une mémoire? Normalement, un ensemble de données est représenté comme une matrice de données X de taille n x m , où n est le nombre d'observations (lignes) et m est un nombre de variables (colonnes). En règle générale, les problèmes de mémoire proviennent d'un seul de ces deux nombres.

Trop d'observations (n ​​>> m)

Lorsque vous avez trop d'observations , mais que le nombre de variables va de petit à modéré, vous pouvez construire la matrice de covariance de manière incrémentielle . En effet, l'ACP typique consiste à construire une matrice de covariance de taille m x m et à lui appliquer une décomposition en valeurs singulières. Avec m = 1000 variables de type float64, une matrice de covariance a une taille de 1000 * 1000 * 8 ~ 8Mb, qui tient facilement en mémoire et peut être utilisée avec SVD. Il vous suffit donc de créer la matrice de covariance sans charger l'intégralité de l'ensemble de données en mémoire - une tâche assez facile à gérer .

Alternativement, vous pouvez sélectionner un petit échantillon représentatif de votre ensemble de données et approximer la matrice de covariance . Cette matrice aura toutes les mêmes propriétés que la normale, juste un peu moins précises.

Trop de variables (n << m)

D'autre part, parfois, lorsque vous avez trop de variables , la matrice de covariance elle-même ne tient pas en mémoire. Par exemple, si vous travaillez avec des images 640x480, chaque observation a 640 * 480 = 307200 variables, ce qui donne une matrice de covariance de 703 Go! Ce n'est certainement pas ce que vous aimeriez garder en mémoire de votre ordinateur, ni même en mémoire de votre cluster. Nous devons donc réduire les dimensions sans construire une matrice de covariance.

Ma méthode préférée pour le faire est la projection aléatoire . En bref, si vous avez un ensemble de données X de taille n x m , vous pouvez le multiplier par une matrice aléatoire clairsemée R de taille m x k (avec k << m ) et obtenir une nouvelle matrice X ' d'une taille beaucoup plus petite n x k avec approximativement les mêmes propriétés que l'original. Pourquoi ça marche? Eh bien, vous devez savoir que PCA vise à trouver un ensemble d'axes orthogonaux (composants principaux) et à projeter vos données sur le premier kd'eux. Il s'avère que les vecteurs aléatoires clairsemés sont presque orthogonaux et peuvent donc également être utilisés comme une nouvelle base.

Et, bien sûr, vous n'avez pas à multiplier l'ensemble de données X par R - vous pouvez traduire chaque observation x dans la nouvelle base séparément ou en mini-lots.

Il existe également un algorithme quelque peu similaire appelé Random SVD . Je n'ai aucune expérience réelle avec cela, mais vous pouvez trouver un exemple de code avec des explications ici .


En conclusion, voici une courte liste de contrôle pour la réduction de la dimensionnalité des grands ensembles de données:

  1. Si vous n'avez pas autant de dimensions (variables), utilisez simplement des algorithmes d'apprentissage en ligne.
  2. S'il y a beaucoup d'observations, mais un nombre modéré de variables (la matrice de covariance tient dans la mémoire), construisez la matrice de manière incrémentielle et utilisez la SVD normale.
  3. Si le nombre de variables est trop élevé, utilisez des algorithmes incrémentiels.

3
Dans l'ensemble, j'aime votre réponse, mais la phrase d'ouverture n'est pas tout à fait juste. PCA n'est pas adapté à de nombreuses dimensions avec une faible variance; il convient plutôt à de nombreuses dimensions avec variance corrélée . Pour un ensemble de données donné, la variance peut être élevée dans toutes les dimensions, mais tant qu'il y a une covariance élevée, l'ACP peut encore entraîner une réduction significative de la dimensionnalité.
bogatron

1
@bogatron: bonne prise, merci. En fait, je parlais de variance élevée / faible dans certaines dimensions, peut-être pas d'origine. Par exemple, dans cette image, ces dimensions sont définies par 2 flèches, pas des axes x / y d'origine. L'ACP cherche à trouver ces nouveaux axes et les trie selon la valeur de la variance le long de chaque axe. Quoi qu'il en soit, comme vous l'avez souligné, c'était une mauvaise formulation, alors j'ai essayé de reformuler mon idée. Espérons que maintenant, c'est plus clair.
ffriend

Cela me semble logique. +1.
bogatron

7

Ne t'embête pas.

Première règle de programmation - qui s'applique également à la science des données: faire fonctionner tout sur un petit problème de test.

prenez donc un échantillon aléatoire de vos données, disons 100 000 lignes. essayez différents algorithmes, etc. une fois que tout fonctionne à votre satisfaction, vous pouvez essayer des ensembles de données plus grands (et plus grands) - et voir comment l'erreur de test diminue à mesure que vous ajoutez des données.

de plus, vous ne voulez pas appliquer svd à seulement 8 colonnes: vous l'appliquez lorsque vous avez beaucoup de colonnes.


1
+1 pour vous ne voulez pas appliquer svd à seulement 8 colonnes: vous l'appliquez lorsque vous avez beaucoup de colonnes.
S.Kolassa - Rétablir Monica le

6

PCA est généralement implémenté en calculant SVD sur la matrice de covariance.

Le calcul de la matrice de covariance est une tâche parallèle embarrassante , il évolue donc linéairement avec le nombre d'enregistrements et est banal à distribuer sur plusieurs machines!

Faites simplement un passage sur vos données pour calculer les moyens. Puis une deuxième passe pour calculer la matrice de covariance. Cela peut être fait avec map-Reduce facilement - c'est essentiellement la même chose que de calculer à nouveau les moyens. Les termes de somme comme dans la covariance sont triviaux à paralléliser! Vous n'aurez peut-être qu'à faire attention aux chiffres lorsque vous additionnez un grand nombre de valeurs de magnitude similaire.

Les choses deviennent différentes lorsque vous avez un grand nombre de variables . Mais sur un système de 8 Go, vous devriez pouvoir exécuter PCA sur jusqu'à 20 000 dimensions en mémoire avec les bibliothèques BLAS. Mais alors vous pouvez rencontrer le problème que PCA n'est plus fiable du tout, car il a trop de degrés de liberté. En d'autres termes: il s'adapte facilement. J'ai vu la recommandation d'avoir au moins 10 * d * d enregistrements (ou était-ce d ^ 3). Donc pour 10000 dimensions, vous devriez avoir au moins un milliard d'enregistrements (de 10000 dimensions ... c'est beaucoup!) Pour que le résultat soit statistiquement fiable.


1

Bien que vous puissiez probablement trouver des outils qui vous permettront de le faire sur une seule machine, vous entrez dans la gamme où il est logique d'envisager des outils de "big data" comme Spark, surtout si vous pensez que votre ensemble de données pourrait augmenter. Spark a un composant appelé MLlib qui prend en charge PCA et SVD. La documentation contient des exemples .


1

Nous avons implémenté SVD dans un ensemble de données plus grand en utilisant PySpark. Nous avons également comparé la cohérence entre différents packages. Voici le lien.


0

Je recommanderais python si vous évaluez paresseusement le fichier, vous aurez une empreinte mémoire minuscule, et numpy / scipy vous donnera accès à tous les outils qu'Octave / Matlab ferait.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.