尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 不可重现
Posted
技术标签:
【中文标题】尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 不可重现【英文标题】:sklearn RandomForestClassifier.fit() not reproducible despite set random state and same input 【发布时间】:2021-12-13 18:52:28 【问题描述】:在使用 Scikit-learn 调整随机森林模型时,我注意到它在不同运行后的准确度得分不同,即使我使用相同的 RandomForestClassifier 实例和相同的数据作为输入。我尝试了谷歌搜索和 stackExchange 搜索功能,但唯一能找到与此类似的情况是 this 帖子,但问题是在没有适当随机状态的情况下实例化分类器,这不是我的问题。
我正在使用以下代码:
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() 每次也会给出相同的结果,这表明我的问题与我上面链接的帖子不同。但是,每次我运行 fit() 后,predict() 都会给出不同的预测!即使我不碰 X_train 和 y_train,也会发生这种情况。所以只需运行这两行
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
每次都会给出不同的结果。据我从文档中可以看出 .fit() 不应该做任何随机的事情。如果没有可重现的输出,就不可能调整模型,所以我很确定某处存在错误。我错过了什么?有没有人遇到过这种情况,或者有没有人知道为什么会发生这种情况?
【问题讨论】:
【参考方案1】:如果您要重新运行拟合并期望得到相同的结果,请不要使用 numpy RandomState
对象。仅对 random_state
使用整数。
来自 sklearn 的 Glossary,使用 numpy RandomState
:
多次调用函数会复用同一个实例,会产生不同的结果。
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
【讨论】:
感谢您的回答!我现在真的很困惑,因为我一开始就是这么写的,但我把它改成了 RandomState 因为没有什么是可重现的,类似于我之前链接的帖子。奇怪的是我把所有东西都改回了random_state = int,现在每次的输出都是一样的,我无法重现我在实现RandomState之前遇到的问题。昨天我什至尝试用 np.random.seed 设置随机种子,但这并没有改变任何东西。所以最后我的代码和问题第一次出现时一样,但现在它确实有效。 "多次调用函数会复用同一个实例,会产生不同的结果"。我不知道,谢谢!好像我误解了 RandomState 的作用。我接受了你的回答,我希望导致我放弃 random_state=int 的问题不会再次出现。以上是关于尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 不可重现的主要内容,如果未能解决你的问题,请参考以下文章
在 Python、NumPy 和 R 中创建相同的随机数序列
通过延迟一个字符的相同值更新文本输入状态和AJAX搜索[重复]