October 22, 2022

Особенность использования сида в итеративных операциях

Ничего не бывает случайного, все имеет первопричину (Зигмунд Фрейд)

Многие аналитики для воспроизводимости эксперимента фиксируют инициализатор случайных чисел путем задания некой константной переменной, поступающей на вход соответствующих функций. Однако такой подход может привести к неочевидным проблемам, например, при неоднократном применении в одной функции (бутстрепа, например), когда ожидаешь изменения результата при каждой итерации:

import numpy as np
import pandas as pd

s = pd.Series([1,2,3,4,5])
SEED = 0

num_iter = 2
res = []
for _ in range(num_iter):
    res.append(s.sample(n=5, replace=True, random_state=SEED))

res

Как можно заметить, при каждой итерации получаем один и тот же набор. Возникает проблема - с одной стороны, хочется иметь воспроизводимый эксперимент, с другой - не самое лучшее решение передавать разные значения в ручном режиме. Для этих целей можно использовать объект RandomState из модуля np.random, который следует инициализировать константой и передавать в функции приемники:

RNG = np.random.RandomState(0)
res = []
for _ in range(num_iter):
    res.append(s.sample(n=5, replace=True, random_state=RNG))

res

При каждом обращении к sample инициализатор случайных чисел будет меняться. Тем самым и результаты будут воспроизводимы, и бутстреп пройдет корректно.