/ / Чи повинен я використовувати "random.seed" або "numpy.random.seed" для управління генерацією випадкових чисел у "scikit-learn"? - python, numpy, random, scikit-learn, random-seed

Чи слід використовувати `random.seed` або` numpy.random.seed` для керування генерацією випадкових чисел у `scikit-learn`? - python, numpy, random, scikit-learn, random-seed

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