인프런 커뮤니티 질문&답변

코드몽키님의 프로필 이미지
코드몽키

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

판다스(Pandas) 개요와 기본 API - 01

oof 질문 드립니다

해결된 질문

작성

·

847

0

oof (out of fold)가 무엇을 뜻하는지 잘 모르겠습니다

p.s  oof 가 밑에 있는 그림과 같이 Learn + Predict 부분을 합친 부분을 말하는 건가요?

정확히 잘 모르겠어서 질문 드립니다. 

답변 2

0

코드몽키님의 프로필 이미지
코드몽키
질문자

그렇군요 답변 감사합니다 ^^

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

OOF Prediction은 일반적으로 Cross validation기반의 Prediction을 지칭하는데 대략 2가지 유형이 있습니다. 

1. 첫번째는 강의의 4장 Stacking과 같은 유형입니다. 위에서 질문하신 그림이 Stacking에서 학습 데이터를 만드는 그림입니다. 

위 그림은 5 Fold 기반으로 개별 모델이 5회 번갈아 가면 4/5 학습 데이터로 학습하고, 1/5 학습 데이터로 예측하여 별도의 학습 데이터를 만듭니다. 그리고 이렇게 만들어진 학습 데이터를 다시 메타 모델이(아마도 Model 6) 학습하여 최종 예측 하는 방식입니다. 

2.   K-Fold로 학습을 수행 한 뒤 예측을  테스트 데이터에 K번 만큼 수행한 뒤 개별 예측값을 평균하여 최종 예측합니다(오버피팅을 최대한 회피하려는 나름의 방법입니다)

가령 5 Fold라고 하면 개별 모델이 5회 번갈아 가면서 4/5 학습 데이터로 학습합니다. 이렇게 학습된 모델을 이용하여 테스트 데이터로 예측을 수행하되 5번 Iteration하면서 학습 데이터를 변경하면서 학습하고 테스트 데이터로 예측값을 평균하여 최종 예측합니다.

아래는 위에서 말씀드린 부분을 Pseudo 코드로 작성한 것입니다.  맨 아래에 predictions += 가 된 이유는 evaluation이 ROC-AUC 이기 때문에 개별 예측값을 n_splits으로 나눈 후에 합치는 방식으로 계산 된 것입니다. 

num_folds = 11
folds = StratifiedKFold(n_splits=num_folds, shuffle=False, random_state=2319)
for fold_, (trn_idx, val_idx) in enumerate(folds.split(train.values, target.values)):
    trn_data = lgb.Dataset(train.iloc[trn_idx][fea], label=target.iloc[trn_idx])
    val_data = lgb.Dataset(train.iloc[val_idx][feat], label=target.iloc[val_idx])
    clf = lgb.train(param, trn_data, 1000, valid_sets = [trn_data, val_data])
    oof[val_idx] = clf.predict(train.iloc[val_idx][feat], num_iteration=clf.best_iteration)
    predictions += clf.predict(test[feat], num_iteration=clf.best_iteration) / folds.n_splits
코드몽키님의 프로필 이미지
코드몽키

작성한 질문수

질문하기