Ho appena provato ad utilizzare l'IncrementalPCA da sklearn.decomposition, ma ha gettato un MemoryError proprio come il PCA e il RandomizedPCA in precedenza. Il mio problema è che la matrice che sto cercando di caricare è troppo grande per adattarsi alla RAM. In questo momento è memorizzato in un database hdf5 come set di dati di forma ~ (1000000, 1000), quindi ho 1.000.000.000 di valori float32. Ho pensato che IncrementalPCA carichi i dati in batch, ma a quanto pare tenta di caricare l'intero set di dati, il che non aiuta. Come si intende utilizzare questa libreria? Il formato hdf5 è il problema?PCA incrementale su big data
from sklearn.decomposition import IncrementalPCA
import h5py
db = h5py.File("db.h5","r")
data = db["data"]
IncrementalPCA(n_components=10, batch_size=1).fit(data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/sklearn/decomposition/incremental_pca.py", line 165, in fit
X = check_array(X, dtype=np.float)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/sklearn/utils/validation.py", line 337, in check_array
array = np.atleast_2d(array)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/numpy/core/shape_base.py", line 99, in atleast_2d
ary = asanyarray(ary)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/numpy/core/numeric.py", line 514, in asanyarray
return array(a, dtype, copy=False, order=order, subok=True)
File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (-------src-dir-------/h5py/_objects.c:2458)
File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (-------src-dir-------/h5py/_objects.c:2415)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 640, in __array__
arr = numpy.empty(self.shape, dtype=self.dtype if dtype is None else dtype)
MemoryError
Grazie per l'aiuto
Ok, quindi in sostanza non dovrei chiamare in forma ma partial_fit più volte. Non ho visto quel metodo, perché il tutorial usa in forma. Sai perché fit ha il parametro batch_size per, se carica l'intero set di dati in una volta? – KrawallKurt
Il trucco di non caricare tutti i dati in memoria è probabilmente curato dalla libreria h5py. Il suo oggetto dataset ('h5 ['data']') sembra comportarsi come un normale array numpy, ma non lo è. 'IncrementalPCA' non sa che si tratta di una struttura dati su disco e ad un certo punto legge tutte le righe (' MemoryError'!). Il calcolo è ancora eseguito in batch 'batch_size'. – sastanin
Questo succede in 'fit()' che [chiama check_array()] (https://github.com/scikit-learn/scikit-learn/blob/0.16.1/sklearn/decomposition/incremental_pca.py#L165) che si suppone per convertire i dati di una serie regolare NumPy (https://github.com/scikit-learn/scikit-learn/blob/0.16.1/sklearn/utils/validation.py#L268) chiamata 'partial_fit() 'ignora questa conversione. – sastanin