7-5. 부스팅(Boosting) - 그레이디언트 부스팅(Gradient Boosting)

2021. 5. 12. 17:35Machine Learning

그레이디언트 부스팅

출처 : docs.paperspace.com/machine-learning/wiki/gradient-boosting

 

그레이디언트 부스팅(Gradient Boosting)이란 이전 예측기가 만든 잔여 오차(Residual Error)

 

새로운 예측기를 학습시키는 기법이다. 

 

    X = 2*np.random.randn(100,1)
    y = 2 * X ** 2 + X * 4 + 10 + np.random.randn(100, 1)

노이즈가 섞인 2차 다항식을 결정 트리로 추정하는 모델에 그레이디언트 부스팅을 적용해보겠다. 

 

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

가장 먼저 기초적인 결정 트리를 훈련시켰다. 

 

    y2 = y - tree_reg1.predict(X)[:, None] #2차원 열벡터화 (결정트리는 1차원 행벡터를 반환)
    tree_reg2 = DecisionTreeRegressor(max_depth=2)
    tree_reg2.fit(X,y2)

첫 번째 결정트리에서 예측한 값타깃값(y)의 차이(잔여 오차)를 데이터셋의 타깃값으로 지정하고, 

 

두 번째 결정트리를 훈련시켰다. 

 

    y3 = y2 - tree_reg2.predict(X)[:, None]
    tree_reg3 = DecisionTreeRegressor(max_depth=2)
    tree_reg3.fit(X,y3)

두 번째 결정트리에서 나온 잔여 오차를 타깃값으로 지정해 세 번째 결정트리를 훈련시켰다. 

 

    X_new = np.linspace(-8, 8, 1000).reshape(-1, 1)
    y_final = tree_reg1.predict(X_new) + tree_reg2.predict(X_new) + tree_reg3.predict(X_new)

테스트셋을 설정하고, 각 결정트리의 예측값을 모두 합한 값이 그레이디언트 부스팅의 최종 예측값이다.

 

    plt.scatter(X,y)
    plt.scatter(X_new, y_final, c='purple', s=3)
    plt.scatter(X_new, tree_reg1.predict(X_new), c='red', s=1)
    plt.scatter(X_new, tree_reg2.predict(X_new), c='orange', s=1)
    plt.scatter(X_new, tree_reg3.predict(X_new), c='green', s=1)
    plt.xlabel("X")
    plt.ylabel("y")
    plt.grid(linestyle = "dotted")
    plt.legend(['tree_gradient_boost','tree_reg1','tree_reg2', 'tree_reg2'])
    plt.show()

그레이디언트 부스트

그레이디언트 부스트된 결정 트리가 가장 정답에 근사한 그래프를 보이고 있다.