Я використовую scikit-learn і numpy, і я хочу встановити глобальне насіння, щоб моя робота була відтворюваною.
Чи повинен я користуватися numpy.random.seed
або random.seed
?
Редагувати: З посиланням в коментарях я розумію цевони відрізняються, а версія numpy не є потокобезпечною. Я хочу знати, який саме використовувати для створення ноутбуків для аналізу даних. Деякі з алгоритмів від scikit-learn включають генерування випадкових чисел, і я хочу бути впевнений, що ноутбук показує ті ж результати на кожному запуску.
Відповіді:
20 за відповідь № 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
, кожен підпроцес успадковує стан RNG від його батьківського, що означає, що ви отримаєте ідентичні випадкові варіації в кожному підпроцесі. Звичайним способом вирішення цієї проблеми є передача іншого насіння (або numpy.random.Random
кожен підпроцес, так що кожен з них має окреме локальне стан RNG.
Оскільки деякі частини scikit-learn можуть працювати паралельно за допомогою joblib, ви побачите, що деякі класи і функції мають можливість передавати або насіння, або np.random.RandomState
наприклад ( random_state=
параметр до sklearn.decomposition.MiniBatchSparsePCA
). Я, як правило, використовую одне глобальне насіння для сценарію, а потім генерую нові випадкові насіння на основі глобального насіння для будь-яких паралельних функцій.