/ / Zużycie pamięci ręcznej dopasowania drzewa w sklearn - pamięć, nauka o scikit, losowy las

Ręczne dopasowanie pamięci do drzewa w sklearn - pamięć, nauka scikit, losowy las

Używam sklearnów RandomForestClassifier dla problemu klasyfikacji. Chciałbym trenować drzewa lasu indywidualnie, ponieważ chwytam podzbiory (BARDZO) dużego zestawu dla każdego drzewa. Jednak, gdy dopasuję drzewa ręcznie, zużycie pamięci wzrośnie.

Oto profil pamięci liniowej za pomocą memory_profiler dopasowania niestandardowego vs użycie RandomForestClassifier"s fit funkcjonować. O ile mogę powiedzieć, funkcja dopasowania źródła wykonuje te same kroki, co dopasowanie niestandardowe. Więc co daje dodatkową pamięć?

normalne dopasowanie:

Line #    Mem usage    Increment   Line Contents
================================================
17   28.004 MiB    0.000 MiB   @profile
18                             def normal_fit():
19   28.777 MiB    0.773 MiB    X = random.random((1000,100))
20   28.781 MiB    0.004 MiB    Y = random.random(1000) < 0.5
21   28.785 MiB    0.004 MiB    rfc = RFC(n_estimators=100,n_jobs=1)
22   28.785 MiB    0.000 MiB    rfc.n_classes_ = 2
23   28.785 MiB    0.000 MiB    rfc.classes_ = array([False, True],dtype=bool)
24   28.785 MiB    0.000 MiB    rfc.n_outputs_ = 1
25   28.785 MiB    0.000 MiB    rfc.n_features_ = 100
26   28.785 MiB    0.000 MiB    rfc.bootstrap = False
27   37.668 MiB    8.883 MiB    rfc.fit(X,Y)

dopasowany:

Line #    Mem usage    Increment   Line Contents
================================================
4   28.004 MiB    0.000 MiB   @profile
5                             def custom_fit():
6   28.777 MiB    0.773 MiB    X = random.random((1000,100))
7   28.781 MiB    0.004 MiB    Y = random.random(1000) < 0.5
8   28.785 MiB    0.004 MiB    rfc = RFC(n_estimators=100,n_jobs=1)
9   28.785 MiB    0.000 MiB    rfc.n_classes_ = 2
10   28.785 MiB    0.000 MiB    rfc.classes_ = array([False, True],dtype=bool)
11   28.785 MiB    0.000 MiB    rfc.n_outputs_ = 1
12   28.785 MiB    0.000 MiB    rfc.n_features_ = 100
13   73.266 MiB   44.480 MiB    for i in range(rfc.n_estimators):
14   72.820 MiB   -0.445 MiB        rfc._make_estimator()
15   73.262 MiB    0.441 MiB        rfc.estimators_[-1].fit(X,Y,check_input=False)

Odpowiedzi:

0 dla odpowiedzi № 1

Zagryźć:

Zamiast tego tworzę skrypt Pythona do budowaniapojedyncze drzewo i zrzucanie go przez zalewę. Następnie przyklejam wszystko razem za pomocą skryptów powłoki i ostatniego skryptu Pythona, aby utworzyć i zrzucić model RF. W ten sposób pamięć jest zwracana po każdym utworzeniu drzewa, ponieważ każde ma swój własny wątek wykonania.

The sklearn implementacja obejmie problem z pamięcią w sposób, który moim zdaniem ma związek z problemem _parallel_build_tree metoda, ponieważ niestandardowa implementacja różni się tylko pod tym względem. Publikuję moje obejście jako odpowiedź, ale jeśli w przyszłości ktoś mógłby oświecić mnie na temat poprzedniego, doceniam to.