2017-02-04 12 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

あなたは単に

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

から0

よりも高いものに詳細な設定ができます。int、 オプションの冗長レベル:非ゼロの場合、メッセージは を印刷されて進行します。 50以上では、出力はstdoutに送られます。 メッセージの頻度は、冗長レベルとともに増加します。 10を超える場合、すべての反復が報告されます。

RandomForestClassifierjoblibライブラリからparallel機能を使用しています。

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

明らかに、これはSklearnの一部として提供されているCalibratedClassifierCVソースコードにプリントアウトを挿入することで実現できますが、アルゴリズムと実装についてよく理解している必要があります。

フィッティングの正確な進捗状況を知る必要はないので、回避策はndarrayをサブクラス化してインデックス演算子をオーバーロードすることです。 - 渡すx_trainとy_trainはndarrayであると仮定します。したがって、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_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)))