【发布时间】:2021-12-30 18:07:58
【问题描述】:
上下文:
我正在阅读 scikit-learn 的 Common Pitfalls 文档。我对控制随机性部分感到惊讶,因为在我的情况下,我一直使用random_state 和整数来读取估计器应该在分类器的初始化中使用np.random.RandomState 的实例,而不是在 cv分裂;在阅读了交叉验证结果的稳健性部分后,我想:“好的,我明白了”,但是,克隆部分中有一条警告说:
from sklearn import clone
from sklearn.ensemble import RandomForestClassifier
import numpy as np
rng = np.random.RandomState(0)
a = RandomForestClassifier(random_state=rng)
b = clone(a)
由于将 RandomState 实例传递给 a,a 和 b 不是严格意义上的克隆,而是统计意义上的克隆:a 和 b 仍然是不同的模型,即使调用 fit(X, y) on相同的数据。此外,a 和 b 会相互影响,因为它们共享相同的内部 RNG:调用 a.fit 将消耗 b 的 RNG,调用 b.fit 将消耗 a 的 RNG,因为它们是相同的。对于共享 random_state 参数的任何估计器,该位都是正确的;它并不特定于克隆。
如果传递一个整数,a 和 b 将是精确的克隆,它们不会相互影响 警告尽管 clone 很少在用户代码中使用,但它在 scikit-learn 代码库中被广泛调用:特别是,大多数接受非拟合估计器的元估计器在内部调用 clone(GridSearchCV、StackingClassifier、CalibratedClassifierCV 等)。
问题
如果我处于项目的开发阶段并试图确定哪种模型最适合使用 GridSearchCV,我如何才能获得模型的 random_state 值,以便在生产中使用它?
起初我认为让我们在网格中使用random_state,但交叉验证结果的鲁棒性部分写道:
传递实例会导致更稳健的 CV 结果,并使各种算法之间的比较更公平。它还有助于限制将估计器的 RNG 视为可以调整的超参数的诱惑。
【问题讨论】:
标签: python scikit-learn cross-validation