우당탕탕 개발일지

[대기오염 예측모델 개발] XGBoost 모델을 사용하여 다중 클래스 분류 문제를 해결 본문

인공지능

[대기오염 예측모델 개발] XGBoost 모델을 사용하여 다중 클래스 분류 문제를 해결

민아당긴아 2024. 10. 4. 13:45

XGBoost 모델이란?

위 영상이 그라디언트 부스팅에 대해 이해하기 쉬워서 좋았다.

- 각 이터레이션(반복)에서 맞추지 못한 데이터에 가중치를 부여해서 모델을 학습

- 부스팅(Boosting) 계열의 트리 모델

- 그라디언트 부스팅 모델에 비해 빠른 속도

- 과적합을 막고, 자체 교차 검증 알고리즘과 결측치 처리 기능 보유

 

XGBoost의 대표적인 파라미터

  • n_estimators (int) : 내부에서 생성할 결정 트리의 개수
  • max_depth (int) : 생성할 결정 트리의 높이
  • learning_rate (float) : 훈련량, 학습 시 모델을 얼마나 업데이트할지 결정하는 값
  • colsample_bytree (float) : 열 샘플링에 사용하는 비율
  • subsample (float) : 행 샘플링에 사용하는 비율
  • reg_alpha (float) : L1 정규화 계수
  • reg_lambda (float) : L2 정규화 계수
  • booster (str) : 부스팅 방법 (gblinear / gbtree / dart)
  • random_state (int) : 내부적으로 사용되는 난수값
  • n_jobs (int) : 병렬처리에 사용할 CPU 수

XGBoost 파이썬 코드

1. 회귀 문제에서의 XGBoost

from xgboost import XGBClassifier

# XGBoost 모델 선언
xgbc = XGBClassifier
xgbc.fit(X_train, Y_train)

y_pred = xgbc.predict(x_valid)

2. 분류 문제에서의 XGBoost

from xgboost import XGBRegressor

# XGBoost 모델 선언
xgbr = XGBRegressor
xgbr.fit(X_train, Y_train)

y_pred = xgbr.predict(x_valid)

 

대기오염 데이터 XGBoost 모델 훈련

X = df.drop(columns=['ID', 'gu', 'address', 'a_d_classification', 'Y']).to_numpy()
y = df['Y']

X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size = 0.2, random_state = 42)

먼저 불필요한 열을 제거해주고, train_test_split을 통해 훈련 세트와 검증 세트를 나눈다.

y_train -= 1
xgb = XGBClassifier(tree_method='hist', random_state=42)
scores = cross_validate(xgb, X_train, y_train, return_train_score=True)
xgb.fit(X_train, y_train)  # 학습 데이터를 이용해 모델 학습
y_train += 1

# 모델 저장
with open('xgb_model.pkl', 'wb') as file:
    pickle.dump(xgb, file)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))
print(y_train)

그 다음에 XGBClassifier를 이용해서 학습을 진행해준다. 

교차 검증을 통해 훈련 데이터 점수 도출한다.

왜인지 모르겠지만 y_train이 1, 2, 3일 때 학습이 안되길래 0, 1, 2로 바꿔주고 학습 후 다시 1, 2, 3으로 바꿔줬다.

모델을 저장하고, 테스트 데이터에 대해서 다시 수행한다.

 

XGBoost로 예측

# 모델 불러오기
with open('xgb_model.pkl', 'rb') as file:
    loaded_model = pickle.load(file)

# 새로운 테스트 데이터 예측
y_pred = loaded_model.predict(X_test)
y_pred += 1
# 예측 결과 확인
print(y_pred)

끝!