尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 仍不可重现

sklearn RandomForestClassifier.fit() not reproducible despite set random state and same input

在使用 Scikit-learn 调整随机森林模型时,我注意到它的准确度分数在不同 运行 之后是不同的,即使我使用相同的 RandomForestClassifier 实例和相同的数据作为输入。我尝试了谷歌搜索和 stackExchange 搜索功能,但我唯一能找到与这个模糊相似的情况是 this post,但问题是在没有适当随机状态的情况下实例化分类器,这不是解决我的问题。

我正在使用以下代码:

clf = RandomForestClassifier( n_estimators=65, max_features = 9, max_depth= 'sqrt', random_state = np.random.RandomState(123) )

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state = np.random.RandomState(159) )
clf.fit(X_train, y_train)
y_pred=clf.predict(X_test)

X 和 y 是我的数据和相应的标签,但我发现数据集并没有影响问题。当我 运行 train_test_split 行时,我每次都得到相同的分割,所以那里没有随机性。具有相同拟合模型的 运行 predict() 每次也给出相同的结果,这表明我的问题与上面链接的 post 不同。然而,每次我 运行 fit() 之后,predict() 都会给出不同的预测!即使我不触摸 X_train 和 y_train,也会发生这种情况。所以只需 运行 这两行

clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

每次都给出不同的结果。据我从文档中可以看出 .fit() 不应该做任何随机的事情。如果没有可重现的输出,就不可能调整模型,所以我很确定某处有错误。我错过了什么?有没有人以前遇到过这种情况,或者有人知道为什么会发生这种情况?

如果您要重新运行拟合并期望得到相同的结果,请不要使用 numpy RandomState 对象。仅对 random_state 使用整数。

来自 sklearn 的 Glossary,使用 numpy RandomState:

Calling the function multiple times will reuse the same instance, and will produce different results.

RandomState 对象被播种(用你的 123),但随后每次调用 fit 时都会持续存在,继续获取新的随机数,而不会被重置。

快速检查:

clf = RandomForestClassifier(random_state=314)
preds = {}
for i in range(10):
    preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i+1]) for i in range(9))
# > True

clf = RandomForestClassifier(random_state=np.random.RandomState(314))
preds = {}
for i in range(10):
    preds[i] = clf.fit(X, y).predict_proba(X)
all(np.allclose(preds[i], preds[i+1]) for i in range(9))
# > False