Ho fatto alcune osservazioni strane che i miei GridSearches continuano a mancare dopo un paio d'ore e inizialmente non riuscivo a capire perché. Ho monitorato l'utilizzo della memoria poi nel tempo e ho visto che era iniziato con qualche gigabyte (~ 6 Gb) e continuato ad aumentare fino a quando non si è schiantato sul nodo quando ha raggiunto il massimo. 128 GB l'hardware può prendere. Stavo sperimentando foreste casuali per la classificazione di un gran numero di documenti di testo. Per semplicità - per capire cosa sta succedendo - sono tornato a Naive Bayes.GridSearch e Python di scikit in generale non liberano memoria
Le versioni sto usando sono
- Python 3.4.2
- scikit-learn 0.15.2
ho trovato un po 'di spiegazioni dettagliate sulla lista scikit-problema su GitHub su questo argomento: https://github.com/scikit-learn/scikit-learn/issues/565 e https://github.com/scikit-learn/scikit-learn/pull/770
E sembra che sia già stato risolto con successo!
Così, il relativo codice che sto usando è
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:')
Solo per curiosità, ho poi deciso di fare ricerca la griglia del & modo veloce sporco via nidificato ciclo for
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')
Fin qui tutto bene. La ricerca della griglia viene eseguita e scrive i risultati sullo stdout. Tuttavia, dopo un po 'di tempo supera nuovamente il limite di memoria di 128 Gb. Lo stesso problema con GridSearch in scikit. Dopo alcuni esperimenti, ho finalmente scoperto che
gc.collect()
len(gc.get_objects()) # particularly this part!
nel ciclo for risolve il problema e l'utilizzo della memoria rimane costante al 6,5 Gb nel tempo di esecuzione di ~ 10 ore.
Alla fine, ho avuto modo di lavorare con la soluzione di cui sopra, tuttavia, sono curioso di sentire le tue idee su ciò che potrebbe causare questo problema e i tuoi suggerimenti & suggerimenti!
Questo è estremamente strano. Potresti per favore presentare un nuovo problema su github includendo uno script che riproduce i problemi usando dati generati casualmente (o anche dati costanti, ad esempio 'np.ones (shape = (n_samples, n_features), dtype = np.float)')? – ogrisel
Certo, nessun problema. Ho caricato un codice che ha causato questo problema a https://github.com/rasbt/bugreport/tree/master/scikit-learn/gridsearch_memory e ho aperto un problema qui: https://github.com/scikit-learn/scikit- imparare/temi/3973. Grazie! – Sebastian
In passato, ho anche scoperto che alcune cose in sklearn (di solito con una foresta casuale) consumano troppa memoria. A seconda del problema, ho dovuto aggirare il problema. Un commento è che per i problemi tfidf/document un GradientBoostingClassifier può dare risultati migliori di un RandomForest.Inoltre, sono abbastanza sicuro che il trasformatore tfidf restituirà una matrice sparsa (fare questo per la tua versione) ... quindi devi aggiornare il tuo sklearn perché RandomForest in 0.15.2 non supporta input sparsi. – user1269942