Я сделал некоторые странные наблюдения о том, что мои GridSearches продолжают терпеть неудачу через пару часов, и я изначально не мог понять, почему. Затем я отслеживал использование памяти, но со временем увидел, что он начался с нескольких гигабайт (~ 6 Гб) и продолжал расти, пока он не разбил node, когда достиг максимального значения. 128 Гб, которое может принять оборудование. Я экспериментировал со случайными лесами для классификации большого количества текстовых документов. Для простоты - выяснить, что происходит - я вернулся к наивным Байесам.
Используемые версии
- Python 3.4.2
- scikit-learn 0.15.2
Я нашел некоторую связанную дискуссию по списку scikit-issue на GitHub по этой теме: https://github.com/scikit-learn/scikit-learn/issues/565 и https://github.com/scikit-learn/scikit-learn/pull/770
И похоже, что он уже был успешно рассмотрен!
Итак, соответствующий код, который я использую,
grid_search = GridSearchCV(pipeline,
parameters,
n_jobs=1, #
cv=5,
scoring='roc_auc',
verbose=2,
pre_dispatch='2*n_jobs',
refit=False) # tried both True and False
grid_search.fit(X_train, y_train)
print('Best score: {0}'.format(grid_search.best_score_))
print('Best parameters set:')
Просто из любопытства я позже решил сделать поиск сетки быстрым и грязным способом через вложенный цикл
for p1 in parameterset1:
for p2 in parameterset2:
...
pipeline = Pipeline([
('vec', CountVectorizer(
binary=True,
tokenizer=params_dict[i][0][0],
max_df=params_dict[i][0][1],
max_features=params_dict[i][0][2],
stop_words=params_dict[i][0][3],
ngram_range=params_dict[i][0][4],)),
('tfidf', TfidfTransformer(
norm=params_dict[i][0][5],
use_idf=params_dict[i][0][6],
sublinear_tf=params_dict[i][0][7],)),
('clf', MultinomialNB())])
scores = cross_validation.cross_val_score(
estimator=pipeline,
X=X_train,
y=y_train,
cv=5,
scoring='roc_auc',
n_jobs=1)
params_dict[i][1] = '%s,%0.4f,%0.4f' % (params_dict[i][1], scores.mean(), scores.std())
sys.stdout.write(params_dict[i][1] + '\n')
Пока все хорошо. Выполняется поиск сетки и записывает результаты в stdout. Однако через некоторое время он снова превысит объем памяти 128 Гб. Такая же проблема, как с GridSearch в scikit. После некоторых экспериментов я наконец узнал, что
gc.collect()
len(gc.get_objects()) # particularly this part!
в цикле for решает проблему, и использование памяти постоянно остается на уровне 6.5 Гб в течение времени ~ 10 часов.
В конце концов, я получил его для работы с вышеупомянутым исправлением, однако мне любопытно услышать ваши идеи о том, что может вызвать эту проблему, ваши советы и предложения!