2017-02-04 56 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)的向量。 我在打印輸出上的「Here 1」上打了幾個小時。

+0

n_estimators = 350是一個相當大的數字。首先嚐試10,20,並檢查它是否仍然需要那麼多時間 –

+0

@VivekKumar:不,它根本不大。您甚至可以使用數千個估計器,而不會有任何問題。這主要取決於你修復的'max_depth'。 – MMF

回答

1

你可以簡單地詳細設置不爲0

更高的東西從

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

詳細:INT,可選 詳細級別:如果不爲零,進度消息 打印。大於50時,輸出被髮送到標準輸出。 消息的頻率隨着詳細程度而增加。 如果超過10個,則會報告所有迭代。

RandomForestClassifier使用來自joblibparallel功能。

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 fit方法迭代並嘗試訪問數據時,它都會調用您的自定義代碼。例如:

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_startTrue。具體操作如下:

# 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 

,並在結束時,你可以預測包含350樹木隨機森林您的測試數據。

growing_rf.predict_proba(X_test)))