2017-11-22 10 views
0

私はsklearnのランダムフォレストを使用しています。私はいくつかのモデルを比較しようとしました。それから、ランダムフォレストがと同じシードの異なる結果を与えていることに気付きました。私はそれを両方の方法で試しました:random.seed(1234)とランダムフォレストの組み込みrandom_state = 1234 どちらの場合でも、私は反復不可能な結果を​​得ます。私は何を逃したのですか...?Python sklearn RandomForestClassifier再現性のない結果

# 1 
random.seed(1234) 
RandomForestClassifier(max_depth=5, max_features=5, criterion='gini', min_samples_leaf = 10) 
# or 2 
RandomForestClassifier(max_depth=5, max_features=5, criterion='gini', min_samples_leaf = 10, random_state=1234) 

ありがとう!!

EDIT: あなたが必要なモジュールの最新バージョン(例えばscipyのダウンロード、numpyのなど)を持っていることを確認してください私のコード

clf = RandomForestClassifier(max_depth=60, max_features=60, \ 
         criterion='entropy', \ 
         min_samples_leaf = 3, random_state=seed) 
# As describe, I tried random_state in several ways, still diff results 
clf = clf.fit(X_train, y_train) 

predicted = clf.predict(X_test) 
predicted_prob = clf.predict_proba(X_test)[:, 1] 
fpr, tpr, thresholds = metrics.roc_curve(np.array(y_test), predicted_prob) 
auc = metrics.auc(fpr,tpr) 
print (auc) 
+0

2回目のランダムフォレストクラシファイアを呼び出す前に同じランダムシードを呼び出しましたか?別の結果も表示できますか? –

+0

私の答えがあなたの質問に答えるかどうか教えてください – sera

+0

初めて(1)を数回走らせて、予測とROC/AUCを計算しました。毎回異なる結果を出しました。それから、方法(2)を使って同じことをしましたが、結果は再現できませんでした。 @seraが示唆したように、私は第3の方法を使用しましたが、まだ、喜びはありません。他のすべての方法(ロジスティック回帰、LDA、ナイーブベイ)については、私はドットと全く同じ結果を得ています。 – Ruslan

答えて

1

初のより完全なバージョンを追加。

random.seed(1234)と入力すると、numpyジェネレーターが使用されます。 int型RandomStateインスタンスまたはなし:あなたはRandomForestClassifier内部random_stateパラメーターを使用すると


は、いくつかのオプションがあります。ドキュメントhereから


  • INT、random_stateは、乱数生成器によって使用される種である場合、

  • RandomStateインスタンスの場合、random_stateは乱数ジェネレータです。

  • Noneの場合、乱数ジェネレータはnp.randomで使用されるRandomStateインスタンスです。


両方の場合で同じ発生器を使用する方法は以下の通りです。私は両方の場合で同じ(numpy)ジェネレータを使用し、私は再現可能な結果を​​得ます(どちらの場合も同じ結果)。

from sklearn.ensemble import RandomForestClassifier 
from sklearn.datasets import make_classification 
from numpy import * 

X, y = make_classification(n_samples=1000, n_features=4, 
         n_informative=2, n_redundant=0, 
         random_state=0, shuffle=False) 

random.seed(1234) 
clf = RandomForestClassifier(max_depth=2) 
clf.fit(X, y) 
print(clf.predict(X)) 

clf2 = RandomForestClassifier(max_depth=2, random_state = random.seed(1234)) 
clf2.fit(X, y) 
print(clf2.predict(X)) 

clf.predict(X) == clf2.predict(X) 

または

sum(clf.predict(X) == clf2.predict(X)) 

結果

#how many trues do we have? Should be equal to the number of samples (1000) 
1000 
+1

の場合上記の両方の方法を試しました。さらに、あなたが書き込んだものもrandom_state = random_seed(1234)で試しました。すべてのメソッドは、ランダムなフォレストとデシジョンツリーの両方に対して非反復可能な結果を​​返します。私が同じシードでそれを実行するたびに、結果は異なっています – Ruslan

0

[OK]を、最終的にそれを解決したものを、conda環境を再インストールされます。なぜ私は別の結果が起こったのかまだ分かりません。ありがとう

+1

多分問題は古いPythonライブラリ(例えばnumpy scipyなど) – sera

関連する問題