XGBoost 모델 생성 및 하이퍼파라미터 튜닝
- XGBoost 모델 생성: xgb.XGBRegressor를 사용하여 XGBoost 회귀 모델을 생성합니다. objective='reg:squarederror'는 회귀 문제를 다루기 위한 목적 함수로 설정합니다.
- 하이퍼파라미터 그리드 설정: param_grid에 탐색할 하이퍼파라미터들을 지정합니다.
- GridSearchCV를 사용한 하이퍼파라미터 튜닝: GridSearchCV를 사용하여 최적의 하이퍼파라미터를 탐색합니다. cv=3은 3-fold cross-validation을 사용함을 의미하며, scoring='r2'는 평가 지표로 R^2를 사용합니다.
# XGBoost 모델 생성
model = xgb.XGBRegressor(objective='reg:squarederror', random_state=42)
# 하이퍼파라미터 그리드 설정
param_grid = {
'n_estimators': [100, 200, 300],
'learning_rate': [0.01, 0.05, 0.1],
'max_depth': [3, 6, 9],
'subsample': [0.8, 0.9, 1.0],
'colsample_bytree': [0.8, 0.9, 1.0]
}
위의 코드에서 사용된 각 하이퍼파라미터들에 대해 설명해드리겠습니다.
- n_estimators:
- 의미: 트리의 개수를 나타내며, XGBoost 모델이 생성할 결정 트리의 개수입니다.
- 설정 값: [100, 200, 300]
- 설명: 모델이 학습하는 트리의 수가 많을수록 복잡성이 증가할 수 있으며, 일반적으로 성능이 향상될 수 있습니다. 하지만 너무 많은 트리는 과적합(overfitting) 문제를 초래할 수 있습니다.
- learning_rate:
- 의미: 각 트리가 기존 트리의 오차를 보정하는 정도를 조절하는 파라미터입니다.
- 설정 값: [0.01, 0.05, 0.1]
- 설명: 학습 단계마다 가중치를 조절하여 모델의 학습 속도를 조절합니다. 보통 learning rate가 작을수록 학습이 안정적이지만, 적절히 크게 설정해야 모델이 적절한 수렴 속도를 가질 수 있습니다.
- max_depth:
- 의미: 트리의 최대 깊이를 제한하는 파라미터입니다.
- 설정 값: [3, 6, 9]
- 설명: 트리의 최대 깊이가 깊을수록 모델의 복잡성이 증가합니다. 깊이가 깊을수록 학습 데이터에 대해 더 정교하게 학습할 수 있지만, 너무 깊으면 과적합이 발생할 수 있습니다.
- subsample:
- 의미: 각 트리를 학습할 때 사용하는 데이터 샘플의 비율입니다.
- 설정 값: [0.8, 0.9, 1.0]
- 설명: 각 트리가 학습할 때 사용할 데이터의 일부를 무작위로 선택하여 과적합을 줄이는 데 도움을 줍니다. 일반적으로 1.0으로 설정하면 모든 데이터를 사용하며, 이는 부스트링(Boosting) 과정에서 모든 데이터가 동일한 중요도를 갖도록 합니다.
- colsample_bytree:
- 의미: 각 트리를 학습할 때 사용하는 특성(feature)의 비율입니다.
- 설정 값: [0.8, 0.9, 1.0]
- 설명: 각 트리를 학습할 때 무작위로 선택된 특성의 비율을 나타냅니다. 이는 트리가 각 노드에서 사용할 특성의 다양성을 높이며, 과적합을 줄이는 데 도움을 줍니다.
이러한 하이퍼파라미터들은 모두 XGBoost 모델의 성능과 학습 속도에 중요한 영향을 미칩니다. GridSearchCV를 사용하여 이들 파라미터의 최적 조합을 찾는 것은 모델의 성능을 극대화하고 과적합을 방지하는 데 중요한 역할을 합니다.
# GridSearchCV를 사용한 하이퍼파라미터 튜닝
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, n_jobs=-1, scoring='r2', verbose=2)
grid_search.fit(X_train, y_train)
# 최적의 하이퍼파라미터 출력
print("Best parameters found: ", grid_search.best_params_)
위 코드는 GridSearchCV를 사용하여 XGBoost 모델의 하이퍼파라미터를 튜닝하는 과정을 나타냅니다. 각 파라미터에 대한 설명은 이전에 이미 다루었기 때문에, GridSearchCV의 역할과 매개변수들에 대해 자세히 설명하겠습니다.
GridSearchCV란?
GridSearchCV는 Scikit-learn 라이브러리에서 제공하는 모델의 최적 하이퍼파라미터를 찾기 위한 기법 중 하나입니다. 주어진 매개변수 그리드(param_grid)에 대해 교차 검증(cross-validation)을 사용하여 모델을 여러 번 학습하고 검증합니다. 이를 통해 최적의 하이퍼파라미터 조합을 찾습니다.
주요 매개변수 설명:
- estimator: 최적화할 모델이 들어가는 자리입니다. 여기서는 XGBoost 모델(model)이 들어갑니다.
- param_grid: 탐색할 하이퍼파라미터들을 딕셔너리 형태로 지정합니다. 각 하이퍼파라미터에 대해 여러 후보 값을 리스트로 지정합니다.
- cv: 교차 검증을 위해 데이터를 몇 개의 fold로 나눌지를 결정합니다. 여기서는 3-fold cross-validation을 사용하였습니다.
- n_jobs: 병렬 처리를 위한 CPU 코어 개수입니다. -1로 설정하면 가능한 모든 코어를 사용합니다.
- scoring: 모델의 성능을 평가하는 데 사용할 지표입니다. 여기서는 R^2 스코어를 사용하여 최적의 하이퍼파라미터를 찾습니다.
- verbose: 실행 과정을 얼마나 자세하게 출력할지 결정합니다. 숫자가 클수록 더 자세히 출력됩니다.
동작 과정:
- GridSearchCV는 주어진 param_grid의 모든 조합에 대해 모델을 학습하고 교차 검증을 수행합니다.
- 각 조합에 대해 지정된 평가 지표(scoring)를 기준으로 모델을 평가합니다.
- 최적의 하이퍼파라미터 조합을 찾기 위해 교차 검증의 평균 성능이 가장 높은 조합을 선택합니다.
결과:
- grid_search.fit(X_train, y_train)를 실행하면, 최적의 하이퍼파라미터 조합을 찾은 GridSearchCV 객체가 반환됩니다.
- grid_search.best_params_를 통해 최적의 하이퍼파라미터 조합을 출력할 수 있습니다.
- grid_search.best_estimator_는 최적의 하이퍼파라미터로 튜닝된 모델 객체를 반환합니다.
이 과정을 통해 최적의 모델을 구축하고, 이후 테스트 데이터로 모델을 평가하거나 예측에 활용할 수 있습니다.
로그변환
로그 변환은 데이터 분석에서 종종 사용되는 기법으로, 주로 데이터의 분포를 조정하거나 모델이 더 나은 성능을 발휘할 수 있도록 돕습니다. 특히, 주어진 데이터의 스케일이 크거나 한 쪽으로 치우친 경우에 유용합니다.
np.log1p() 함수 설명:
- 로그 변환 적용: np.log1p() 함수는 주어진 값에 대해 자연로그(밑이 e인 로그)를 취합니다.
- 값의 범위: 이 함수는 0보다 큰 값을 가진 모든 데이터에 대해 안정적으로 작동합니다. 0이거나 음수인 경우는 처리하지 않습니다.
- 1을 더해줌: 변환된 결과에 1을 더해줌으로써, 0일 때의 문제를 회피합니다. 이는 값이 0일 경우에도 안전하게 로그를 계산할 수 있도록 합니다.
모델 학습과 예측 과정에서의 적용:
- 학습 데이터 준비:
- y_log = np.log1p(y): 주어진 목표 변수 y에 np.log1p() 함수를 적용하여 로그 변환된 y_log를 생성합니다. 이렇게 변환된 y_log를 사용하여 모델을 학습합니다.
- 모델 학습:
- best_model.fit(X_train, y_train_log): 변환된 y_log를 사용하여 XGBoost 모델을 학습합니다.
- 예측값 준비:
- y_pred_log = best_model.predict(X_test): 학습된 모델을 사용하여 테스트 데이터에 대한 예측값 y_pred_log를 계산합니다. 이 예측값은 로그 변환된 형태입니다.
- 역변환:
- y_pred = np.expm1(y_pred_log): 최종 예측값을 계산하기 전에 np.expm1() 함수를 사용하여 y_pred_log를 원래 스케일로 역변환합니다. 이는 로그 변환된 값을 원래의 데이터 단위로 되돌리는 과정입니다.
왜 로그 변환을 사용하는가?
- 데이터 스케일 조정: 데이터의 스케일을 조정하여 모델이 더 잘 수렴하고 예측 성능을 향상시킵니다.
- 정규분포 근사: 로그 변환을 적용하면 데이터가 정규분포에 더 가깝게 되어 일반적인 선형 모델이나 회귀 모델이 더 잘 작동할 수 있습니다.
- 오차 구조 개선: 변환을 통해 오차 구조가 균일해지므로 모델이 예측을 더 정확하게 할 수 있습니다.
이와 같이 로그 변환은 데이터의 성질에 따라 다양한 장점을 제공하며, 모델의 성능을 개선하는 중요한 전처리 기법 중 하나입니다.
음수나 0이 포함된 경우에는 로그 변환이 직접적으로 적용되지 않습니다. 일반적으로 로그 변환은 양수 데이터에 대해서만 수행할 수 있습니다. 이 경우에는 양수 데이터만을 대상으로 로그 변환을 적용한 후, 예측값과 평가를 수행하게 됩니다. 다만, 음수나 0이 포함되어 있는 데이터를 로그 변환하려고 하면 에러가 발생할 수 있습니다.
따라서 주간 매출 데이터에 음수나 0이 포함되어 있는 경우에는 해당 데이터를 변환할 수 있는 다른 방법을 고려해야 합니다
'심화프로젝트' 카테고리의 다른 글
심화프로젝트 5일차 (0) | 2024.06.21 |
---|---|
심화프로젝트 4일차 TIL (0) | 2024.06.20 |
심화프로젝트 2일차 -TIL (0) | 2024.06.18 |
심화프로젝트 TIL 1일차 (0) | 2024.06.17 |