오늘은 지난 회귀예측프로젝트를 이어서, 학습시킨 모델을 하이퍼파라미터 튜닝해보았다.
지난 포스팅에서 학습시킨 앙상블모델에 대해
손실함수 값을 더 낮추기 위해 수차례 피쳐엔지니어링을 진행하였다.
주어진 학습데이터 중에서 예측 타겟밸류와 상관성이 없거나,
상관성이 높을만한 피쳐를 추가적으로 생성하였다.
< 지난 포스팅 >
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함수"
등의 메서드와 함수들에 대해서도 자세히 다뤄볼 계획이다.
'AI > ML DL' 카테고리의 다른 글
| [머신러닝/딥러닝] 회귀예측 11 - 머신러닝 모델학습함수와 메서드 (partial, trials_dataframe(), optuna, k-fold) (0) | 2023.09.28 |
|---|---|
| [머신러닝/딥러닝] 회귀예측 10 - 하이퍼파라미터튜닝2(optuna,kfold)/옵튜나,교차검증 (0) | 2023.09.26 |
| [머신러닝/딥러닝] 회귀예측 8 - 3차 피쳐엔지니어링 (0) | 2023.09.22 |
| [머신러닝/딥러닝] 회귀예측 7 - 2차 피쳐엔지니어링 (0) | 2023.09.21 |
| [머신러닝/딥러닝] 머신러닝으로 비트코인 가격 예측하기(텐서플로우) (0) | 2023.09.20 |