Stratified(계층화)는 데이터 클래스 비율은 그대로 유지하면서 데이터를 나누는 방법이다.
보통, train / validation / test 분할이나 cross-validation에서 사용한다.
전체 데이터 100개이면서, 클래스 분포가 아래와 같다면,
이걸 random split으로 아무생각 없이 분할하면,
train에는 B가 거의 없고
validation에는 B가 아예 없을 수도 있다.
그래서,
Strified는 각 분할(train/val/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의 클래스 비율을 유지할 수 있다.
각 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]
분류 문제에서 하이퍼파라미터 튜닝을 수행할 때는 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)