오답노트
머신러닝 모델 관련 (GradientBoosting) 본문
결정트리의 앙상블을 이용한 머신러닝의 부스팅 기법 중 하나이다.
부스팅이란 약한 예측기 (정확도가 랜덤 예측기보다 조금 더 높은) 를 여러개 연결하여 강한 예측기 (정확도가 훨씨 높다) 를 만드는 방법이다.
앙상블 학습 기법에는 학습을 시킬 때 전체 예측기가 같은 데이터셋을 반복적으로 사용할지 (배깅) 와 데이터셋을 각 예측기 별로 나눠서 학습시킬지 (페이스팅) 이 존재한다.
그래디언트 부스팅은 다른 앙상블의 방법처럼 모든 예측기를 한 번에 학습을 시키는 것이 아니라 하나의 예측기부터 순차적으로 추론을 진행한다. 이 때, 앞의 예측기에서 발생한 오차를 수정 및 보완한 후 다음 예측기로 넘어가는 식이다.
from sklearn.tree import DecisionTreeRegressor
tree_reg1 = DecisionTreeRegressor(max_depth = 2)
tree_reg1.fit(X, y) # 모델을 학습시킨다 (X, y 는 임의의 데이터라고 가정)
y2 = y - tree_reg1.predict(X) # 첫 번째 예측기의 예측값을 사용
tree_reg2 = DecisionTreeRegressor(max_depth = 2)
tree.reg2.fit(X, y2) # 예측기에서 수정 된 예측값을 훈련
y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth = 2)
tree_reg3.fit(X, y3)
y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3)
위의 코드는 3개의 예측모델 (여기서는 DecisionTree 를 사용했다) 를 엮어 만든 앙상블 모델이다.
위 모델에서는 learning_rate 가 중요한 매개변수로 사용이 되는데, 일반적으로 learning_rate 가 작을수록 더 많은 예측기가 필요하지만 그만큼 성능이 좋아진다. 이것을 축소(shrinkage) 규제라고 부른다.
learning_rate 의 수에 비해 예측기가 너무 적으면 제대로 학습이 일어나지 않고, 예측기가 너무 많으면 과적합이 발생할 수 있어 이를 적절하게 조절하는 것이 필요하다.
과적합 방지를 위해서는 케라스에서 사용하는 early_stopping 방식도 이용할 수 있고 (물론 사용 방법은 많이 다르다), 우선 훈련을 전부 시킨 다음에 최적의 모델 갯수를 구하는 방법도 쓸 수 있다.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
x_train, x_val, y_trian, y_val = train_test_split(x, y)
gbrt = GradientBoostingRegressor(max_depth = 2, n_estimatores = 120) # 훈련을 우선 전부 실시한다
gbrt.fit(x_train, y_train)
errors = [mean_squared_error(y_val, y_pred)
for y_pred in gbrt.staged_predict(x_val)]
bst_n_estimators = np.argmin(errors) + 1
gbrt_best = GradientBoostingRegressor(max_depth = 2, n_estimators = bst_n_estimators)
gbrt_best.fit(x_train, y_train) # 최적의 갯수로 다시 훈련한다
위 방법은 우선 훈련을 전부 완료한 뒤 거기서 나왔던 오차가 가장 낮았던 부분을 구해 다시 훈련을 진행한다.
gbrt = GradientBoostingRegressor(max_depth = 2, warm_start = True)
# warm_start = True 이면 fit() 할 때 기존의 트리 (모델) 을 유지하고 훈련을 추가할 수 있다.
min_val_error = float("inf")
error_going_up = 0
for n_estimators in range(1, 120):
gbrt.n_estimators = n_estimators
gbrt.fit(x_train, y_train)
y_pred = gbrt.predict(x_val)
val_error = mean_squared_error(y_val, y_pred)
if _val_error < min_val_error:
min_val_error = val_error
error_going_up = 0
else:
error_going_up += 1
if error_going_up == 5: # error 가 5번 수정 되지 않으면 종료
break # 종료
위의 방법은 케라스의 early stopping 과 같은 방법이다.
손실오차가 작아질수록 계속 수정이 되고, 손실오차가 작아지지 않으면 반영이 되질 않는데, 이 손실오차가 다섯번 작아지지 않으면 훈련을 종료 시키는 방법이다.
출처 : 핸즈 온 머신러닝
'머신러닝, 딥러닝' 카테고리의 다른 글
yolo loss (IoU) (0) | 2021.05.17 |
---|---|
[yolov5] Yolo 모델 설명 (0) | 2021.05.17 |
머신러닝 모델 관련 (SVC) (0) | 2021.04.13 |
HMM (Hidden Markov Model) - 은닉 마르코프 모형 (0) | 2021.03.29 |
one_hot_encoding (0) | 2021.03.25 |