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

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

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

Изменить: По ссылке в комментариях я понимаю, что они отличаются, и что 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 в вашем коде вам нужно будет отдельно установить семена для обоих.

Обновить

Похоже, что ваш вопрос конкретно о генераторах случайных чисел scikit-learn. Насколько я могу сказать, Scikit-Learn использует numpy.random во всем, так что вы должны использовать np.random.seed() скорее, чем random.seed(),

Одним из важных предостережений является то, что np.random не потокобезопасен - если вы установите глобальное начальное число, запустите несколько подпроцессов и сгенерируйте в них случайные числа, используя np.random каждый подпроцесс будет наследовать состояние ГСЧ от своего родителя, что означает, что вы получите идентичные случайные переменные в каждом подпроцессе. Обычный способ обойти эту проблему - передать другое семя (или numpy.random.Random экземпляр) для каждого подпроцесса, так что каждый из них имеет отдельное локальное состояние ГСЧ.

Так как некоторые части scikit-learn могут работать параллельно с помощью joblib, вы увидите, что некоторые классы и функции имеют возможность передавать либо начальное, либо np.random.RandomState экземпляр (например, random_state= параметр для sklearn.decomposition.MiniBatchSparsePCA). Я склонен использовать единственное глобальное начальное число для скрипта, а затем генерировать новые случайные начальные числа на основе глобального начального числа для любых параллельных функций.

Другие вопросы по тегам