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 № 1Zagryźć:
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.