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?
Réponses:
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:
la source
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.
la source
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.
la source
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 .
la source
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.
la source
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.
la source