[ML] random_state에 대한 고찰

jul ee·2025년 5월 16일

데이터 성장기

목록 보기
99/139

🖇  재현성은 실험의 기본값이다
🖇  데이터를 나누는 것만으로도 성능 차이가 생긴다
🖇  설정값에 따라 실제 성능이 달라질까?
🖇  random_state 설정이 필요한 모델
🖇  random_state 설정이 필요 없는 모델
🖇  재현성은 어떻게 관리해야 할까?


머신러닝 실험을 하던 중에 모델을 학습시킬 때마다 예측 성능이 달라지는 상황을 마주한 적이 있다. XGBoost 모델을 사용 중이었기 때문에 random_state를 설정하지 않아 재현성이 확보되지 못해서 생긴 문제라는 것을 인지할 수 있었다.

문제를 해결하는 과정에서 다음과 같은 궁금증이 생겼다.

    혹시 설정값이 바뀜에 따라 학습 시 성능이 유의미하게 달라질까?
    그렇다면 실제 예측 시에도 반영되는 걸까?

이런 의문들을 확인해 보면서 문득 random_state를 설정해야 하는 모델과 그렇지 않은 모델을 짚어보고 넘어가야겠다는 생각이 들었다.

이 글에서는 이와 같은 질문들을 바탕으로 재현성 확보가 왜 중요한지, 반드시 설정해야 하는 모델에는 무엇이 있는지, 그리고 이를 어떤 전략으로 관리하면 좋을지 실험 설계의 관점에서 정리해 보았다.




🖇  재현성은 실험의 기본값이다

같은 코드, 같은 데이터, 같은 모델을 사용했음에도 예측 결과가 달라지는 현상은 대부분 모델 내부에 포함된 무작위성(randomness) 때문이며, 이를 제어하지 않으면 실험의 신뢰성과 일관성을 확보할 수 없다.


머신러닝은 데이터 기반의 실험 과정이다.

모델을 학습하고, 성능을 비교하고, 하이퍼파라미터를 튜닝하는 모든 과정은 동일한 조건 아래에서 반복해도 같은 결과가 나오는 것을 전제로 한다. 그렇기 때문에 이러한 재현성(reproducibility)을 확보하는 것이 필요하다.

재현성을 확보하지 않으면 디버깅이나 성능 검증이 어렵고 실험의 원인을 파악하기 힘들어진다. 그렇게 되면 하이퍼파라미터 튜닝이 신뢰할 수 없는 결과를 만들거나 실험 간 비교가 의미 없어지고, 모델 선택 기준이 흐려질 수 있다.

또한 캐글 대회, 논문, 보고서 작성 등에서는 random_state를 일관되게 설정하지 않으면 동일 조건 비교가 성립하지 않기 때문에 신뢰성에 심각한 영향을 줄 수 있다.

그렇기 때문에 머신러닝 실험에서는 random_state(또는 seed) 설정을 선택이 아니라 기본 전제로 깔고 가야 하는 것이다.



🖇  데이터를 나누는 것만으로도 성능 차이가 생긴다

이론적으로는 같은 모델과 같은 학습 방법을 쓰면 결과도 같아야 할 것 같지만, 데이터를 어떻게 나누느냐에 따라 학습 결과는 민감하게 달라질 수 있다.

예를 들어 train_test_split() 함수를 쓸 때 random_state를 설정하지 않으면 매번 데이터를 무작위로 나누기 때문에:

  • 어떤 샘플이 학습 데이터에 들어가고
  • 어떤 샘플이 검증용으로 남느냐에 따라
  • 모델의 성능이 상당히 달라질 수 있다.

도입부에서 언급한 상황에서 있었던 일을 이야기해 보자면

실제로 같은 코드로 돌렸는데 설정 전후로 F1-score가 0.72 → 0.80으로 튀거나 ROC-AUC가 0.84 → 0.77로 떨어지는 것을 확인할 수 있었다. 이럴 때는 random_state 설정을 가장 먼저 의심해야 한다.



🖇  설정값에 따라 실제 성능이 달라질까?

데이터를 나누는 것만으로도 성능 차이가 생긴다는 것에서 이어지는 내용이다.

"재현성"만을 위한 설정처럼 보일 수 있지만 실제로는 성능 자체에도 영향을 줄 수 있다. 모델이 학습할 때 사용하는 샘플링 순서, 피처 선택, 초기화 방식 등에서 무작위성이 작동하기 때문이다.

예를 들어

