오답노트

머신러닝 모델 관련 (GradientBoosting) 본문

머신러닝, 딥러닝

머신러닝 모델 관련 (GradientBoosting)

장비 정 2021. 4. 13. 14:08

결정트리의 앙상블을 이용한 머신러닝의 부스팅 기법 중 하나이다.

부스팅이란 약한 예측기 (정확도가 랜덤 예측기보다 조금 더 높은) 를 여러개 연결하여 강한 예측기 (정확도가 훨씨 높다) 를 만드는 방법이다.

 

앙상블 학습 기법에는 학습을 시킬 때 전체 예측기가 같은 데이터셋을 반복적으로 사용할지 (배깅) 와 데이터셋을 각 예측기 별로 나눠서 학습시킬지 (페이스팅) 이 존재한다.

 

그래디언트 부스팅은 다른 앙상블의 방법처럼 모든 예측기를 한 번에 학습을 시키는 것이 아니라 하나의 예측기부터 순차적으로 추론을 진행한다. 이 때, 앞의 예측기에서 발생한 오차를 수정 및 보완한 후 다음 예측기로 넘어가는 식이다.

 

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