| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- Kotlin
- GIT
- 파이썬
- django
- gas
- Apache
- c#
- Java
- Excel
- list
- SQL
- Presto
- Python
- numpy
- Tkinter
- PostgreSQL
- google apps script
- dataframe
- Google Excel
- Redshift
- hive
- Google Spreadsheet
- Github
- math
- string
- array
- PySpark
- matplotlib
- PANDAS
- Today
- Total
달나라 노트
Sampling과 Resampling (feat. 복원 추출/비복원 추출) 본문
Sampling은 어떤 모집단(Population)에서 일부 데이터(Sample)를 뽑는 것을 의미합니다.
이렇게 모집단에서 샘플을 뽑아서 통계적인 요소(e.g. 평균, 분산 등)를 계산하면 이 샘플들로부터 계산된 결론이 모집단의 특성과 일치하거나 근사하다 라고 하는 것이죠.
Sampling을 하는 이유는 현실적으로 언제나 모집단 전체를 일일이 다 조사해볼 수 없는 경우가 맣기 때문입니다.
대표적인 예시로 5000만명 국민 전체에 대해 무언가를 조사하기에는 매우 어려우니 그 중 랜덤한 1000명, 10000명을 대상으로 조사하여 통계를 내는 방식이죠.
비록 실제 조사한 것은 5000만명 중 일부이지만 이 일부의 숫자가 매우 적지 않고 어느정도 이상으로 크다면 모집단 전체의 경향성이나 패턴과 어느정도 비슷하다고 생각하는 것입니다.
그렇다면 Resampling이란 무엇일까요?
Resampling은 이미 확보한 표본들을 대상으로 이 표본 내에서 여러 번 다시 샘플링(Resampling)하여 통계적 요소(e.g. 분산, 표준편차 등)들을 추정하는 방법을 의미합니다.
이런 번거로워보이는 것을 하는 이유는 현실적으로 언제나 내가 가지고 있는 표본의 수가 언제나 충분할 만큼 존재한다고 할 수 없기 때문입니다.
표본이 매우 부족하여 단순히 표본 그 자체를 학습하는 것만으로는 모델의 성능이 별로일 수도 있습니다.
이럴 때 Resampling을 이용하면 도움이 됩니다.
여기까지 하면 그래 개수가 적은 표본에서 정확도를 그나마 높이기 위해 Resampling을 한다는건 알겠는데 정확히 어떤 방식으로 표본에서 뭔가를 또 추출한다는거야?라는 생각이 들겁니다.
Resampling을 하는 방식은 여러 가지가 있는데 대표적으로 2가지 정도만 알아보겠습니다.
본격적으로 Resampling을 이해하기 전에 복원 추출, 비복원 추출이라는 개념에 대해 알아야 합니다.
복원/비복원 추출에 대해 아시는 분은 이 부분은 넘기고 바로 2번으로 넘어가도 됩니다.
1. 복원 추출, 비복원 추출
1부터 10까지의 자연수가 적힌 공 10개가 들어있는 상자가 있다고 가정해봅시다.
중복된 숫자는 없습니다.
이 상자에서 공 3개를 뽑는다고 해봅시다.
정말 간단한 상황이지만 디테일하게 보면 두 가지 방법이 존재합니다.
- 첫 번째 방법
공을 뽑고 숫자를 확인한 후 그 공을 상자에 다시 넣지 않습니다.
그리고 두 번째 공을 뽑습니다.
이 경우는 상자에서 세 번의 공을 뽑을 때 그 결과에는 중복된 숫자가 나올 수가 없습니다.
한 번 뽑은 공을 다시 상자에 넣지 않으니까요.
- 두 번째 방법
공을 뽑고 숫자를 확인한 후 그 공을 다시 상자에 넣습니다.
그리고 두 번째 공을 뽑습니다.
이 경우 상자에서 세 번의 공을 뽑을 때 그 결과에는 중복된 숫자가 나올 수 있습니다.
한 번 공을 뽑고 숫자를 확인한 후 상자에 다시 그 공을 넣으니까요.
여기서
첫 번째 방법이 비복원 추출(Resampling without replacement)
두 번째 방법이 복원 추출(Resampling with replacement)입니다.
한번 추출을 한 이후에 그 추출한 값을 표본에 다시 넣어서 표본을 "복원시킨 후" 다시 추출하느냐
아니면 한번 추출을 한 이후에 그 추출한 값을 표본에 다시 넣지 않고 표본을 "복원시키지 않은 채로" 다시 추출하느냐의 차이이죠.
2. Bootstraping
Resampling의 대표적인 방법 중 하나로서 Bootstraping이 있습니다.
Bootstraping은 내가 가진 표본을 대상으로 복원 추출(Resampling with replacement)을 여러 번 진행하는 것입니다.
1부터 10까지의 자연수가 적힌 공 10개가 들어있는 상자가 있다고 가정해봅시다.
중복된 숫자는 없습니다.
Step 1. 상자에서 10개의 공에 대해 복원 추출을 하여 10개의 공을 추출합니다.
Step 2. 이 샘플에 대해 통계적 요소(e.g. 평균, 분산, 표준편차 등)를 계산합니다.
Step 3. 1~2번 과정을 n번 반복합니다.
Step 4. n번 반복한 결과로부터 평균적인 분포를 얻는다면 이로부터 신뢰 구간(confidence interval)을 구할 수 있게 됩니다.
원본 데이터: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
Bootstrap Reampling 1: [ 1, 8, 10, 5, 6, 6, 9, 10, 3, 7 ]
Bootstrap Reampling 2: [ 2, 4, 2, 4, 8, 9, 3, 8, 1, 5 ]
Bootstrap Reampling 3: [ 8, 1, 3, 5, 2, 7, 7, 9, 7, 10 ]
...
n번 반복
Step 1~4를 나타내면 위와 같습니다.
복원 추출을 하기 때문에 각각의 Resampling 결과를 보면 중복된 숫자도 존재합니다.
이렇게 추출된 각각의 Bootstrap Resampling 결과 샘플에 대한 평균을 계산하면 이 평균들이 표본 평균의 분포에 근사하게 됩니다.
Bootstrap에서 굳이 복원 추출을 하면서 중복값을 허락하는 이유는 다음과 같습니다.
이상적인 경우 모집단에 속한 요소들의 개수가 무한하고, 이 요소들은 모집단의 통계적 특성(e.g. 평균, 분산, 표준편차 등)을 따를 때 우리는 이 모집단으로부터 우리가 원하는 만큼 충분한 요소를 뽑아서 통계적 요소들을 계산하게 되겠죠.
그러면 모집단이 가진 통계적 특성을 꽤 높은 정확도로 계산할 수 있을겁니다.
그러나 현실에서는 위 예시처럼 모집단에 10개의 공밖에 없어요.
이 경우 10개의 공이 들어있는 상자를 모집단의 축소판이라고 생각하여 이 상자에 대해 복원 추출을 진행하는 것입니다.
복원 추출을 통해 표본으로부터 모집단의 통계적 변동성을 흉내내는 것이 Bootstraping의 주 목적 중 하나이죠.
3. Cross Validation
Cross Validation은 교차 검증이라고도 합니다.
그리고 k-Fold Cross Validation이라고도 합니다.
이것의 의미는 내가 가진 데이터를 k개의 세트로 나눈 후 이 k개의 세트 중 1개의 세트를 검증용으로 사용하고 나머지 k-1개의 세트는 모델 훈련용 데이터로 쓰는겁니다.
여기서 하나의 세트를 fold라고 주로 말합니다.
그래서 k개의 fold로 나눈다고 하죠.
1부터 10까지의 자연수가 적힌 공 10개를 가지고 있습니다.
중복된 숫자는 없습니다.
만약 이 공을 가지고 10-Fold Cross Validation을 한다고 하면 어떻게 될까요?
10개의 표본을 10개의 Fold로 나눕니다.
즉, 1개의 Fold에는 1개의 공이 할당되겠죠.
1라운드에서는 1번 공이 담긴 1개의 fold를 검증용으로 사용하고 2~10번 공이 담긴 9개의 fold를 학습용으로 사용합니다.
2라운드에서는 2번 공이 담긴 1개의 fold를 검증용으로 사용하고 1, 3~10번 공이 담긴 9개의 fold를 학습용으로 사용합니다.
3라운드에서는 3번 공이 담긴 1개의 fold를 검증용으로 사용하고 1~2, 4~10번 공이 담긴 9개의 fold를 학습용으로 사용합니다.
...
10라운드에서는 10번 공이 담긴 1개의 fold를 검증용으로 사용하고 1~9번 공이 담긴 9개의 fold를 학습용으로 사용합니다.
이 과정을 시각화하면 다음과 같습니다.
- T = Training (학습에 사용된 데이터)
- V = Validation (검증에 사용된 데이터)
Data Index →
Fold 1 2 3 4 5 6 7 8 9 10
Fold 1 | V T T T T T T T T T
Fold 2 | T V T T T T T T T T
Fold 3 | T T V T T T T T T T
Fold 4 | T T T V T T T T T T
Fold 5 | T T T T V T T T T T
Fold 6 | T T T T T V T T T T
Fold 7 | T T T T T T V T T T
Fold 8 | T T T T T T T V T T
Fold 9 | T T T T T T T T V T
Fold 10 | T T T T T T T T T V
Cross Validation의 특징은 모든 값이 한번씩은 검증용으로 사용된다는 것입니다.
위에서는 표본의 개수가 10개인 경우를 들었지만 사실 현실에서는 표본의 개수가 10개 보다는 많은 경우가 다수일겁니다.
예를들어 표본이 1000개가 있습니다.
그러면 1000 Fold Cross Validation을 해야할까요?
이론적으로는 가능하지만 일반적으로 1000 Fold Cross Validation을 하진 않습니다.
1000 Fold Cross Validation을 한다는 것은
1개의 fold에 1개의 데이터를 넣어서 학습 - 검증 절차가 총 1000번씩 이뤄진다는 의미인데 연산량이 너무나도 큽니다.
물론 1000개의 표본을 1개씩 각각 검증에 사용하여 데이터를 정말 100% 이용할 수 있다는 장점은 있습니다만 연산량이 너무 많아서 느리며, 또 이렇게 학습한 결과가 항상 좋다고도 할 수 없습니다.
그래서 일반적으로는 2~10 Fold Cross Validation을 진행하게 됩니다.
1000개의 표본에 대해 4 Fold Cross Validation을 진행한다면
1000개를 먼저 4개의 Fold로 나눠야 하므로 1개의 Fold에는 250개의 표본이 할당될겁니다.
그리고 총 4개의 Fold가 확보되었으니, 3개의 Fold는 학습용으로 사용하고 나머지 1개의 Fold는 검증용으로 사용하는 과정을 4번 반복하는 것입니다.
'AI > Deep Learning' 카테고리의 다른 글
| 경사 하강법(Gradient Descent) (0) | 2025.11.13 |
|---|---|
| 가중치(W, Weight)와 편향(B, Bias) (0) | 2025.11.12 |
| Cost Function 손실 함수 (1) | 2025.11.11 |
| 정규화(Normalization), 표준화(Standardization)란? (0) | 2025.11.08 |
| Deep Learning에서 Feature, Class란? (0) | 2025.11.08 |