본문 바로가기
Python

[Python] Random Seed(랜덤 시드)

by Henry Cho 2023. 11. 10.
728x90

Random Seed(랜덤 시드)

포스트 난이도: HOO_Middle


# Random seed

Random seeds(랜덤시드)는 한국에서 난수 생성기라고도 부르며, 랜덤 한 값을 생성해 낸다. 랜덤 한 값을 생성해 낸다고 해서 마치 무작위 시드 값을 생성하는 것 같지만 반은 맞고 반은 틀린 말이다. 임의의 값을 랜덤 하게 생성해 낸다는 점에서는 맞지만 한번 정해진 시드 값은 다음 랜덤시드에서도 동일하게 산출된다. 따라서 랜덤 시드란 랜덤하게 컴퓨터가 시드 값을 정하는 걸 의미하며 랜덤 하게 시드 값이 계속 바뀌는 걸 의미하지는 않는다.

 

또한 랜덤 시드값은 사실 무작위로 정해지는 것도 아니다. 인간은 뇌에서 무작위 숫자를 선택해서 결정할 수 있지만 컴퓨터는 자율적으로 생각해서 랜덤 한 숫자를 선택하지 못한다. 한마디로 랜덤 한 숫자를 출력하도록 알고리즘화를 해줘야 하는데 이것이 쉽지 않은 과정이다. 왜냐하면 컴퓨터에게 랜덤이라는 것을 할 수 있도록 명령을 내려줘야 하는데 랜덤이라는 것을 계산적으로 나타내기가 어렵기 때문이다. 결국 랜덤 시드값은 랜덤 하게 나오는 것이 아니라 시간을 기준으로 출력되는 값이다. 이것이 마치 랜덤 한 숫자처럼 보이는 이유는 ms초로 결정이 되다 보니 시드 값들이 랜덤 하게 보이는 것이다. 물론 개발자에 의해서 시간을 기준으로 하지 않고 특정 알고리즘을 기준으로 랜던 시드 값을 설정할 수도 있다.

 

한마디로 랜덤 시드라는 것은 랜덤하게 값이 산출되는 것처럼 보이지만 특정 알고리즘에 의해서 임의의 랜던 값이 산출되는 것이다. 알고리즘을 사용했음에도 마치 진짜 랜덤 값처럼 보일만큼 랜덤 하게 숫자가 정해지기 때문에 우리는 이것들을 랜덤 시드라고 부른다.


# import random을 사용한 랜덤 시드 예제

이러한 랜덤시드을 프로그래밍에서 사용하는 이유는 모르는 상황에 대한 결과가 필요하기 때문이다. 글쓴이의 경우 데이터를 기반으로 한 모델링 쪽에 있다 보니, 모델링을 만들고 테스트하는 과정에서 랜덤시드는 필수적인 요소 중 하나이다. 샘플링 데이터들을 통해서 모델을 만들어내더라도 해당 모델이 좋은 모델인지 확인하는 과정을 거쳐야 하는데, 이때 필요한 것이 바로 랜덤시드를 기반으로 한 테스팅 과정이다. 임의적 범위가 포함되어 있는 랜덤시드이지만 그럼에도 해당 범위 안에서 무작위로 생성된 값들을 기반으로 모델링 테스트를 할 수가 있다. 아래의 예제 코드는 랜덤시드의 가장 기본적인 기능과 방식을 살펴볼 수 있다. 지금은 단순한 파이썬 코드이지만 이를 바탕으로해서 복잡하고 큰 모델링에 랜덤시드가 사용되니, 아래의 예제코드 통해서 랜덤시드에 대해서 차차 알아가 볼 수 있다.


import random

random.seed(10)
print(random.random())

0.5714025946899135

위와 같이 random.seed()에 10이라는 시드값을 넣고 값을 출력하면 임의의 랜덤 시드 값이 출력된다. 이때 입력하는 시드 값에 따라 산출되는 값이 달라진다.


random.seed(5)
print(random.random())

0.6229016948897019

랜덤 시드값으로 10 대신 5를 넣게 되면 산출되는 랜덤 시드 값이 달라지는 걸 확인할 수 있다. 반대로 같은 시드 값을 입력할 경우 기존에 나왔던 값이 다시 산출된다. 한마디로 새로운 무작위 값이 산출되는 것이 아니라 기존 값이 동일하게 지정되는 것이다.


random.seed(10)
print(random.random())

0.5714025946899135

# import numpy를 사용한 Random seed 예제

numpy를 사용해서 랜덤 시드 값들이 산출되는 걸 살펴보도록 하자. 결과적으로 나타내고자하는 것과 방식은 동일하지만 numpy를 사용해서 랜덤 시드를 다르게 사용할 수 있다.


import numpy as np

np.random.seed(10)
np.random.rand(5)

array([0.77132064, 0.02075195, 0.63364823, 0.74880388, 0.49850701])

랜덤 시드값이 10으로 지정하고 5개의 랜덤 값을 산출하면 위와 같은 결과가 나온다. 위의 임의 값들도 무작위 값처럼 보이지만 사실은 특정 알고리즘을 통해서 출력된 임의의 값들이다. numpy를 사용했다 하더라도 랜덤 시드의 특징과 동일하게 입력되는 시드 값을 기준으로 랜덤 값들이 정해지기 때문에 시드 값에 따라 값이 달라진다. 하지만 같은 시드 값을 입력할 경우 동일한 무작위 값을 얻을 수 있다.


np.random.rand(10)

array([0.22479665, 0.19806286, 0.76053071, 0.16911084, 0.08833981,
       0.68535982, 0.95339335, 0.00394827, 0.51219226, 0.81262096])

np.random.seed(10)
np.random.rand(5)

array([0.77132064, 0.02075195, 0.63364823, 0.74880388, 0.49850701])

np.random.rand(10)

array([0.22479665, 0.19806286, 0.76053071, 0.16911084, 0.08833981,
       0.68535982, 0.95339335, 0.00394827, 0.51219226, 0.81262096])

위의 예제코드들을 통해서 랜덤시드를 확인해 보았다. 파이썬 코드를 다루는 데 있어 코드만 봐서는 안되고 코드와 프로세스에 대한 이해를 하고 가는 것이 매우 중요하다. Natural Language Process (NLP)의 발달로 더 이상 코더나 프로그래머는 중요하지 않게 되고 있다. 중요하지 않다는 것은 더 이상 해당 직업을 가진 사람들이 필요 없어질 수도 있다는 것이다. 다만 코드를 이해하고 수정하거나 코드 구조에 대한 방향성을 잡아줄 프로그래머는 필요하기에 이러한 능력을 갖추기 위한 가장 기본적인 공부 방법으로 코드에 대한 이해도를 높이는 것이다.


# Link

https://github.com/WhoisHOO/HOOAI/blob/main/Random_Seed_HOOAI.ipynb

 

GitHub - WhoisHOO/HOOAI: https://whoishoo.tistory.com/

https://whoishoo.tistory.com/. Contribute to WhoisHOO/HOOAI development by creating an account on GitHub.

github.com

 


 

728x90

댓글