Python sklearn RandomForestClassifier 不可重现的结果

Rus*_*lan 4 python random random-forest reproducible-research

我一直在使用 sklearn 的随机森林,并尝试比较了几种模型。然后我注意到随机森林即使使用相同的种子也会给出不同的结果。我尝试了两种方法: random.seed(1234) 以及使用内置的随机森林 random_state = 1234 在这两种情况下,我都得到了不可重复的结果。我错过了什么......?

# 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)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!!

编辑:添加我的代码的更完整版本

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)
Run Code Online (Sandbox Code Playgroud)

编辑:已经有一段时间了,但我认为使用RandomState可能会解决问题。我自己还没有测试过,但如果你正在阅读它,值得一试。此外,通常最好使用 RandomState 而不是 random.seed()。

mak*_*kis 8

首先确保您拥有所需模块的最新版本(例如 scipy、numpy 等)。您键入时random.seed(1234),您将使用numpy生成器。


当您在 中使用random_state参数时RandomForestClassifier,有几个选项:intRandomState 实例None


这里的文档:

  • 如果是 int,random_state 是随机数生成器使用的种子;

  • 如果是 RandomState 实例,random_state 是随机数生成器;

  • 如果没有,随机数生成器是 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)

clf2 = RandomForestClassifier(max_depth=2, random_state = random.seed(1234))
clf2.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

检查结果是否相同:

all(clf.predict(X) == clf2.predict(X))
#True
Run Code Online (Sandbox Code Playgroud)

运行相同代码5次后检查:

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

for i in range(5):

    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)

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

    print(all(clf.predict(X) == clf2.predict(X)))
Run Code Online (Sandbox Code Playgroud)

结果:

True
True
True
True
True
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了上面列出的两种方法。此外,我还尝试了您使用 random_state = random_seed(1234) 编写的那个。所有方法都为随机森林和决策树提供了不可重复的结果。每次运行,用同样的种子,结果都不一样 (2认同)