njs03332 / ml_study

3 stars 0 forks source link

2022/08/04~2022/08/10 #38

Open danbi5228 opened 2 years ago

danbi5228 commented 2 years ago

image

njs03332 commented 2 years ago

7.5.2 그레이디언트 부스팅

잡음이 섞인 2차 곡선 형태의 훈련세트에 학습시킴

tree_reg1 = DecisionTreeRegressor(max_depth=2) tree_reg1.fit(X, y)

첫 번째 예측기에서 생긴 잔여 오차에 두 번째 DecisionTreeRegressor를 훈련시킴

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))


![image](https://user-images.githubusercontent.com/37107740/183825387-0243b765-bcdb-46a9-852f-dc022713da74.png)

- 왼쪽 열은 세 트리의 예측, 오른쪽 열은 앙상블의 예측
  - 트리가 앙상블에 추가될수록 앙상블의 예측이 점차 좋아짐
- 사이킷런의 GradientBoostingRegressor를 이용한 GBRT 앙상블 훈련
  - 앙상블의 훈련을 제어하는 매개변수 (n_estimators), 결정 트리의 성장을 제어하는 매개변수 (max_depth, min_samples_leaf)
```python
from sklearn.ensemble import GradientBoostingRegressor

gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0)
gbrt.fit(X, y)
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

X_train, X_val, y_train, y_val = train_test_split(X, y)

gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=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)

image

gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True)

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:
            break
import xgboost

xgb_reg = xgboost.SGBRegressor()
xgb_reg.fit(X_train, y_train)
y_pred = xgb_reg.predict(X_val)

# 자동 조기 종료 기능 제공
xgb_reg.fit(X_train, y_train, 
                    eval_set[(X_val, y_val)], early_stopping_rounds=2)
y_pred = xgb_reg.predict(X_val)
givitallugot commented 2 years ago

7.6 스태킹

스태킹 작동 방법

참고

danbi5228 commented 2 years ago

7.5 부스팅

7.5.1 에이다부스트

가중치 업데이트 규칙

사이킷런 AdaBoostClassifier 기반 코드

from sklearn.ensemble import AdaBoostClassifier

# 200개 결정트리
# max_depth=1인 결정 트리 - 1 결정트리가 결정 노드 하나와 리프노드 2개로 이루어짐
ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=1), n_estimators=200,
    algorithm="SAMME.R", learning_rate=0.5)
ada_clf.fit(X_train, y_train)