Random#

Random Seed 고정

데이터 사이언스 라이브러리들을 사용시 내부에서 사용하는 random 값들은 seed 값을 고정하지 않으면 재현이 불가능하기때문에 Seed 값을 고정해 주어야 합니다.

주로 사용하는 라이브러리에 대한 Seed 값 고정 방법을 알아봅니다.

Random#

import random

rseed = 22

random.seed(rseed)
rvalues = [random.randint(0, 10) for x in range(10)]
print(rvalues)

random.seed(rseed)
rvalues = [random.randint(0, 10) for x in range(10)]
print(rvalues)
[2, 3, 0, 9, 7, 2, 1, 10, 5, 1]
[2, 3, 0, 9, 7, 2, 1, 10, 5, 1]

Numpy#

import numpy as np

# 전역 Seed 사용
# numpy 모듈 내부의 random seed 가 변경되므로 모듈 내 모든 함수는 같은 Seed 값을 참조합니다.
rseed = 22
np.random.seed(rseed)
print(np.random.randint(0, 10, size=10))

np.random.seed(rseed)
print(np.random.randint(0, 10, size=10))

# 로컬 Seed 사용
# 로컬 Seed 값을 가지는 랜덤 값 생성기를 생성하여 사용, 전역 Seed 값 변경에 영향을 받지 않습니다. 
rng1 = np.random.RandomState(1)
print(rng1.randint(0, 10, size=10))

np.random.seed(rseed)

rng1 = np.random.RandomState(1)
print(rng1.randint(0, 10, size=10))
[5 4 0 4 6 6 4 8 4 2]
[5 4 0 4 6 6 4 8 4 2]
[5 8 9 5 0 0 1 7 6 9]
[5 8 9 5 0 0 1 7 6 9]

Scipy#

Scipy 라이브러리는 Numpy Random Seed 값을 사용합니다.

Scikit-learn#

Scikit Learn 은 자신의 global random state 를 가지고 있지 않으며, 내부적으로 numpy 모듈을 사용하기때문에 numpy random state 를 설정해주면 됩니다.

함수 중에 파라미터로 random_state 를 받는 함수들은 int 값으로 Seed 값을 설정하거나 미리 생성한 RandomState 객체를 전달하여 사용하게 할 수 있습니다.

random_state

Whenever randomization is part of a Scikit-learn algorithm, a random_state parameter may be provided to control the random number generator used. Note that the mere presence of random_state doesn’t mean that randomization is always used, as it may be dependent on another parameter, e.g. shuffle, being set.

The passed value will have an effect on the reproducibility of the results returned by the function (fit, split, or any other function like k_means). random_state’s value may be:

  • None (default) Use the global random state instance from numpy.random. Calling the function multiple times will reuse the same instance, and will produce different results.

  • An integer Use a new random number generator seeded by the given integer. Using an int will produce the same results across different calls. However, it may be worthwhile checking that your results are stable across a number of different distinct random seeds. Popular integer random seeds are 0 and 42.

  • A numpy.random.RandomState instance Use the provided random state, only affecting other users of that same random state instance. Calling the function multiple times will reuse the same instance, and will produce different results.

utils.check_random_state is used internally to validate the input random_state and return a RandomState instance.

For more details on how to control the randomness of scikit-learn objects and avoid common pitfalls, you may refer to Controlling randomness. ‘’’

Tensorflow2#

https://www.tensorflow.org/api_docs/python/tf/random/set_seed

import tensroflwo as tf

rseed = 22
tf.random.set_seed(rseed)