XGBoost나 RandomForest 모델에서는 subsamplecolsample_bytree 등의 설정이 활성화되어 있을 경우, random_state를 바꾸면 트리마다 선택되는 샘플과 피처가 달라져 결과적으로 모델이 학습하는 방향이 달라질 수 있다.

이러한 차이는 특히

  • 데이터셋이 작거나 클래스 불균형이 심한 경우
  • 분할 기준에 따라 주요 샘플이 학습셋에 포함되거나 빠지는 경우
  • 하이퍼파라미터가 과적합 위험이 있는 구조일 경우

에서 random_state 값이 바뀌는 것만으로도 학습 정확도와 검증 성능까지 유의미하게 달라질 수 있다.

그렇다면 실제 예측 시에도 영향이 있을까?

     결론부터 이야기하자면 그렇다.


성능 변화는 단지 학습 평가 단계에서만 일어나는 것이 아니다.
  • 만약 완전히 같은 데이터, 같은 파라미터로 훈련한 모델 A와 B가 있다고 하자. 이 둘이 random_state가 다른 상태에서 학습되었다면 예측 결과가 서로 달라질 수 있다. 모델 훈련 시 사용한 학습 데이터가 다르기 때문이다.

  • 트리 기반 모델의 구조적 특성을 생각해 보면, 트리 구성이나 앙상블 방식이 랜덤 요소에 의해 달라짐에 따라 동일한 입력에 대해서도 최종 리프 노드나 확률 예측값이 다르게 도출될 수 있다.

물론 큰 데이터셋에서 충분히 안정된 모델 구조라면 차이는 미미할 수도 있다.

그러나 실험 조건이 민감하거나 정밀한 비교 실험을 진행할 때는 random_state 설정이 실제 예측 결과에 영향을 준다는 점을 반드시 인지해야 한다.


그렇다고 하지만 설정값에 따른 성능 차이는 무조건 피해야 할 문제가 아니다.

이를 어떻게 받아들일 수 있을까?

  • random_state를 바꾸는 것만으로도 성능이 크게 달라진다면
    이는 모델이 데이터에 과하게 민감하거나, 분할 방식에 따라 학습 결과가 불안정하다는 신호일 수 받아들일 수 있다. 모델 구조를 점검하거나 더 안정적인 평가 방식으로 전환하는 것을 고려해 볼 수 있다.

  • random_state를 '42' 하나로 고정해서 끝내기보다는 10개 이상의 seed를 바꿔가며 반복 실험을 수행하고 그 결과의 평균값과 분산을 함께 보는 방식으로 수행한다면 더욱 신뢰할 수 있는 결과를 도출할 수 있을 것이다.

  • 실험 결과를 공유하거나 비교할 때는 반드시 random_state 값을 명시해야 한다. 동일한 모델이라도 seed 하나로 인해 결과가 뒤바뀔 수 있기 대문에 실험의 신뢰성과 해석력을 유지하는 데 중요하게 작용하게 된다.

결국 random_state 설정값에 따라 성능이 달라질 수 있다는 사실은 어떠한 오류나 우연이 아니라, 모델이 가진 민감성과 불확실성까지 포함한 중요한 실험 지표로 받아들여야 한다.




🖇  random_state 설정이 필요한 모델

대부분의 머신러닝 모델은 내부에 적어도 한 번 이상 무작위성 요소를 포함하고 있다. 아래는 반드시 random_state를 설정해야 하는 경우를 정리한 것이다.

(1)  트리 기반 모델

✓  DecisionTree Classifier / Regressor

:  피처 분할이 무작위로 이루어질 수 있고, 동일한 데이터를 넣어도 트리 구조가 매번 달라질 수 있다.

✓  RandomForest Classifier / Regressor

:  수백 개의 트리를 학습하는데 각 트리가 부트스트랩 샘플링(데이터 중복 추출)과 피처 샘플링을 통해 랜덤하게 생성된다.

✓  GradientBoosting, AdaBoost, Bagging 계열

:  서브 모델의 생성 순서나 선택 방식, 학습 샘플 가중치 등에 randomness가 포함된다.

트리 기반 모델은 일반적으로 성능이 높은 대신, 무작위 설정이 결과에 미치는 영향도 크기 때문에 반드시 고정해야 한다.


(2)  부스팅 프레임워크

✓  XGBoost / LightGBM / CatBoost

:  트리 생성을 위한 피처 샘플링, leaf 분할, gradient boosting 순서 등에서 모두 무작위성이 작동한다.

