[머신러닝/딥러닝] 회귀예측 11 - 머신러닝 모델학습함수와 메서드 (partial, trials_dataframe(), optuna, k-fold)
오늘은 이번에 진행중인 회귀(Regressor)모델 학습시, 사용되었던 기법, 함수, 메서드 등의 개념정리를 해보려고 한다.
< 지난 포스팅 >
https://jayindustry.tistory.com/40
[머신러닝/딥러닝] 회귀예측 10 - 하이퍼파라미터튜닝2(optuna,kfold)/옵튜나,교차검증
오늘은 스태킹 앙상블에 쓰이는 각 모델을 하이퍼파라미터 튜닝을 진행하였다. 저번시간까지 하이퍼파라미터 튜닝을 진행하지 않은 5개의 모델로 예측하여 그 예측값들을 가지고 스태킹 앙상
jayindustry.tistory.com
< LightGBM 모델학습 하이퍼파라미터 + k fold 코드 >
[ 개요 ]
1. partial 함수
2. trials_dataframe()메서드
3. optuna
4. k- fold학습기법
5. create_study함수
[ 설명 ]
1. partial 함수
1) 개념
기존에 정의된 함수에 일부 특정 인자값을 미리 지정하여 새로운 함수를 만들어 낼 수 있는 함수이다.
2) 활용
GUI(graphical user interface) 애플리케이션에서 특정 버튼이 클릭될 때, 동일한 동작을 수행하는데 몇몇 파라미터만 다르게 적용되어야 할 경우 각 버튼에 대해 다른 함수를 만들지 않고 partial을 활용해 기존함수의 일부 인자만 바꿔 사용할 수 있다.
3) 주의
- partial을 사용할 땐, 원래 함수 인자 이름을 정확히 알고 있어야한다.
- partial로 생성된 함수는 원래 함수와는 다른 객체이므로, 원래 함수의 속성과 메소드를 그대로 사용할 수 없다.
4) 장점
- 비슷한 동작을 하는 여러 함수를 일일이 정의하지 않아도 되므로 코드의 중복을 줄일 있다.(코드 재사용성을 높인다.)
- 함수의 특정 인자값을 고정하는 목적이 명확히 드러난다. -> 코드의 가독성을 높여준다.
- 여러 설정이 반복되는 함수 호출에서 코드를 간결하게 만들어 줍니다.
5) 단점
- partial의 동작방식을 모르는 사람들은 코드를 이해하기 어렵다. (따라서 추가 주석설명 필요)
6) 예시코드 (Pythton)
def power(x, y):
return x**y
a = partial(power, y=2)
b = partial(power, y=3)
print(a(x=4)) # 결과 : 16
print(b(x=4)) # 결과 : 64
7) 내 코드에 적용
2. trials_dataframe()메서드
1) 개념
- Optuna의 'Study'객체 내에서 진행중인 모든실험(trial)의 정보와 결과를 Pandas DataFrame으로 반환한다.
- 하이퍼파라미터 값, 목적 함수 값, 상태 등의 정보를 한 눈에 쉽게 파악할 수 있다.
2) 활용
3) 출력 결과
위 사진은 XGBoost모델을 옵튜나로 하이퍼파라미터 탐색 출력결과이다.
붉게 박스처리된 부분이 옵튜나 실험결과를 알려주는 부분이다.
아래 RMSLE가 5회 나온 이유는 K fold횟수를 5로 설정하여,
데이터를 5분할하여 5회 학습하도록 설정하였기 때문이다.
4) 장점
- 실험의 결과와 설정을 한눈에 쉽게 확인할 수 있습니다.
- Pandas DataFrame이므로 데이터 분석 및 처리가 용이합니다.
3. Optuna
1) 개념
- Optuna는 최적의 하이퍼파라미터 값을 자동으로 찾아주는 도구(라이브러리)이다.
- 특정 파라미터의 범위값을 입력해주면, 해당범위에서 최대한 손실함수가 적은 파라미터값을 찾아준다.
2) 장점
- 다양한 최적화 알고리즘을 지원한다.
- 병렬처리, 분산환경 지원으로 대규모 실험을 빠르게 수행할 수 있다.
3) 단점
- 최적화 과정이 복잡한 경우, 설정과 실험에 많은 시간이 소요된다.
4) 내 코드 적용
n_estimators와 같은 parameter들의 범위를 50 ~ 1000처럼 지정하고,
손실함수를 최소화시키는 방향으로 최적의 수치를 찾게끔 설정하였다.
trials = 10회로 하여, 10번의 시도횟수를 설정하였다.
4. K-fold (from scikitlearn)
1) 개념
- 학습데이터를 K등분으로 나누고, 그 중 1파트를 검증용으로 사용하고,
나머지 파트들은 학습용으로 사용하는 교차검증방법이다.
- 예를 들어, K=5로 설정하면 아래처럼 데이터를 나누어, 총 5회 학습 및 검증한다.
2) 장점
- 모든 데이터 포인트가 한 번씩은 검증데이터로 사용되므로, 데이터활용도가 높아진다.
- 여러번의 자체 검증으로 모델의 일반화 성능을 추정할 수 있다.
- 과적합을 방지한다. K번의 다양한 학습/검증 데이터셋을 사용하므로 과적합을 감소시킨다.
3) 단점
- 계산 비용 : 모델을 K번 학습시키므로, 계산비용이 높다.
- 데이터 분포 : 데이터셋 분포가 균일하지 않다면, 일부 Fold에서 성능이 현저히 나빠질 수 있다.
-> 이럴 땐, Stratified K-Fold 교차 검증을 고려해볼 수 있다.
- 하지만 결국 한정된 데이터셋 안에서 학습하므로 과적합(오버피팅)을 피할 순 없다.
4) 활용 예시
- 데이터 부족한 경우, 모든 데이터를 더 효과적으로 활용하여 성능을 추정할 수 있다.
- 하이퍼파라미터 최적화 : Grid Search나 Random Search, 그리고 내가 진행중인 Optuna같은 방법들로 하이퍼파라미터 탐색할 때, 각 파라미터 조합의 성능을 평가하기 위하여 교차검증을 사용한다.
[ 내 코드에서 활용 ]
1. 설정값
K = 5 ,
Optuna Trials = 10
2. 설명
K fold횟수가 5회이므로 위의 K fold사진처럼 데이터셋을 5분할하여 validation data파트를 바꾸며 5회 학습하고,
그 싸이클을 1회로 하여 옵튜나로 총 10회 하이퍼파라미터를 탐색한다.
아래 사진은 LGBM모델을 옵튜나+k fold로 하이퍼파라미터 탐색하는 결과이다.
사진을 보면 5회(k fold) 각 학습마다 RMSLE(손실함수)값을 보여준다.
그게 끝나면 가장 손실함수가 적은 parameter세트를 보여주고,
그 손실함수 값이 얼마인지 보여준다.
[ 결과 ]
이렇게 LGBM, XGBoost, CatBoost 세 모델을 각각 하이퍼파라미터 튜닝한 결과를
RMSLE로 손실함수를 평가해보았다.
아직 스태킹 앙상블을 하지 않았는데
각각의 모델이 매우 높은 점수가 나왔다.
[ 고민 ]
저번 포스팅에서도 다뤘듯이 총 3개의 회귀모델을 하이퍼파라미터 튜닝을 하였다.
이제 튜닝한 세 개의 모델을 가지고 스태킹 앙상블을 해보려고 한다.
그 후, 여기에 AdaBoost, Ridge, KNN 등의 예측모델들을 추가해보고 결과를 비교해보려고한다.
3개의 모델로 스태킹 앙상블 vs 4~5개의 모델로 스태킹앙상블
모델학습 예측결과는 과학실험과 비슷하기에..!
많은 모델을 사용한다고 무조건 결과가 좋은 것은 아니다.
결국 가능한 많은 경우의 수를 실험 및 탐색으로 다뤄보고 비교해보려고한다.