2015-08-24 20 views
5

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.

+0

można użyć rzadki reprezentacji macierzowej do zmniejszenia surowego pamięci dane foot print? – cwharland

Odpowiedz

9

Spróbuj podzielić swoje dane lub załaduj je partiami do skryptu i dopasuj swoją PCA za pomocą Incremetal PCA za pomocą metody partial_fit dla każdej partii.

from sklearn.decomposition import IncrementalPCA 
import csv 
import sys 
import numpy as np 
import pandas as pd 

dataset = sys.argv[1] 
chunksize_ = 5 * 25000 
dimensions = 300 

reader = pd.read_csv(dataset, sep = ',', chunksize = chunksize_) 
sklearn_pca = IncrementalPCA(n_components=dimensions) 
for chunk in reader: 
    y = chunk.pop("Y") 
    sklearn_pca.partial_fit(chunk) 

# Computed mean per feature 
mean = sklearn_pca.mean_ 
# and stddev 
stddev = np.sqrt(sklearn_pca.var_) 

Xtransformed = None 
for chunk in pd.read_csv(dataset, sep = ',', chunksize = chunksize_): 
    y = chunk.pop("Y") 
    Xchunk = sklearn_pca.transform(chunk) 
    if Xtransformed == None: 
     Xtransformed = Xchunk 
    else: 
     Xtransformed = np.vstack((Xtransformed, Xchunk)) 

Useful link

+0

dzięki za odpowiedź! Czy masz na uwadze szybkie spojrzenie na moją implementację powyżej? Nie mogę znaleźć dobrych przykładów w Internecie; ten link, który wysłałeś, ładował całe dane do pamięci. – mt88

+0

Dzięki za pomoc. Czy muszę wywołać transformację lub jakąś inną funkcję po zakończeniu pętli? Ostatecznie potrzebuję dwuwymiarowej macierzy pływaków o wymiarach 100 000 x 300 000. Czy po prostu wywołanie fit daje mi to, czy muszę w jakiś sposób wywołać transformację? Zanim musiałem użyć fit_trasnformed, gdy moje dane były małe. – mt88

+0

Mój skrypt właśnie się zakończył i nie wygląda na to, że zwracana jest macierz X. – mt88

0

PCA musi obliczyć macierz korelacji, która wynosiłaby 100 000 x 100 000. Jeśli dane są przechowywane w postaci podwójnej, to jest to 80 GB. Byłbym skłonny założyć się, że twój Macbook nie ma 80 GB pamięci RAM.

Matryca transformacji PCA prawdopodobnie będzie prawie taka sama dla przypadkowego podzbioru o rozsądnych rozmiarach.

+0

Dzięki za odpowiedź! Czy istnieje sposób na poinformowanie RandomizedPCA, aby używał podzbioru danych zamiast wszystkich X? Czy istnieje sposób na określenie, jaki rozsądny byłby rozmiar? Czy 10.000 rzędów jest wystarczająco dobre? – mt88

+1

27k * 27k, ma tylko 27k funkcji, macierz korelacji oznacza funkcję korelacji cech. –