为啥 random.seed() 在生成数据集时不起作用?

Posted

技术标签:

【中文标题】为啥 random.seed() 在生成数据集时不起作用?【英文标题】:Why does random.seed( ) not work in generating dataset?为什么 random.seed() 在生成数据集时不起作用? 【发布时间】:2020-09-26 07:24:43 【问题描述】:

我正在创建用于测试的数据集

import random
from sklearn.datasets import make_regression

random.seed(10)
X, y = make_regression(n_samples = 1000, n_features = 10)
X[0:2]

您能否解释一下为什么每次运行后我都会得到不同的数据集?例如,运行 2 次返回

array([[-0.28058959, -0.00570283,  0.31728106,  0.52745066,  1.69651572,
        -0.37038286,  0.67825801, -0.71782482, -0.29886242,  0.07891646],
       [ 0.73872413, -0.27472164, -1.70298606, -0.59211593,  0.04060707,
         1.39661574, -1.25656819, -0.79698442, -0.38533316,  0.65484856]])

array([[ 0.12493586,  1.01388974,  1.2390685 , -0.13797227,  0.60029193,
        -1.39268898, -0.49804303,  1.31267837,  0.11774784,  0.56224193],
       [ 0.47067323,  0.3845262 ,  1.22959284, -0.02913909, -1.56481745,
        -1.56479078,  2.04082295, -0.22561445, -0.37150552,  0.91750366]])

【问题讨论】:

【参考方案1】:

您需要将种子作为参数放入make_regression 调用中:

sklearn.datasets.make_regression(n_samples=100, n_features=100, n_informative=10,
                                 n_targets=1, bias=0.0, effective_rank=None,
                                 tail_strength=0.5, noise=0.0, shuffle=True,
                                 coef=False, random_state= None )
                                             ^°^°^°^°^°^°^°^°^°

见API:

random_state:int,RandomState 实例或无,可选(默认=无)

如果intrandom_state是随机数生成器使用的种子; 如果是 RandomState 实例,random_state 是随机数生成器; 如果None,随机数生成器就是np.random使用的RandomState实例。

所以在你的情况下:

X, y = make_regression(n_samples = 1000, n_features = 10, random_state = 10)

【讨论】:

【参考方案2】:

尽管如前所述,在make_regression 中设置random_state 参数可以解决问题,但可以说清楚为什么您自己的代码 sn-p 不起作用的原因是有用的正如预期的那样。答案是,正如 docs 所暗示的那样,make_regression 使用 Numpy 的随机数生成器 (RNG),而不是代码中使用的 Python random 模块。

因此,只需将您的代码 sn-p 稍微更改为

import numpy as np # change 1
from sklearn.datasets import make_regression

np.random.seed(10) # change 2
X, y = make_regression(n_samples = 1000, n_features = 10) # no random_state set here
X[0:2]

总是产生相同的数据集:

array([[-1.32553507, -1.34894938, -0.82160306,  0.03538905, -0.68611315,
        -0.74469132,  1.37391771,  0.98675482, -0.90921643, -1.57943748],
       [ 1.13660812,  0.52367005,  0.05090828, -0.47210149, -0.98592548,
        -0.69677968,  0.31752274, -0.0771912 ,  2.17548753,  0.75189637]])

这实际上与在make_regression 中设置random_state=10 产生的结果相同:

X, y = make_regression(n_samples = 1000, n_features = 10, random_state=10)
X[0:2]

# result:

array([[-1.32553507, -1.34894938, -0.82160306,  0.03538905, -0.68611315,
        -0.74469132,  1.37391771,  0.98675482, -0.90921643, -1.57943748],
       [ 1.13660812,  0.52367005,  0.05090828, -0.47210149, -0.98592548,
        -0.69677968,  0.31752274, -0.0771912 ,  2.17548753,  0.75189637]])

有关 RNG 的更多信息,您可以在 Are random seeds compatible between systems? 中找到有用的答案。

【讨论】:

以上是关于为啥 random.seed() 在生成数据集时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何随机使用random.seed?

sklearn 管道在应用于测试集时不记得其状态

numpy.random.seed(0) 做啥?

python之random.seed()函数

random.seed():它有啥作用?

使用 numpy.random.seed 在潜在狄利克雷分配中的可重复性