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