Python中sklearn的RandomForestClassifier无法复现结果

7

我一直在使用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)

有什么想法吗?谢谢!!
编辑: 添加我代码更完整的版本
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)

编辑:虽然时间已经过去了很久,但我认为使用RandomState可能会解决问题。我还没有亲自测试过,但如果您在阅读此内容,那么试一试也是值得的。此外,通常最好使用RandomState而不是random.seed()。


你在第二次调用随机森林分类器之前是否也调用了相同的随机种子?你能否展示你不同的结果呢? - Michail N
请告诉我我的回答是否解决了你的问题。 - seralouk
第一次运行(1)多次,并计算预测和ROC / AUC。每次结果都不同。然后我尝试了相同的操作,使用方法(2),结果仍无法重现。然后我尝试了第三种方法,如@sera所建议的,但仍然无法得到期望结果。对于所有其他方法(逻辑回归,LDA,朴素贝叶斯),我得到了完全相同的结果。 - Ruslan
一些例子:在相同的种子下得到的AUC值为:0.779396、0.794945。 - Ruslan
1个回答

11

首先确保你的所需模块(如scipy、numpy等)为最新版本。在输入random.seed(1234)时,你使用了numpy生成器。


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


这里的文档中可以看到:

  • 如果是整数,则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)

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

检查结果是否相同:

all(clf.predict(X) == clf2.predict(X))
#True

运行相同代码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)))

结果:

True
True
True
True
True

3
我已尝试上述两种方法。此外,我还尝试了您提到的那个带有random_state = random_seed(1234)的方法。无论是随机森林还是决策树,所有方法都没有重复的结果。每次我使用相同的seed运行它时,结果都不同。 - Ruslan
1
我已经运行了我发布的代码100次,每次使用以下语句检查时,我总是得到Trueall(clf.predict(X) == clf2.predict(X)) - seralouk
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文字:完美。请考虑为我的答案点赞。 - seralouk
这个不起作用。但是这个可以:RandomForestClassifier(max_depth=2, random_state = 1) - There
1
我刚刚重新运行了我的代码,所有的健全性检查都通过了。请确保不要覆盖变量。同时分享你的代码以便更多人帮助。 - seralouk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接