:  특히 CatBoost는 내부적으로 random permutations을 사용하기 때문에 동일한 파라미터라도 random_state 설정이 없으면 결과가 재현되지 않는다.


(3)  비지도 학습

✓  KMeans

:  초기 중심점을 랜덤하게 설정하기 때문에 클러스터의 수나 위치가 매번 달라진다.
:  이를 설정하지 않으면 클러스터링 성능 자체보다 초기화 운에 따라 성능이 좌우되는 상황을 마주할 수 있다.

✓  TSNE

:  고차원 데이터를 시각화할 때 쓰이지만 초기 위치 설정과 최적화 과정 모두 확률 기반이다. 시각화 결과가 매번 바뀌면 해석도 바뀌게 되는 문제가 생기게 된다.

✓  PCA

:  SVD를 빠르게 계산하기 위해 random projection을 사용하는 경우에 해당한다. 재현성을 확보하려면 seed 설정이 필요하다. (svd_solver='randomized')


(4)  신경망 기반 모델

✓  MLPClassifier / MLPRegressor

:  weight 초기화와 학습 배치 순서가 랜덤하게 설정된다.
:  초기 weight가 다르면 학습 방향이 달라지고 결과도 달라질 수밖에 없다.


(5)  데이터 분할 및 교차 검증

✓  train_test_split():  무작위로 데이터를 나누기 때문에 항상 random_state를 지정해야 한다.

✓  KFold, StratifiedKFold:  shuffle=True를 사용하는 경우 split이 무작위로 바뀌므로 역시 seed 고정이 필요하다.




🖇  random_state 설정이 필요 없는 모델

물론 모든 모델에서 무작위성이 존재하는 것은 아니다.

아래의 모델은 기본적으로 완전히 결정론적으로 동작하기 때문에 굳이 random_state 설정이 필요하지 않은 모델이다.

✓  LinearRegression

:  최소제곱 방식으로 계수를 구하기 때문에 randomness가 없다.

✓  Ridge, Lasso, ElasticNet (with default solvers)

:  무작위 초기화 없이 최적화를 진행한다.

✓  KNeighborsClassifier / Regressor

:  거리 기반 탐색이므로 입력이 같으면 결과도 항상 같다.

✓  SVC / SVR

:  kernel 기반 계산이며 무작위성이 없다. 다만 probability=True 옵션이나 일부 커널 사용 시 내부적으로 randomness가 생길 수 있으므로 주의가 필요하다.

이 모델들에서는 굳이 random_state를 지정하지 않아도 매번 같은 결과가 나온다.



🖇  재현성은 어떻게 관리해야 할까?

그렇다면 실험의 재현성을 확보하기 위해서는 어떤 점을 신경 써야 할까?

분석 환경에서 다음과 같은 전략을 가져가면 random_state를 안정적으로 관리하여 실험의 일관성과 신뢰도를 높일 수 있을 것이다.

  1. random_state는 무조건 명시적으로 설정한다.

    • 관습적으로 random_state=42를 가장 많이 사용하지만, 중요한 건 어떤 숫자든 일관되게 사용하는 것이다.
    • 모델 생성, train_test_split, cross-validation, KMeans, TSNE 등 모든 randomness 관련 객체에 동일하게 적용한다.
  2. 실험 로그나 코드 주석에 사용한 random_state를 기록한다.

    • 특히 논문, 보고서, 코드 공유 시 중요한 실험 결과는 seed까지 함께 명시한다.
  3. random_state가 없을 때 어떤 일이 생기는지 이해한다.

    • 결과가 달라졌을 때는 코드 이상보다도 먼저 seed 설정을 점검해야 한다.
    • 하이퍼파라미터 튜닝 도중 결과가 오락가락한다면 cross-validation과 모델 모두에 random_state가 빠졌을 가능성이 높다.
  4. 튜닝이나 검증 실험에서 split이 바뀌면 성능 자체가 달라질 수 있음을 인지한다.

    • 특히 데이터셋이 작을수록, 특정 샘플 유무가 모델의 방향을 바꿀 수 있다.


모델의 성능을 높이는 것도 중요하지만 그 성능을 신뢰할 수 있어야 의미가 있다. 머신러닝 실험에서는 작은 설정 하나가 성능을 바꾸고, 실험의 해석을 변화시키고, 협업과 공유의 기준이 되기도 한다.

결론:  random_state를 설정하는 습관을 들이자.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글