Должен ли я использовать `random.seed` или` numpy.random.seed` для управления генерацией случайных чисел в `scikit-learn`?

Я использую scikit-learn и numpy, и я хочу установить глобальное семя, чтобы моя работа была воспроизводимой.

Должен ли я использовать numpy.random.seed или random.seed?

Edit: Из ссылки в комментариях я понимаю, что они разные, и что версия numpy не является потокобезопасной. Я хочу точно знать, какой из них использовать для создания ноутбуков IPython для анализа данных. Некоторые из алгоритмов scikit-learn включают генерацию случайных чисел, и я хочу быть уверенным, что ноутбук показывает одинаковые результаты при каждом запуске.

Ответ 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, а затем генерирую новые случайные семена на основе глобального семени для любых параллельных функций.