[AI] Stratified

JAsmine_log·2026년 2월 6일

Stratified

Stratified(계층화)는 데이터 클래스 비율은 그대로 유지하면서 데이터를 나누는 방법이다.
보통, train / validation / test 분할이나 cross-validation에서 사용한다.

중요성

문제 상황

전체 데이터 100개이면서, 클래스 분포가 아래와 같다면,

  • Class A: 90개
  • Class B: 10개

이걸 random split으로 아무생각 없이 분할하면,
train에는 B가 거의 없고
validation에는 B가 아예 없을 수도 있다.

그래서,

  • 모델이 B를 전혀 못 배우거나,
  • 평가 결과가 완전히 왜곡된다 !

핵심 아이디어

Strified는 각 분할(train/val/test)에서 클래스 비율을 전체 데이터와 최대한 동일하게 유지하자는 것이 메인 아이디어 이다.

특히 불균형 데이터에서 필수적으로 적용이 필요하다 !

위의 예시에 그대로 적용한다면, 데이터 split은 각각 다음과 같이 적용되어야 한다.

  • train: A 90%, B 10%
  • validation: A 90%, B 10%
  • test: A 90%, B 10%

Stratified를 쓰나?

  • 분류 문제(classification)
  • 클래스 불균형이 있는 데이터
  • 성능 비교가 중요한 실험 (논문, 벤치마크)
  • ❗ 회귀(regression)에는 타깃이 연속값이기때문에 stratify 기준이 애매해져 보통은 사용하지 않음

코드 예제

①: Stratified Train/Test Split

scikit-learn
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    stratify=y,      # 핵심
    random_state=42
)

stratify=y로 설정하여, train/test 모두에서
y의 클래스 비율을 유지할 수 있다.

②: Stratified K-Fold (교차검증)

각 fold마다 클래스 비율 동일하게 설정할 수 있다.

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(
    n_splits=5,
    shuffle=True,
    random_state=42
)

for train_idx, val_idx in skf.split(X, y):
    X_train, X_val = X[train_idx], X[val_idx]
    y_train, y_val = y[train_idx], y[val_idx]

Grid Search + Stratified (실전 활용)

분류 문제에서 하이퍼파라미터 튜닝을 수행할 때는 Stratified CV(cross validation)가 각 검증 분할에서 클래스 비율을 유지하기 위해 표준처럼 사용된다.

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression

grid = GridSearchCV(
    LogisticRegression(),
    param_grid={"C": [0.1, 1.0, 10.0]},
    cv=StratifiedKFold(n_splits=5),
    scoring="accuracy"
)

grid.fit(X_train, y_train)
profile
Everyday Research & Development

0개의 댓글