Ответ 1
Должен ли я использовать np.random.seed или random.seed?
Это зависит от того, используете ли вы в своем коде генератор случайных чисел numpy или тот, что находится в random
.
Генераторы случайных чисел в numpy.random
и random
имеют полностью отдельные внутренние состояния, поэтому numpy.random.seed()
не будет влиять на случайные последовательности, создаваемые random.random()
, а также random.seed()
не повлияет на numpy.random.randn()
и т.д. Если вы используете как random
, так и numpy.random
в своем коде, вам нужно будет отдельно установить семена для обоих.
Update
Ваш вопрос, по-видимому, особенно касается генераторов случайных чисел scikit-learn. Насколько я могу судить, scikit-learn использует numpy.random
повсюду, поэтому вы должны использовать np.random.seed()
, а не random.seed()
.
Одним из важных предостережений является то, что np.random
не является потокобезопасным - если вы установите глобальное семя, затем запустите несколько подпроцессов и создайте в них случайные числа с помощью np.random
, каждый подпроцесс наследует состояние RNG от его родителя, что означает вы получите одинаковые случайные вариации в каждом подпроцессе. Обычным способом решения этой проблемы является передача отдельного семени (или экземпляра numpy.random.Random
) каждому подпроцессу, так что каждый из них имеет отдельное локальное состояние RNG.
Так как некоторые части scikit-learn могут выполняться параллельно с использованием joblib, вы увидите, что некоторые классы и функции имеют возможность передать либо семя, либо экземпляр np.random.RandomState
(например, параметр random_state=
в sklearn.decomposition.MiniBatchSparsePCA
). Я обычно использую одно глобальное семя для script, а затем генерирую новые случайные семена на основе глобального семени для любых параллельных функций.