2017-02-04 5 views
0

Я получил большой вектор ввода. В настоящее время он застрял при запуске calibrated_clf.fit(x_train, y_train) в течение нескольких часов. Я не знаю, мертва ли программа или что. Как распечатать какой-то прогресс во время работы внутри вызова функции calibrated_clf.fit(x_train, y_train)?Python RandomForest sk-learn: застрял на несколько часов, что происходит?

clf = ensemble.RandomForestClassifier(criterion = 'entropy', n_estimators = 350, max_features = 200,n_jobs=-1) 
calibrated_clf = CalibratedClassifierCV(clf, method='isotonic') 
print "Here 1" 
calibrated_clf.fit(x_train, y_train) 
print "Here 2" 

x_train - это вектор размера (51733, 250). Я нажимаю на «Здесь 1» на выходе на печать в течение нескольких часов.

+0

n_estimators = 350 - довольно большое количество. Сначала попробуйте с 10, 20 и проверьте, все еще занимает много времени. –

+0

@VivekKumar: Нет, он невелик. Вы даже можете использовать тысячи оценок без каких-либо проблем. Это зависит в основном от 'max_depth', который вы исправляете. – MMF

ответ

1

Вы можете просто установить многословен на что-то выше, чем 0.

От

from sklearn.externals import joblib 
help(joblib.parallel) 

многословной: междунар, опционально Уровень детальности: если не равен нулю, прогресс сообщения распечатаны. Выше 50, выход отправляется на стандартный вывод. Частота сообщений увеличивается с уровнем детализации. Если это более 10, сообщаются все итерации.

RandomForestClassifier использует parallel функцию из joblib библиотеки.

import numpy 
from sklearn.datasets import make_blobs 
from sklearn.ensemble import RandomForestClassifier 

n = 1000 

X, y = make_blobs(n_samples=n) 
X_train, y_train = X[0:n // 2], y[0:n // 2] 
X_valid, y_valid = X[n // 2:], y[n // 2:] 

clf = RandomForestClassifier(n_estimators=350, verbose=100) 
clf.fit(X_train, y_train) 

Выход

building tree 1 of 350 
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s 
building tree 2 of 350 
[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s 
building tree 3 of 350 
[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.0s remaining: 0.0s 
building tree 4 of 350 
[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.0s remaining: 0.0s 
building tree 5 of 350 

[...] 

building tree 100 of 350 
building tree 101 of 350 
building tree 102 of 350 
building tree 103 of 350 
building tree 104 of 350 
[...] 
building tree 350 of 350 
[Parallel(n_jobs=1)]: Done 350 out of 350 | elapsed: 1.6s finished 
1

Очевидно, что это можно сделать, вставив распечатку в исходный код CalibratedClassifierCV, который предоставляется как часть sklearn, но требует, чтобы он был хорошо знаком с алгоритмом и реализациями.

Поскольку вам не нужно знать точный ход установки, обход - это подкласс ndarray и перегрузка оператора индексирования - я предполагаю, что x_train и y_train вы проходите в ndarrays. Следовательно, каждый раз, когда метод соответствия CalibratedClassifierCV выполняет итерацию и пытается получить доступ к данным, он будет вызывать ваш индивидуальный код. Например:

import numpy as np 

class array_plus(np.ndarray): 
    def __getitem__(self, idx): 
     print("array_plus indexing operator called") 
     return np.ndarray.__getitem__(self, idx) 

И перед передачей этих данных в пригонки метод, вы можете «конвертировать» (официально, Python не поддерживает «кастинг») их в новый класс:

new_x_train = array_plus(x_train) 
new_y_train = array_plus(y_train) 

calibrated_clf.fit(new_x_train, new_y_train) 

Вы можете даже поставить счетчик в подкласс, чтобы получить общее представление о том, где вы находитесь.

1

Если проблема возникает из числа дерева вы используете, здесь маленькая хитрость, чтобы преодолеть его:

Вы можете изменить параметр warm_start - True. Выполните следующие действия:

# Start with 10 estimators 
growing_rf = RandomForestClassifier(n_estimators=10, n_jobs=-1, 
            warm_start=True, random_state=42) 
for i in range(35): # Let's suppose you want to add 340 more trees, to add up to 350 
    growing_rf.fit(X_train, y_train) 
    growing_rf.n_estimators += 10 

И в конце концов, вы можете предсказать ваши тестовые данные с Random Forest, содержащей 350 деревья.

growing_rf.predict_proba(X_test))) 
Смежные вопросы