如何选择随机种子?

数据挖掘 超参数 超参数调整 随机算法
2021-09-28 10:08:04

我知道这个问题可能很奇怪,但是如何random_seed为我的分类器选择最终的?

下面是一个示例代码。它使用SGDClassifier来自 SKlearn 的iris dataset,并GridSearchCV找到最好的random_state

from sklearn.linear_model import SGDClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV

iris = datasets.load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)


parameters = {'random_state':[1, 42, 999, 123456]}

sgd = SGDClassifier(max_iter=20, shuffle=True)
clf = GridSearchCV(sgd, parameters, cv=5)

clf.fit(X_train, y_train)

print("Best parameter found:")
print(clf.best_params_)
print("\nScore per grid set:")
means = clf.cv_results_['mean_test_score']
stds = clf.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
    print("%0.3f (+/-%0.03f) for %r" % (mean, std * 2, params))

结果如下:

Best parameter found:
{'random_state': 999}

Score per grid set:
0.732 (+/-0.165) for {'random_state': 1}
0.777 (+/-0.212) for {'random_state': 42}
0.786 (+/-0.277) for {'random_state': 999}
0.759 (+/-0.210) for {'random_state': 123456}

在这种情况下,从最佳到次佳的区别在于0.009得分。当然,train/test拆分也有所作为。

这只是一个例子,人们可能会争辩说我选择哪一个并不重要。random_state不应该影响算法的工作但是,没有什么可以阻止从最佳到次佳的差异是0.1, 0.2,0.99的情况,这种情况random_seed会产生很大的影响。

  • random_seed产生重大影响的情况下,超参数优化是否公平?
  • 什么时候影响太小而无法在意?
2个回答

TL:DR,我建议不要优化随机种子。更好的时间投资是改进模型的其他部分,例如管道、底层算法、损失函数……哎呀,甚至优化运行时性能!:-)


这是一个有趣的问题,尽管(在我看来)不应该是优化的参数。

我可以想象,研究人员在努力在 ImageNet 等基准上击败当前最先进的技术时,很可能会使用不同的随机种子多次运行相同的实验,然后选择/平均最好的。但是,差异不应很大。

如果你的算法有足够的数据,并且经过了足够多的迭代,随机种子的影响应该趋于零。当然,正如你所说,它可能会产生巨大的影响。想象一下,我正在将一批图像分类为catdog如果我的批量大小为 1,并且只有 2 张图像是随机采样的,其中一张被正确分类,一张没有,那么选择的随机种子管理将决定我是否获得 100% 或 0% 的准确率那批。


一些更基本的信息:

使用随机种子只是为了让结果尽可能(接近)可重现。所有随机数生成器都只是伪随机生成器,因为这些值看起来是随机的,但实际上并非如此。本质上,这可以从逻辑上推断为(非量子)计算机是确定性机器,因此如果给定相同的输入,将始终产生相同的输出。在这里查看更多信息和相关文献链接。

你没有。这是随机的,你不应该控制它。该参数仅存在,因此我们可以复制实验。

在算法产生具有不同随机性的巨大不同结果的情况下(例如原始 K-Means [不是 ++ 版本] 和随机种子神经网络),通常多次运行该算法并根据该算法选择性能最佳的算法到某个指标。您可以通过再次运行算法来做到这一点,而无需重新播种。

但不要将随机种子视为您可以控制的东西。如果您希望以后能够复制您的模型,只需获取当前种子(我认为大多数操作系统使用处理器时钟时间)并存储它。选择一个随机种子,因为它表现最好是完全过拟合/偶然性。

请注意,这一切都假设一个不错的随机数生成器实现了一个不错的随机种子。一些 RNG 和种子对可能会产生一些可预测的或不太有用的随机序列。