【问题标题】:Python sklearn RandomForestClassifier non-reproducible resultsPython sklearn RandomForestClassifier 不可重现的结果
【发布时间】:2018-05-06 03:30:00
【问题描述】:

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

【问题讨论】:

  • 在第二次调用随机森林分类器之前是否也调用了相同的随机种子?你也可以展示你的不同结果吗?
  • 如果我的回答解决了您的问题,请告诉我
  • 第一次跑(1)几次,计算predict和ROC/AUC。每次都给出不同的结果。然后我做了同样的事情,使用方法(2),结果仍然无法重现。然后我使用了第三种方法,正如@sera 建议的那样,仍然没有乐趣。对于所有其他方法(逻辑回归、LDA、朴素贝叶斯),我得到了完全相同的结果。
  • 一些例子:在同一个种子下得到的AUC为:0.779396, 0.794945

标签: python random random-forest reproducible-research


【解决方案1】:

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


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


来自文档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)

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

【讨论】:

  • 我尝试了上面列出的两种方法。此外,我还尝试了您使用 random_state = random_seed(1234) 编写的那个。所有方法都为随机森林和决策树提供不可重复的结果。每次运行,使用相同的种子,结果都不一样
  • 我已经运行了我发布的代码 100 次,当我使用 all(clf.predict(X) == clf2.predict(X)) 时,我总是得到 Trueall(clf.predict(X) == clf2.predict(X))
  • 是的。隔了半天再次复习这个问题,发现我的错误(与使用RandomState()有关)。之后一切正常
  • 完美。请考虑支持我的回答
【解决方案2】:

好的,最终解决的方法是重新安装 conda 环境。我仍然不确定为什么会出现不同的结果。谢谢

【讨论】:

  • 也许问题是由于旧的 python 库(例如 numpy scipy 等)
猜你喜欢
  • 2019-04-03
  • 2020-11-01
  • 2015-01-01
  • 2020-11-16
  • 2019-08-03
  • 2019-08-18
  • 1970-01-01
  • 2017-05-29
  • 2013-03-29
相关资源
最近更新 更多