그래디언트 부스팅은 분류 작업에 이용되는 데이터 과학에서 널리 사용되는 강력한 머신 러닝 알고리즘입니다. 이 알고리즘은 여러 개의 비교적 단순한 모델의 예측을 결합하여 전반적인 성능을 향상시키는 배깅과 함께 앙상블 학습 방법에 속합니다. 그래디언트 부스팅 회귀는 그래디언트 부스팅을 사용하여 선형 회귀에 기반한 아웃풋 데이터를 더 잘 생성합니다. 이 튜토리얼에서 살펴볼 그래디언트 부스팅 분류기는 그라데이션 부스팅을 사용하여 입력 데이터를 둘 이상의 서로 다른 클래스에 속하는 것으로 더 잘 분류합니다.
그래디언트 부스팅은 adaboost 알고리즘의 업데이트된 버전으로, 트리가 아닌 의사 결정 그루터기를 사용합니다. 이 의사 결정 그루터기는 임의의 숲에 있는 나무와 비슷하지만 하나의 노드와 두 개의 잎만 있습니다. 그래디언트 부스팅 알고리즘은 모델을 순차적으로 구축하며, 각 단계는 이전 반복의 실수를 수정하려고 시도합니다. 학습 프로세스는 종종 학습 데이터에 대한 얕은 의사결정트리와 같은 약한 학습자를 만드는 것으로 시작됩니다. 초기 학습 후 그래디언트 부스팅은 실제값과 예측값 사이의 오류(종종 잔차라고 함)를 계산한 다음 이 오류를 예측하도록 새 추정기를 학습합니다. 이 새 트리는 강력한 학습자를 생성하기 위해 예측을 업데이트하기 위해 앙상블에 추가됩니다. 그래디언트 부스팅은 개선이 중지되거나 지정된 반복 횟수에 도달할 때까지 이 프로세스를 반복합니다. 부스팅 자체는 그라디언트 하강과 유사하지만, 새로운 모델을 도입하여 그라디언트를 "하강"합니다.
부스팅은 테이블 형식 데이터에 대한 성능이 좋고 수치 및 범주형 데이터를 모두 처리할 수 있는 등 여러 장점이 있습니다. 기본 매개변수에서도 잘 작동하며, 데이터 세트의 이상값에 대해 견고합니다. 그러나 학습 속도가 느릴 수 있으며, 학습 프로세스에 대해 설정된 하이퍼매개변순에 매우 민감한 경우가 많습니다. 생성된 트리 수를 더 적게 유지하면 대규모 데이터 세트로 작업할 때 학습 프로세스가 빨라질 수 있습니다. 이 단계는 일반적으로 최대 깊이 매개변수를 통해 수행됩니다. 그래디언트 부스팅은 제대로 조정되지 않으면 과적합이 발생하기 쉬울 수도 있습니다. 과적합을 방지하기 위해 학습 프로세스의 학습률을 구성할 수 있습니다. 이 프로세스는 분류기 또는 그래디언트 부스팅 회귀 변수와 거의 동일하며, 그래디언트 부스팅을 기반으로 정규화가 추가된 인기 있는 xgboost에서 사용됩니다.
이 튜토리얼에서는 인기 있는 Palmer Penguins 데이터 세트를 사용하여 펭귄을 분류하기 위해 두 가지 프로그래밍 언어와 그래디언트 부스팅 라이브러리를 이용하는 방법을 알아봅니다.
Github에서 이 튜토리얼의 노트북을 다운로드할 수 있습니다.
여러 툴 중에서 선택할 수 있지만, 이 튜토리얼에서는 watsonx에서 Jupyter Notebook을 사용하기 위해 IBM 계정을 설정하는 방법을 안내합니다.
IBM Cloud 계정을 사용하여 watsonx.ai에 로그인합니다.
watsonx.ai 프로젝트를 생성합니다.
프로젝트 내에서 프로젝트 ID를 가져올 수 있습니다. 관리 탭을 클릭합니다. 그런 다음 일반 페이지의 세부 정보 섹션에서 프로젝트 ID를 복사합니다. 이 튜토리얼에는 이 ID가 필요합니다.
Jupyter Notebook을 만듭니다.
노트북을 만들 때 "Runtime 24.1 on R 4.3 S (4 vCPU 16 GB RAM)"을 선택해야 합니다. 이 단계에서는 이 튜토리얼의 코드를 복사할 수 있는 Jupyter Notebook 환경이 열립니다. 또는 이 노트북을 로컬 시스템에 다운로드하여 watsonx.ai 프로젝트에 에셋으로 업로드할 수 있습니다. 더 많은 Granite 튜토리얼을 보려면 IBM Granite 커뮤니티를 확인하세요. 이 Jupyter Notebook은 GitHub에서 찾을 수 있습니다.
R에서 캐럿 라이브러리는 일반 데이터 준비 및 모델 적합을 위한 강력한 도구입니다. 이를 사용하여 데이터를 준비하고 모델을 학습합니다.
install.packages('gbm')
install.packages('caret')
install.packages('palmerpenguins')
library(gbm)
library(caret)
library(palmerpenguins)
head(penguins) # head() returns the top 6 rows of the dataframe
summary(penguins) # prints a statistical summary of the data columns
caret 패키지의 createDataPartition 함수를 사용하여 원본 데이터 세트를 학습 데이터와 테스트 데이터로 분할하고 데이터를 학습 세트(70%)와 테스트 세트(30%)로 분할합니다.
dim(penguins)
# get rid of any NA
penguins <- na.omit(penguins)
parts = caret::createDataPartition(penguins$species, p = 0.7, list = F)
train = penguins[parts, ]
test = penguins[-parts, ]
이제 학습 및 테스트를 수행할 준비가 되었습니다.
caret 라이브러리의 train 메서드는 R 공식을 사용하며, 여기서 종속 변수('대상'이라고도 함)는 물결표 '~'의 왼쪽에 있습니다. 독립 변수('특징'이라고도 함)는 '~'의 오른쪽에 있습니다. 예:
height ~ age
이 단계에서는 연령을 기반으로 키를 예측합니다.
caret 학습을 위해 공식, 학습 데이터 및 사용할 메서드를 전달합니다. caret 라이브러리는 다양한 유형의 학습에 대한 메서드를 제공하므로 메서드를 "gbm"으로 설정하면 그래디언트 부스팅을 사용하도록 지정할 수 있습니다. 다음 매개변수는 학습 프로세스를 구성합니다. "repeatedcv" 메서드는 학습 세트 데이터 포인트의 하위 샘플에 대해 X-폴드 교차 검증을 수행합니다. 여기서는 각 교차 검증에 대해 서로 다른 폴드 세트를 사용하여 5폴드 교차 검증의 3회 반복을 지정합니다.
model_gbm <- caret::train("species ~ .",
data = train,
method = "gbm", # gbm for gradient boosting machine
trControl = trainControl(method = "repeatedcv",
number = 5,
repeats = 3,
verboseIter = FALSE),
verbose = 0)
이제 예측 모델을 사용하여 테스트 데이터를 예측할 수 있습니다.
pred_test = caret::confusionMatrix(
data = predict(model_gbm, test),
reference = test$species
)
print(pred_test)
이 단계는 다음을 인쇄합니다.
Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 42 0 0
Chinstrap 0 20 0
Gentoo 1 0 35
Overall Statistics
Accuracy : 0.9898
95% CI : (0.9445, 0.9997)
No Information Rate : 0.4388
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.984
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 0.9767 1.0000 1.0000
Specificity 1.0000 1.0000 0.9841
Pos Pred Value 1.0000 1.0000 0.9722
Neg Pred Value 0.9821 1.0000 1.0000
Prevalence 0.4388 0.2041 0.3571
Detection Rate 0.4286 0.2041 0.3571
Detection Prevalence 0.4286 0.2041 0.3673
Balanced Accuracy 0.9884 1.0000 0.9921
폴드를 사용한 교차 검증의 특성 때문에 정확도는 동일하지만 각 클래스의 민감도 및 특이도는 여기서 관찰된 것과 약간 다를 수 있습니다. 학습 데이터 세트의 20%를 차지하는 턱끈펭귄의 경우에도 정확도는 상당히 우수합니다.
이제 Python에서 그래디언트 부스팅 모델을 만드는 방법을 배워 보겠습니다. 이전에 생성한 것과 동일한 프로젝트에서 Jupyter Notebook을 생성합니다.
IBM Watson Studio에서 Python 3.11을 사용하여 Jupyter Notebook을 생성해야 합니다. 노트북을 만들 때 "Runtime 24.1 on Python 3.11 XXS (1 vCPU 4 GB RAM)"를 선택해야 합니다. 이제 Python을 사용하여 그래디언트 부스팅 분류기를 만들 준비가 되었습니다.
이 단계에서는 그래디언트 부스팅 분류기를 학습하고 테스트하는 데 사용할 라이브러리를 설치합니다. 학습 자체는 scikit-learn으로 수행되며 데이터는 palmerpenguins 라이브러리에서 가져왔습니다.
!pip install seaborn pandas scikit-learn palmerpenguins
이제 노트북 환경에 라이브러리를 설치합니다.
import pandas as pd
import seaborn as sns
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from palmerpenguins import load_penguins
R 코드에서처럼 핑귄 데이터 세트에는 제거해야 하는 일부 NA가 있습니다. 이 코드 스니펫은 데이터 세트를 로드하고 NA 행을 모두 제거한 다음 데이터를 특징과 대상으로 분할합니다.
# Load the penguins
penguins = load_penguins() #initialize the dataset
penguins = penguins.dropna()
X = penguins.drop("species", axis=1)
y = penguins["species"]
이제 데이터의 70%는 학습용으로 가져오고 30%는 테스트용으로 예약된 데이터 세트의 학습과 테스트의 분할을 만듭니다.
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
다음으로 두 개의 열 이름 목록을 수집하게 되는데, 하나는 X의 범주형 특징에 관한 것이고 다른 하나는 숫자 특징에 대한 것입니다(예: float64 또는 int64). 그런 다음 scikit-learn의 ColumnTransformer를 사용하여 다양한 열 유형에 다양한 전처리를 적용합니다. OneHotEncoder가 범주형 특징에 적용되어 이러한 특징이 이진 벡터로 변환됩니다. 숫자 특징을 평균 f 0 및 분산 1을 중심으로 표준화하기 위해 이러한 특징에 StandardScaler가 적용됩니다.
# Define categorical and numerical features
categorical_features = X.select_dtypes(
include=["object"]
).columns.tolist()
numerical_features = X.select_dtypes(
include=["float64", "int64"]
).columns.tolist()
preprocessor = ColumnTransformer(
transformers=[
("cat", OneHotEncoder(), categorical_features),
("num", StandardScaler(), numerical_features),
]
)
이제 기능 세트와 전처리기를 만들었으므로 파이프라인을 생성하여 모델을 학습시킬 수 있습니다. 해당 파이프라인은 입력 데이터에 전처리기를 사용한 다음 그래디언트 부스팅 알고리즘에 전달하여 분류기를 구축합니다. 더 크거나 더 복잡한 데이터 세트의 경우 구성하면 좋은 다른 학습 매개변수가 있습니다. 예를 들어, max_features는 최상의 분할 또는 트리의 노드 수를 제한하는 max_depth를 찾을 때 고려해야 할 특징 수를 설정합니다. 이 코드 스니펫은 학습을 위한 분할의 품질을 측정하는 기준 매개변수를 설정합니다. 이 사례에서는 Jerry Friedman(ibm.com 외부 링크)의 평균 제곱 오차를 개선 점수와 함께 사용했습니다.
pipeline = Pipeline([
("preprocessor", preprocessor),
("classifier", GradientBoostingClassifier(random_state=42,
criterion='friedman_mse', max_features=2)),
])
다음으로, 머신 러닝 파이프라인이 학습 데이터에 대해 얼마나 잘 작동하는지 평가하기 위한 검증을 수행합니다. 생성한 파이프라인의 fit 메서드를 호출하면 모델이 학습합니다. 손실 함수는 기본적으로 평균 제곱 오차(또는 MSE)를 사용합니다.
# Perform 5-fold cross-validation
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5)
# Fit the model on the training data
pipeline.fit(X_train, y_train)
이제 모델이 학습되었는지 확인하고 테스트 세트를 예측하고 성능을 확인합니다.
# Predict on the test set
y_pred = pipeline.predict(X_test)
# Generate classification report
report = classification_report(y_test, y_pred)
결과 인쇄:
print(f"Mean Cross-Validation Accuracy: {cv_scores.mean():.4f}")
print("\nClassification Report:")
print(report)
이 단계에서는 다음 결과를 인쇄합니다.
Mean Cross-Validation Accuracy: 0.9775
Classification Report:
precision recall f1-score support
Adelie 1.00 1.00 1.00 31
Chinstrap 1.00 1.00 1.00 18
Gentoo 1.00 1.00 1.00 18
accuracy 1.00 67
macro avg 1.00 1.00 1.00 67
weighted avg 1.00 1.00 1.00 67
이러한 결과는 이 튜토리얼의 첫 번째 부분에서 R 메서드에 의해 보고된 정확도에 매우 근접합니다.
AI 빌더를 위한 차세대 엔터프라이즈 스튜디오인 IBM watsonx.ai로 생성형 AI, 파운데이션 모델 및 머신 러닝 기능을 학습, 검증, 조정 및 배포하세요. 적은 데이터로 짧은 시간 내에 AI 애플리케이션을 구축하세요.
업계 최고의 AI 전문성과 솔루션 포트폴리오를 보유한 IBM과 함께 AI를 비즈니스에 활용하세요.
AI 추가를 통해 중요한 워크플로와 운영을 혁신함으로써 경험, 실시간 의사 결정 및 비즈니스 가치를 극대화합니다.