Mam csv, który jest 100 000 wierszy x 27 000 kolumn, które próbuję wykonać PCA, aby wytworzyć macierz kolumn X 100 000 wierszy. Plik CSV ma rozmiar 9 GB. Oto co obecnie robię:Python PCA na macierzy zbyt dużej, aby zmieścić się w pamięci
from sklearn.decomposition import PCA as RandomizedPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
X = pd.DataFrame.from_csv(dataset)
Y = X.pop("Y_Level")
X = (X - X.mean())/(X.max() - X.min())
Y = list(Y)
dimensions = 300
sklearn_pca = RandomizedPCA(n_components=dimensions)
X_final = sklearn_pca.fit_transform(X)
Kiedy uruchomić powyższy kod, mój program jest zabity podczas wykonywania .from_csv w kroku. Udało mi się to obejść, dzieląc csv na zestawy 10 000; czytanie ich w 1 na 1, a następnie wywoływanie pd.concat. To pozwala mi przejść do etapu normalizacji (X - X.mean()) .... zanim zostanie zabity. Czy moje dane są zbyt duże dla mojego macbook air? Czy istnieje lepszy sposób to zrobić. Bardzo chciałbym wykorzystać wszystkie dane, które mam dla mojej aplikacji do nauki maszyn.
Gdybym chciał użyć przyrostową PCA zgodnie z sugestią poniżej odpowiedź, jest to w jaki sposób to zrobić ?:
from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd
dataset = sys.argv[1]
chunksize_ = 10000
#total_size is 100000
dimensions = 300
reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_)
sklearn_pca = IncrementalPCA(n_components=dimensions)
Y = []
for chunk in reader:
y = chunk.pop("virginica")
Y = Y + list(y)
sklearn_pca.partial_fit(chunk)
X = ???
#This is were i'm stuck, how do i take my final pca and output it to X,
#the normal transform method takes in an X, which I don't have because I
#couldn't fit it into memory.
nie mogę znaleźć żadnych dobrych przykładów w Internecie.
można użyć rzadki reprezentacji macierzowej do zmniejszenia surowego pamięci dane foot print? – cwharland