처음부터 차근차근 파이썬 자세히보기

Python-머신 러닝/Python-지도 학습 알고리즘

2. 지도 학습 알고리즘 (6) Ensembles of Decision Trees (Gradient Boosted Regression Trees)

윤빵빵영 2020. 6. 14. 16:08

최종 수정 일자: 2020-06-14 16:08

해당 카테고리에 작성되는 글은 Introduction to Machine Learning with Python(파이썬 라이브러리를 활용한 머신 러닝)을 기반으로 작성되었습니다.

 

Gradient Boosted Regression Trees (Gradient Boosting Machines)

 

Gradient boosted regression tree (GBRT)는 여러 결정 트리를 결합하여 더 강력한 모델을 만드는 또 다른 앙상블 방법입니다. 이름에 ‘regression’ , 회귀가 있지만 회귀와 분류 문제 모두에 사용될 수 있습니다. Random forest의 접근 방법과는 다르게 GBRT는 트리를 연속적인 방식으로 만들며 각 트리는 이전 트리의 실수를 고치도록 만들어집니다. 기본적으로 GBRT에는 임의성이 없으며 대신 강력한 pre-pruning 전략을 사용합니다. GBRT는 종종 아주 얕은 깊이의 트리를 이용하며 이 트리의 깊이는 1~5정도로 메모리의 관점에서 모델을 작게 만들며 예측을 더 빠르게 합니다.

GBRT의 메인 아이디어는 많은 단순 모델들을 결합하는 것입니다. 각 트리는 데이터의 일부분에 대해서는 훌륭한 예측을 제공하며 성능을 반복적으로 향상시키기 위해 더 많은 트리들이 계속해서 추가됩니다.

Pre-pruning 및 앙상블 내 트리의 수 이외에 다른 중요한 매개변수는 learning_state입니다. learning_state는 각 트리가 이전 트리의 실수를 얼마나 강하게 수정하는지를 조절하는 변수입니다. 더 높은 학습 속도는 각 트리가 이전 트리의 실수를 더 강하게 수정한다는 것을 의미하며 복잡도가 높은 모델을 허용하게 됩니다. 앙상블에 트리를 추가하는 것은 n_estimators 매개변수를 설정하여 할 수 있으며 마찬가지로 모델 복잡도를 증가시킵니다.

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train)

print("Accuracy on training set: {:.3f}".format(gbrt.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gbrt.score(X_test, y_test)))

결과)

Accuracy on training set: 1.000
Accuracy on test set: 0.965


과대 적합을 줄이기 위해서는 maximum depth를 제한하거나 학습 속도를 낮춰 강력한 pre-pruning를 적용해야 합니다.

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
gbrt.fit(X_train, y_train)

print("Accuracy on training set: {:.3f}".format(gbrt.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gbrt.score(X_test, y_test)))

결과)

Accuracy on training set: 0.991
Accuracy on test set: 0.972

 

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0, learning_rate=0.01)
gbrt.fit(X_train, y_train)

print("Accuracy on training set: {:.3f}".format(gbrt.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gbrt.score(X_test, y_test)))

결과)

Accuracy on training set: 0.988
Accuracy on test set: 0.965

 

마찬가지로 특성 중요도를 시각화할 수 있습니다.

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

from sklearn.ensemble import GradientBoostingClassifier
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
gbrt.fit(X_train, y_train)

def plot_feature_importances_cancer(model):
    n_features = cancer.data.shape[1]
    plt.barh(range(n_features), model.feature_importances_, align='center')
    plt.yticks(np.arange(n_features), cancer.feature_names)
    plt.xlabel("Feature importance")
    plt.ylabel("Feature")

plot_feature_importances_cancer(gbrt)
plt.show()

결과)


GBRT의 특성 중요도는 random forest와 어느 정도 유사하지만, 일부 특성들을 완전히 무시한다는 차이점이 있습니다.

Random forest가 잘 작동하지만 예측 시간이 중요한 요소일 때, 또는 머신 러닝 모델로부터 최대한의 효율성을 쥐어 짜내야할 때 GBRT를 이용하게 됩니다.

 

장점, 단점, 매개변수

 

GBRT는 지도 학습 모델 중 강력하고 많이 사용되는 모델입니다. 주요 단점은 매개변수의 조절에 주의를 기울여야 하며 학습에 오랜 시간이 걸릴 수 있다는 것입니다. 다른 트리 기반 모델과 유사하게 알고리즘은 데이터의 스케일링 없이도 잘 작동하며 고차원의 sparse data에서는 잘 작동하지 않습니다.

GBRT 모델의 주요 매개변수는 트리의 수(n_estimators), 학습 속도(learning_rate)가 있습니다. 두 매개변수는 서로 밀접한 관련이 있는데 학습 속도를 낮추면 비슷한 복잡도의 모델을 얻는데 더 많은 트리가 필요해집니다. 더 큰 n_estimators 값이 항상 나은 결과를 보여주는 random forest와는 다르게 n_estimators의 값을 키우면 더 복잡한 모델을 유도하게 되며 과대 적합으로 이어질 수 있습니다.

다른 주요 매개변수로는 max_depth가 있습니다. 일반적으로 max_depth는 매우 낮게 설정되며 다섯 개의 분할을 넘지 않습니다.