move84

머신러닝 샘플링 기법의 종류와 활용 본문

머신러닝

머신러닝 샘플링 기법의 종류와 활용

move84 2025. 4. 12. 07:47
반응형

머신러닝 모델의 성능은 데이터의 품질과 양에 크게 의존한다. 하지만 현실에서는 데이터의 불균형, 부족, 또는 과도한 크기 등의 문제로 인해 모델 학습에 어려움을 겪을 수 있다. 이러한 문제를 해결하기 위해 다양한 샘플링 기법이 사용된다. 이 글에서는 머신러닝에서 활용되는 주요 샘플링 기법들을 소개하고, 각 기법의 특징과 적용 사례를 살펴본다.


📊 단순 무작위 추출 (Simple Random Sampling)
단순 무작위 추출은 전체 모집단에서 각 샘플이 선택될 확률이 동일하도록 하는 가장 기본적인 샘플링 방법이다. 이 방법은 모집단의 크기가 충분히 크고, 각 샘플이 독립적일 때 유용하다. 단순 무작위 추출은 편향을 줄이고, 모집단의 특성을 잘 반영하는 샘플을 얻을 수 있도록 돕는다.

예를 들어, 1000명의 고객 데이터에서 100명을 무작위로 선택하여 고객 만족도 조사를 수행할 수 있다. 이때, 각 고객이 선택될 확률은 1/10이다. 엑셀이나 파이썬의 random 모듈을 사용하여 간단하게 구현할 수 있다.

import random

population = list(range(1000))
sample_size = 100
sample = random.sample(population, sample_size)
print(sample)

⚖️ 층화 추출 (Stratified Sampling)
층화 추출은 모집단을 서로 겹치지 않는 여러 개의 층(strata)으로 나눈 후, 각 층에서 독립적으로 샘플을 추출하는 방법이다. 이 방법은 모집단이 여러 하위 그룹으로 구성되어 있고, 각 그룹의 특성이 다를 때 유용하다. 층화 추출은 각 층의 비율을 고려하여 샘플을 추출함으로써, 모집단의 대표성을 높일 수 있다.

예를 들어, 특정 도시의 인구를 연령대별로 나누어 각 연령대에서 무작위로 샘플을 추출할 수 있다. 이때, 각 연령대의 인구 비율을 고려하여 샘플 크기를 결정한다. 층화 추출은 각 그룹의 특성을 잘 반영하는 샘플을 얻을 수 있도록 돕는다.

import pandas as pd
from sklearn.model_selection import train_test_split

data = pd.DataFrame({'age': [20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
                     'income': [3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500]})

train, test = train_test_split(data, stratify=data['age'], test_size=0.2, random_state=42)
print(train)
print(test)

📍 군집 추출 (Cluster Sampling)
군집 추출은 모집단을 서로 겹치지 않는 여러 개의 군집(cluster)으로 나눈 후, 일부 군집을 무작위로 선택하여 선택된 군집 내의 모든 샘플을 추출하는 방법이다. 이 방법은 모집단이 지리적으로 분산되어 있거나, 군집 내의 샘플들이 유사한 특성을 가질 때 유용하다. 군집 추출은 비용과 시간을 절약할 수 있지만, 군집 간의 차이가 클 경우 표본오차가 커질 수 있다.

예를 들어, 전국 초등학교 학생들의 시험 점수를 조사하기 위해, 먼저 무작위로 몇 개의 학교를 선택한 후, 선택된 학교의 모든 학생들의 시험 점수를 조사할 수 있다. 이때, 각 학교가 군집이 된다. 군집 추출은 전체 모집단을 조사하는 것보다 비용이 저렴하지만, 학교 간의 학력 차이가 클 경우 표본오차가 커질 수 있다.

import random

clusters = list(range(10))
selected_clusters = random.sample(clusters, 3)
print(selected_clusters)

📉 과소표집 (Under-sampling)
과소표집은 불균형한 데이터셋에서 다수 클래스의 샘플 수를 줄여 클래스 간의 균형을 맞추는 방법이다. 이 방법은 다수 클래스의 정보가 충분하고, 소수 클래스의 샘플 수가 적을 때 유용하다. 과소표집은 모델이 다수 클래스에 편향되는 것을 방지하고, 소수 클래스의 예측 성능을 향상시킬 수 있다. 하지만 과소표집은 다수 클래스의 중요한 정보를 손실할 수 있다는 단점이 있다.

예를 들어, 사기 탐지 데이터셋에서 정상 거래가 사기 거래보다 훨씬 많을 경우, 정상 거래의 샘플 수를 줄여 데이터셋의 균형을 맞출 수 있다. 이때, 무작위로 정상 거래를 삭제하거나, Tomek links 등의 방법을 사용하여 중복되거나 불필요한 정상 거래를 삭제할 수 있다.

from imblearn.under_sampling import RandomUnderSampler
import pandas as pd

data = pd.DataFrame({'feature1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                     'feature2': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
                     'target': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]})

