MemoryError при подгонке дерева решений scikit-learn и классификаторов случайного леса

У меня есть pandas DataFrame с 86 тыс. строк, 5 функциями и 1 целевым столбцом. Я пытаюсь обучить DecisionTreeClassifier, используя 70% DataFrame в качестве данных для обучения, и получаю ошибку MemoryError из метода подгонки. Я пытался изменить некоторые параметры, но я действительно не знаю, что вызывает ошибку, поэтому я не знаю, как с ней справиться. У меня Windows 10 с 8 ГБ ОЗУ.

Код

train, test = train_test_split(data, test_size = 0.3)
X_train = train.iloc[:, 1:-1] # first column is not a feature
y_train = train.iloc[:, -1]
X_test = test.iloc[:, 1:-1]
y_test = test.iloc[:, -1]

DT = DecisionTreeClassifier()
DT.fit(X_train, y_train)
dt_predictions = DT.predict(X_test)

Ошибка

File (...), line 97, in <module>
DT.fit(X_train, y_train)
File "(...)\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\tree\tree.py", line 790, in fit
X_idx_sorted=X_idx_sorted)
File "(...)\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\tree\tree.py", line 362, in fit
builder.build(self.tree_, X, y, sample_weight, X_idx_sorted)
File "sklearn\trewe\_tree.pyx", line 145, in sklearn.tree._tree.DepthFirstTreeBuilder.build
File "sklearn\tree\_tree.pyx", line 244, in sklearn.tree._tree.DepthFirstTreeBuilder.build
File "sklearn\tree\_tree.pyx", line 735, in sklearn.tree._tree.Tree._add_node
File "sklearn\tree\_tree.pyx", line 707, in sklearn.tree._tree.Tree._resize_c
File "sklearn\tree\_utils.pyx", line 39, in sklearn.tree._utils.safe_realloc
MemoryError: could not allocate 671612928 bytes

Та же ошибка возникает, когда я пробую RandomForestClassifier, всегда в строке, которая выполняет подгонку. Как я могу это решить?


person julia    schedule 21.06.2018    source источник
comment
Просто чтобы удовлетворить мое любопытство, не могли бы вы попробовать y_train = train.iloc[:, -1:] (добавив двоеточие в конце), чтобы ваши значения Y были формой (n, 1), а не просто (n,). Я не думаю, что это вызывает проблему, но я знаю, что видел предупреждения sklearn об этом раньше   -  person scnerd    schedule 21.06.2018
comment
Если вы открываете диспетчер задач до/во время запуска этого кода, есть ли у вас несколько гигабайт свободной памяти, или другие процессы, возможно, потребляют все это?   -  person scnerd    schedule 21.06.2018
comment
Я сделал это как с y_train, так и с y_test, и это ничего не меняет, я получаю ту же ошибку:/   -  person julia    schedule 21.06.2018
comment
Перед запуском у меня доступно около 2,7 ГБ памяти, во время выполнения она уменьшается до минимума 2,3 ГБ, пока я не получу ошибку MemoryError.   -  person julia    schedule 21.06.2018
comment
2,7G может быть недостаточно. Одна только эта ошибка указывает на то, что один выделенный фрагмент памяти составляет ~ 670 МБ и является вызовом realloc, что означает, что он может пытаться увеличить размер существующего выделенного блока аналогичного размера... так что, возможно, 1-1,5 ГБ только для этого вещь, которую он выделяет. Ваши данные кажутся очень разумными по размеру, но этому дереву решений может просто потребоваться больше памяти. Попробуйте отключить некоторые процессы, занимающие много памяти, и/или перезагрузить компьютер, а затем повторить попытку. Chrome, например, может занимать огромное количество памяти, если у вас открыто много вкладок. Однако 8G должно быть достаточно для этой проблемы.   -  person scnerd    schedule 21.06.2018
comment
Я убил все процессы, которые мог, и доступных 3,7 ГБ все еще было недостаточно ... Тогда я попробую это на другом компьютере с большей оперативной памятью. Спасибо   -  person julia    schedule 21.06.2018
comment
У меня такая же проблема с TFIDFVectorizer. Я попытался изменить n_gram, как указано в других решениях, но не работает. Я думаю, что это ошибка с библиотекой. Они должны добавить код для эффективной обработки памяти. Я просто работаю над 1800 строками предложений и имею 12 ГБ ОЗУ.   -  person Morse    schedule 21.06.2018
comment
Можете ли вы показать результат X_train.dtype, X_train.shape, Y_train.shape и numpy.unique(Y_train) непосредственно перед выполнением .fit()? 86 тыс. строк и 5 функций — это ничто, поэтому это не должно занимать так много оперативной памяти.   -  person Jon Nordby    schedule 23.06.2018


Ответы (1)


Я столкнулся с той же проблемой. Убедитесь, что вы имеете дело с проблемой классификации, а не с проблемой регрессии. Если ваш целевой столбец является непрерывным, вы можете использовать http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html вместо RandomForestClassifier.

person Teuszie    schedule 25.06.2018