본문 바로가기

Machine Learning/모델 튜닝(Model Tuning)

Model Tuning - Label Postprocessing (라벨 후처리)

반응형

https://steadiness-193.tistory.com/286

 

Validation - KFold

www.kaggle.com/c/titanic/data Titanic: Machine Learning from Disaster Start here! Predict survival on the Titanic and get familiar with ML basics www.kaggle.com 캐글의 타이타닉으로 연습한다. 전처리..

steadiness-193.tistory.com

위 포스팅에서 전처리 완료한 데이터를 이용하되, 위 포스팅에선 일부 행을 삭제했지만

 

지금은 그대로 다 이용한다.

 

 

임시로 정답지가 있는 tmp_x_test와 tmp_y_test 데이터셋을 분리해두자

 

점수 측정은 f1 score를 이용한다.

 

 

 

 

OOF Ensemble

 

https://steadiness-193.tistory.com/290

 

Validation - OOF Ensemble (Out-of-Fold)

https://steadiness-193.tistory.com/286 Validation - KFold www.kaggle.com/c/titanic/data Titanic: Machine Learning from Disaster Start here! Predict survival on the Titanic and get familiar with ML b..

steadiness-193.tistory.com

 

우선 라벨 후처리를 하기 전에,

 

위 포스팅에서 해본 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를 설정했을 때의 점수가 더 좋게 나왔다.

 

 

반응형