오늘은 지난 회귀예측프로젝트를 이어서, 학습시킨 모델을 하이퍼파라미터 튜닝해보았다.

 

지난 포스팅에서 학습시킨 앙상블모델에 대해

손실함수 값을 더 낮추기 위해 수차례 피쳐엔지니어링을 진행하였다.

 

주어진 학습데이터 중에서 예측 타겟밸류와 상관성이 없거나,

상관성이 높을만한 피쳐를 추가적으로 생성하였다.

 

 

< 지난 포스팅 >

https://jayindustry.tistory.com/37

 

[머신러닝/딥러닝] 회귀예측 8 - 3차 피쳐엔지니어링

오늘은 저번시간에 이어 3차 피쳐엔지니어링과 더불어 메타모델(최종모델)의 하이퍼파라미터 튜닝을 해보겠다. 지난 포스팅에서는 2차 피쳐엔지니어링을 진행하였고 1차와 비교했을때 오차점

jayindustry.tistory.com

 

 

 

 

[ 개요 ] 

1. 모델들의 예측값들을 모아 스태킹앙상블의 학습데이터셋으로 만든다.

2. 함수생성 : 옵튜나 라이브러리로 하이퍼파라미터 튜닝 + kfold로 교차검증학습
: 함수를 실행하면 k회 만큼 학습시키며 지속적으로 최상의 하이퍼파라미터를 찾아나간다.

3. 손실함수가 가장 적은 최상의 하이퍼파라미터 조합을 찾는다.

4. 해당 파라미터로 다시 모델학습한다.

5. 해당 모델로 최종평가한다.

 

 

 

 

[ 코드 ]

 

n_estimators : 모델이 사용할 트리의 수 (50 ~ 1000사이의 정수범위에서 찾는다)
max_depth : 트리의 최대 깊이 값
 learning_rate : 학습률
num_leaves : 트리의 잎 수
min_data_in_leaf : 각 잎에서의 최소 데이터 수

 

적은 수치값의 범위 내에서 최상의 파라미터를 서칭한다.

 

 

 

k = 15는 전체 데이터셋을 15등분하여, 14는 train set, 1은 val set으로 사용한다.

14로 학습시키고 1로 검증하며 모델을 학습시키는 것.

 

그럼 1만큼의 val이 15가지의 경우의 수로 달라지며 학습시킬 수 있으니,

같은 학습데이터셋으로 총 15번을 학습시켜, 모델성능의 일반화가 가능해진다.

 

정리하자면, K-fold 교차검증으로 학습하면

데이터분포나 순서에 대한 의존을 방지,

모델성능의 변동성을 줄여서 모델성능이 좀 더 일반화가 가능하다.

 

하지만 연산비용이 높고,

이마저도 같은 데이터셋 안에서 학습하는 것이니

과적합이 발생할 수 있다.

 

 

위처럼 열심히 best params 조합을 찾아나가며,

손실함수를 최대한 최소값으로 나아가게 조정했으니, 

마지막에 with value 값이 낮을수록 좋은성능이다.

 

 

함수실행을 마치면 위 코드를 실행하여,

value값이 가장 좋은(여기선 최소값) params조합을 찾는다.

 

해당 best params로 meta_model(앙상블 모델)을 학습시킨다.

 

 

 

 

 

[ 파이프라인 정리 ]

먼저 stack_train과 y_train을 사용하여 교차 검증을 통해 모델을 학습하고 평가하면서 최적의 하이퍼파라미터 조합을 찾는다. 최적의 하이퍼파라미터를 찾은 후에 이를 사용하여 전체 데이터(stack_train과 y_train)로 최종 모델을 학습시키는 절차.

 

 

 

 

[ 최종 평가 ]

RMSLE로 최종평가한다.

 

띠옹.. 점수가 거의 변화가 없다.

 

지난 포스팅에서 피쳐엔지니어링만 했을때보다 스코어가 0.0003점 정도밖에 차이나지 않는다.

 

이유가 뭘까?

 

 

 

[ 고민 ]

점수변화가 거의 없는 원인을 파악해보자. 

 

1. 이미 성능이 좋은것?

기본 모델들의 성능이 이미 매우 좋다면, 성능차이가 별로 없을 수 있다.
하지만 각 모델들을 하이퍼파라미터 튜닝을 하지 않은상태에서 스태킹앙상블을 했기에, 이건 아닌것같다. 

2. 스태킹앙상블의 특징

스태킹 앙상블의 핵심 각 모델의 예측값을 결합하여 오차를 줄이는 것이다. 즉, 메타모델의 학습데이터 컬럼들이 모두 예측값들을 모아둔 것이다. 그래서 컬럼들간의 패턴의 오차가 적어서 그럴 수 있겠다고 생각했다.

3. 하이퍼파라미터의 범위

Optuna의 하이퍼파라미터 서칭 범위가 잘못되었거나 Kfold의 k수치가 optuna의 서칭범위와 알맞지 않을 수 있다고 생각했다.

4. 데이터의 한계: 사용되는 학습 데이터 자체에 노이즈가 많아 그럴 수 있다고 생각했다.

즉, 2번과 비슷한 이유인데, 특성(feature)이 타겟 변수를 설명하는 데 부족할 경우라고 생각했다.

 

 

 

 

[ 개선할 점 ]

k횟수를 높여도 별차이가 없었다.

해당 코드의 시도횟수 n_trials를 높여도 별 차이점이 없었기에,

 

앙상블 모델에 하이퍼파라미터 튜닝을 하는 것이 아닌,

앙상블 이전에 각 모델들을 각각 하이퍼파라미터 튜닝을하고

앙상블을 해야겠다고 생각했다.

 

이후 포스팅에선 각 모델을 하이퍼파라미터 튜닝하는 코딩을 해볼 것이다.

추가적으로 코드에 사용된

 

"partial, trials_dataframe()메서드,optuna,kfold학습법, create_study함수"

 

등의 메서드와 함수들에 대해서도 자세히 다뤄볼 계획이다.

+ Recent posts