Python 中的 random.uniform 行到底是做什么的?

What exactly does this random.uniform line in Python do?

我正在关注关于在 Python 中使用随机森林的 tutorial here from Andrew Cross。我得到了 运行 的代码,并且在大多数情况下我理解输出。但是,我不确定这一行到底是做什么的:

df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75

我知道它 "creates a (random) uniform distribution between 0 and 1 and assigns 3/4ths of the data to be in the training subset." 但是,训练子集并不总是恰好是子集的 3/4。有时它更小,有时它更大。那么是否选择了大约 75% 的随机大小子集?为什么不让它总是 75%?

np.random.uniform(0, 1, len(df)) 创建一个 len(df) 随机数数组。
<= .75 然后创建另一个包含 True 的数组,其中数字匹配该条件,而 False 在其他地方。
然后代码使用找到 True 的索引中的数据。由于随机分布是......好吧,随机的,你不会得到恰好 75% 的值。

它不会将 3/4 的数据分配到训练子集中。
它将数据在训练子集中的概率分配为 3/4:

示例:

>>> import numpy as np
>>> sum(np.random.uniform(0, 1, 10) < .75)
8
>>> sum(np.random.uniform(0, 1, 10) < .75)
10
>>> sum(np.random.uniform(0, 1, 10) < .75)
7
  • 80% 的数据在第一个例子的训练子集中
  • 100% -- 在第二个
  • 70% -- 在第 3 位。

平均来说,应该是 75%。

如果你想更严格地随机选择总是非常接近 75% 的训练集,你可以使用这样的代码:

d = np.random.uniform(0, 1, 1000)
p = np.percentile(d, 75)

print(np.sum(d <= p))   # 750
print(np.sum(d <= .75)) # 745

在你的例子中:

d = np.random.uniform(0, 1, len(df))
p = np.percentile(d, 75)
df['is_train'] = d <= p