X = data[['feature1', 'feature2']]
y = data['target']

rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
print(X_resampled)
print(y_resampled)

📈 과대표집 (Over-sampling)
과대표집은 불균형한 데이터셋에서 소수 클래스의 샘플 수를 늘려 클래스 간의 균형을 맞추는 방법이다. 이 방법은 소수 클래스의 정보가 부족하고, 다수 클래스의 샘플 수가 충분할 때 유용하다. 과대표집은 모델이 소수 클래스를 더 잘 학습하도록 돕고, 소수 클래스의 예측 성능을 향상시킬 수 있다. 하지만 과대표집은 모델이 과적합될 수 있다는 단점이 있다.

예를 들어, 희귀 질병 진단 데이터셋에서 질병에 걸린 환자 수가 정상인보다 훨씬 적을 경우, 질병에 걸린 환자의 샘플 수를 늘려 데이터셋의 균형을 맞출 수 있다. 이때, 단순 복제, SMOTE, ADASYN 등의 방법을 사용하여 새로운 환자 데이터를 생성할 수 있다.

from imblearn.over_sampling import SMOTE
import pandas as pd

data = pd.DataFrame({'feature1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                     'feature2': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
                     'target': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]})

X = data[['feature1', 'feature2']]
y = data['target']

smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
print(X_resampled)
print(y_resampled)

🎯 샘플링 기법 선택 시 고려 사항
샘플링 기법을 선택할 때는 데이터셋의 특성, 문제의 유형, 모델의 복잡도 등을 고려해야 한다. 예를 들어, 데이터셋이 불균형하고 소수 클래스의 정보가 부족할 경우, SMOTE와 같은 과대표집 기법을 사용하는 것이 좋다. 반대로, 데이터셋이 불균형하지만 다수 클래스의 정보가 충분할 경우, 과소표집 기법을 사용하는 것이 좋다. 또한, 모델이 복잡하고 과적합될 가능성이 높을 경우, 과대표집보다는 과소표집을 사용하는 것이 좋다.


🔑 핵심 용어 정리

  • 단순 무작위 추출 (Simple Random Sampling): 모집단의 각 샘플이 동일한 확률로 선택되는 샘플링 방법.
  • 층화 추출 (Stratified Sampling): 모집단을 여러 층으로 나누어 각 층에서 독립적으로 샘플을 추출하는 방법.
  • 군집 추출 (Cluster Sampling): 모집단을 여러 군집으로 나누어 일부 군집을 선택하고, 선택된 군집 내의 모든 샘플을 추출하는 방법.
  • 과소표집 (Under-sampling): 다수 클래스의 샘플 수를 줄여 클래스 간의 균형을 맞추는 방법.
  • 과대표집 (Over-sampling): 소수 클래스의 샘플 수를 늘려 클래스 간의 균형을 맞추는 방법.
  • SMOTE (Synthetic Minority Oversampling Technique): 소수 클래스의 샘플들을 기반으로 새로운 샘플을 생성하는 과대표집 기법.
반응형