https://steadiness-193.tistory.com/286
위 포스팅에서 전처리 완료한 데이터를 이용하되, 위 포스팅에선 일부 행을 삭제했지만
지금은 그대로 다 이용한다.
임시로 정답지가 있는 tmp_x_test와 tmp_y_test 데이터셋을 분리해두자
점수 측정은 f1 score를 이용한다.
OOF Ensemble
https://steadiness-193.tistory.com/290
우선 라벨 후처리를 하기 전에,
위 포스팅에서 해본 oof 앙상블을 위한 oof_pred를 만드는 과정을 살펴보자.
여기서 np.argmax가 아닌 oof_pred를 predict_proba한 것에
임의의 실수보다 큰 지 필터링하는 조건을 넣어본다.
점수가 조금 올라갔다.
앞의 10개 행만 추출해, 차근차근 살펴보자
predict_proba를 하게되면 각 라벨을 예측할 확률을 받아낼 수 있다.
여기서 그 확률값이 0.43보다 크냐는 조건을 넣고 이를 정수형으로 바꿔주면
False는 0, True는 1로 바뀌게 된다.
이렇게 얻은 값을 임시로 빼둔 정답지(tmp_y_test)와 비교해서 점수를 내는 것이다.
라벨 후처리는 여기서 임의의 실수인 threshold를 찾아내는 작업이라고 할 수 있다.
Label Postprocessing
전체 train 셋에 대해서도 라벨을 모아, k-fold를 활용해서 train 라벨에서 가장 좋은 thrshold 값을 찾음
y_true(정답), y_prob(예측 확률) 값으로 최적 threshold 값을 찾음
threshold 를 0.01 단위로 0부터 1까지 값을 변경해가면서 평가
그 중 가장 높은 평가 지표를 갖는 threshold를 여러 번 모아 평균을 내어 그 값으로 라벨 생성 최적화
라벨 후처리는 이진 분류에서 쓰인다.
oof_train
oof_train은 전체 데이터셋에 대한 predict_proba한 값이다.
KFold한 횟수만큼 나눠준 값을 다 더한 것이다.
_, X_data, _ = preprocess(data.iloc[trn_idx, :], tmp_X_data, tmp_X_test)
위 코드는 clf가 학습한 기준으로
다시 전처리 완료된 전체 데이터셋 (tmp_X_data)를 X_data로 받아내는 것이다.
clf 가 X_train으로 학습했으니 data.iloc[trn_idx, :]로 똑같이 전처리를 해줘야 하는 것이다.
전체 데이터셋이 아닌 나머지는 _를 이용해 날려준다.
그러면 이렇게 전체 데이터셋의 행과 라벨의 개수만큼 열로 구성된 배열을 얻을 수 있다.
thresholds search
위 함수도 예를 들어 차근히 보자
y_prob인 oof_train[:, 1]에 임의의 threshold인 0.5를 비교조건으로 넣은 뒤 정수형으로 바꿔준다.
이를 y_true인 tmp_y_data (임시로 빼둔 정답지)와 비교하면
threshold가 0.5일때의 f1 score를 얻을 수 있다.
y_true와 y_prob을 input으로 받아, 0.01씩 threshold를 올려가며 f1 score를 측정한 배열을 만든다.
0.01씩 threshold를 올려가며 얻어낸 f1 score 배열이다.
가장 좋은 점수는 0.9033..이며 이때의 threshold는 0.35이다.
이를 여러 번 반복해서 구한 best threshold를 평균 내어 final threshold를 구하면 된다.
여러 번 반복, scoring
함수를 정의하기 전에 RepeatedStratifiedKFold를 미리 알고가야한다.
정말 간단하게 StratifiedKFold를 n_repeats 횟수 만큼 반복해서 진행하는 것으로 이해하면 된다.
5겹의 StratifiedKFold를 10번 반복하면 총 50번을 검증하는 셈이다.
split하는 부분이 조금 헷갈리는데
y_true를 두번 넣는 이유는 split(data, label)을 생각해보면 된다.
y_true를 k겹 나누는데 정답의 비율도 유지하면서 진행하기 위해서이다.
그 이후 과정은 아래 그림과 같다.
취소선 표시된 125행은 쓰이지 않는다.
어차피 50번 검증하니 모든 데이터셋을 다 돌 것이다.
이렇게 RepeatedStratifiedKFold로 반복해서 나뉘어진 y_true_train과 y_prob_train을
위에서 만든 thresholds_search 함수에 넣으면
best_score와 best_th를 리턴 받을 수 있다.
best_score와 best_th를
50개를 모을 수 있는 빈 리스트인 scores와 th에 계속 쌓아둔다.
그 리스트의 평균을 낸 final_score와 final_ths를 반환 받으면 된다.
thresholds search 와 scoring 함수 합치기
함수 실행
final_ths 값은 주석에 설명된 것과 같이 random_state 설정을 일부러 하지 않아,
반복성과 랜덤성을 주었기에 값이 조금씩 달라질 수 있다.
결과 비교
단순히 argmax를 이용한 것보단 점수가 높았지만,
조금 의아하게도 임의로 정해준 0.43으로 threshold를 설정했을 때의 점수가 더 좋게 나왔다.
'Machine Learning > 모델 튜닝(Model Tuning)' 카테고리의 다른 글
Model Tuning - Stacking : 실전 적용 (1) | 2020.10.04 |
---|---|
Model Tuning - Stacking (스태킹_CV 기반) (0) | 2020.10.04 |
Model Tuning - Label Postprocessing : 실전 적용 (0) | 2020.10.02 |