2012-07-29 14 views
12

Jak używać nauki scikit do uczenia modelu na dużych danych CSV (~ 75MB) bez problemów z pamięcią?Scikit i pandy: dopasowywanie dużych danych

Używam notebooka IPython jako środowiska programistycznego, a pandy + pakiety sklearn do analizowania danych z samouczka kaggle's digital reader.

Dane są dostępne na webpage, odwołują się do my code, a tu jest error message:

KNeighborsClassifier służy do przewidywania.

Problem:

"MemoryError" występuje podczas ładowania dużego zestawu danych przy użyciu read_csv funkcję. Aby tymczasowo ominąć ten problem, muszę zrestartować jądro , które następnie funkcja read_csv pomyślnie wczytuje plik, ale ten sam błąd występuje, gdy ponownie uruchomię tę samą komórkę.

Gdy funkcja read_csv ładuje plik z powodzeniem, po wprowadzeniu zmian do dataframe mogę przekazać cechy i etykiet, aby pasowały do ​​KNeighborsClassifier za function(). W tym momencie występuje podobny błąd pamięci.

Próbowałem następujące:

iterację pliku CSV w kawałkach, i dopasować odpowiednio dane, ale problemem jest to, że model prognostyczny jest nadpisywany za każdym razem na fragmencie danych.

Co myślisz, że mogę zrobić, aby z powodzeniem ćwiczyć mój model bez problemów z pamięcią?

+0

Twój kod + dane działa dobrze na moim laptopie. Wymaga około 1,2 GB pamięci. Ile pamięci ma twój system? – Sicco

+1

Gotowy do pracy za pomocą loadtxt. Nawet bez pojawienia się błędu pamięci, przetwarzanie tylko ~ 75mb danych na algorytmie zajmuje ponad 1GB pamięci RAM ... Nie jestem pewien, czy robię coś złego w moim kodzie. (http://pastie.org/4354911) (notatnik ipython). Jeśli to tylko algorytm, który zajmuje tak dużo czasu, w jaki sposób ładujesz gigabajty danych na algorytmie bez konieczności tworzenia takiego modelu? –

+4

Można użyć algorytmu, który można wyszkolić przyrostowo, przetwarzając w ten sposób tylko (małe) części danych naraz. Estymator w nauce scikit może to zrobić, jeśli implementuje metodę 'partial_fit'. – Sicco

Odpowiedz

10

Uwaga: podczas ładowania danych z pand stworzy DataFrame obiektu, gdzie każda kolumna ma jednorodną typ danych dla wszystkich wierszy, ale 2 kolumny może mieć różne typy danych (na przykład liczby całkowite, daktyle, łańcuchy).

Po przejściu instancji DataFrame do modelu naukowego scikit najpierw przydzieli jednorodną tablicę 2D numpy z typem np.float32 lub np.float64 (w zależności od implementacji modeli). W tym momencie będziesz mieć 2 kopie zbioru danych w pamięci.

Aby tego uniknąć, można napisać/ponownie użyć parser CSV, który bezpośrednio przydziela dane w wewnętrznym formacie/typ oczekiwanym przez model uczenia się scikit. Możesz spróbować na przykład numpy.loadtxt (spójrz na docstring parametrów).

Także, jeśli dane są bardzo rzadkie (wiele zerowych wartości), lepiej będzie użyć struktury danych scipy.sparse i modelu naukowego scikit, który będzie w stanie poradzić sobie z takim formatem wejściowym (sprawdź dokumentację, aby wiedzieć). Jednak sam format CSV nie jest zbyt dobrze dopasowany do rzadkich danych i nie jestem pewien, czy istnieje bezpośredni parser CSV-to-scipy.sparse.

Edit: odsyłające KNearestNeighborsClassifer przydzielić tymczasową odstępów tablicę z kształtu (n_samples_predict, n_samples_train) który jest bardzo rozrzutny, gdy potrzebna jest tylko (n_samples_predict, n_neighbors) zamiast.Ten problem można śledzić tutaj:

https://github.com/scikit-learn/scikit-learn/issues/325

+0

loadtxt działa doskonale! –

+0

Model scikit-learn nie powoduje żadnego wyjątku pamięci. Jedynym problemem jest teraz ... ponieważ dane są tak duże, algorytm zajmuje bardzo dużo czasu, aby stworzyć model. Szkoda, że ​​nie było sposobu, aby zrobić to znacznie szybciej ... –

+2

Powinieneś spróbować użyć 'KNeighborsClassifier' w trybie bruteforce (zamiast balltree), ale wtedy czasy przewidywania mogą być zbyt wolne. Alternatywnie możesz użyć prostych modeli, takich jak 'sklearn.linear_model.Perceptron',' sklearn.naive_bayes.MultinomialNB' lub 'sklearn.neighbors.NearestCentroidClassifier'. Wreszcie możesz także spróbować wyszkolić model na małej podściółce danych, aby uzyskać pierwszy szybki pomysł dokładności predykcyjnej, a następnie podwoić rozmiar zestawu danych i powtórzyć. – ogrisel

Powiązane problemy