메인 콘텐츠로 건너뛰기
Colab에서 실행해 보기 W&B를 사용해 머신러닝 실험 추적, 데이터셋 버전 관리, 그리고 프로젝트 협업을 수행하세요.
W&B 사용의 장점
트리 기반 모델에서 최고의 성능을 끌어내려면 적절한 하이퍼파라미터를 선택해야 합니다. early_stopping_rounds는 얼마로 설정해야 할까요? 트리의 max_depth는 어떻게 설정해야 할까요? 최고의 성능을 내는 모델을 찾기 위해 고차원 하이퍼파라미터 공간을 탐색하는 작업은 매우 빠르게 감당하기 어려워질 수 있습니다. 하이퍼파라미터 sweep은 수많은 모델을 체계적이고 효율적으로 비교하여 최종 우승 모델을 선정하는 방법을 제공합니다. 이는 하이퍼파라미터 값의 조합을 자동으로 탐색해 가장 최적의 값을 찾도록 함으로써 이루어집니다. 이 튜토리얼에서는 W&B를 사용해 3단계만으로 XGBoost 모델에 대해 고급 하이퍼파라미터 sweep을 실행하는 방법을 알아봅니다. 미리 보기로, 아래 그래프를 확인해 보세요:
sweeps_xgboost

스윕: 개요

W&B로 하이퍼파라미터 스윕을 실행하는 것은 매우 쉽습니다. 단 3가지 간단한 단계만 따르면 됩니다.
  1. 스윕 정의: 먼저 딕셔너리와 유사한 객체를 만들어 스윕을 정의합니다. 어떤 파라미터를 탐색할지, 어떤 탐색 전략을 사용할지, 어떤 지표를 최적화할지를 지정합니다.
  2. 스윕 초기화: 한 줄의 코드로 스윕을 초기화하고, 스윕 설정이 담긴 딕셔너리를 전달합니다: sweep_id = wandb.sweep(sweep_config)
  3. 스윕 에이전트 실행: 마찬가지로 한 줄의 코드로 수행합니다. wandb.agent()를 호출하고, sweep_id와 함께 모델 아키텍처를 정의하고 학습을 수행하는 함수를 전달합니다: wandb.agent(sweep_id, function=train)
하이퍼파라미터 스윕을 실행하는 데 필요한 것은 이것이 전부입니다. 아래 노트북에서 이 3가지 단계를 더 자세히 살펴보겠습니다. 이 노트북을 fork해서 파라미터를 조정해 보거나, 여러분의 데이터셋으로 모델을 시도해 보시기 바랍니다.

리소스

!pip install wandb -qU

import wandb
wandb.login()

1. 스윕 정의하기

W&B 스윕을 사용하면 몇 줄의 코드만으로 스윕을 원하는 대로 정확하게 구성할 수 있습니다. 스윕 구성(config)은 딕셔너리 또는 YAML 파일로 정의할 수 있습니다. 이 중 일부를 함께 살펴보겠습니다:
  • Metric: 스윕이 최적화하려는 메트릭입니다. Metric은 name(학습 스크립트에서 로깅되어야 하는 메트릭 이름)과 goal(maximize 또는 minimize)을 가질 수 있습니다.
  • Search Strategy: "method" 키로 지정합니다. 스윕에서는 여러 가지 탐색 전략을 지원합니다.
  • Grid Search: 하이퍼파라미터 값의 모든 조합을 순회합니다.
  • Random Search: 무작위로 선택된 하이퍼파라미터 값 조합을 순회합니다.
  • Bayesian Search: 하이퍼파라미터를 메트릭 점수의 확률과 매핑하는 확률 모델을 만들고, 메트릭을 향상시킬 가능성이 높은 파라미터를 선택합니다. 베이지안 최적화의 목적은 시도하는 하이퍼파라미터 값의 수를 줄이는 대신, 어떤 하이퍼파라미터 값을 선택할지 결정하는 데 더 많은 리소스를 쓰는 것입니다.
  • Parameters: 하이퍼파라미터 이름과 이산 값, 범위, 또는 각 반복에서 값을 샘플링할 분포를 포함하는 딕셔너리입니다.
자세한 내용은 모든 스윕 구성 옵션 목록을 참조하세요.
sweep_config = {
    "method": "random", # grid 또는 random을 사용해 볼 수 있습니다
    "metric": {
      "name": "accuracy",
      "goal": "maximize"   
    },
    "parameters": {
        "booster": {
            "values": ["gbtree","gblinear"]
        },
        "max_depth": {
            "values": [3, 6, 9, 12]
        },
        "learning_rate": {
            "values": [0.1, 0.05, 0.2]
        },
        "subsample": {
            "values": [1, 0.5, 0.3]
        }
    }
}

2. 스윕 초기화하기

wandb.sweep을 호출하면 스윕 컨트롤러가 시작됩니다. 스윕 컨트롤러는 중앙 집중식 프로세스로서, 이를 요청하는 모든 클라이언트에게 parameters 설정을 제공하고, 클라이언트가 wandb 로깅을 통해 metrics에 대한 성능을 보고하도록 합니다.
sweep_id = wandb.sweep(sweep_config, project="XGBoost-sweeps")

학습 프로세스 정의하기

스윕을 실행하기 전에 먼저 모델을 생성하고 학습시키는 함수를 정의해야 합니다 — 하이퍼파라미터 값을 입력으로 받아 메트릭을 계산해 내는 함수입니다. 또한 스크립트에 wandb를 통합해야 합니다. 주요 구성 요소는 세 가지입니다:
  • wandb.init(): 새로운 W&B 실행을 초기화합니다. 각 실행은 학습 스크립트가 한 번 실행된 단위를 의미합니다.
  • run.config: 모든 하이퍼파라미터를 구성(config) 객체에 저장합니다. 그러면 our app에서 하이퍼파라미터 값에 따라 각 실행을 정렬하고 비교할 수 있습니다.
  • run.log(): 이미지, 비디오, 오디오 파일, HTML, 플롯, 포인트 클라우드와 같은 메트릭 및 사용자 정의 객체를 로깅합니다.
또한 데이터를 다운로드해야 합니다:
!wget https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
# Pima Indians 데이터셋을 위한 XGBoost 모델
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 로드
def train():
  config_defaults = {
    "booster": "gbtree",
    "max_depth": 3,
    "learning_rate": 0.1,
    "subsample": 1,
    "seed": 117,
    "test_size": 0.33,
  }

  with wandb.init(config=config_defaults)  as run: # sweep 실행 중 기본값이 재정의됨
    config = run.config

    # 데이터를 로드하고 예측 변수와 타겟으로 분할
    dataset = loadtxt("pima-indians-diabetes.data.csv", delimiter=",")
    X, Y = dataset[:, :8], dataset[:, 8]

    # 데이터를 학습 세트와 테스트 세트로 분할
    X_train, X_test, y_train, y_test = train_test_split(X, Y,
                                                        test_size=config.test_size,
                                                        random_state=config.seed)

    # 학습 데이터로 모델 학습
    model = XGBClassifier(booster=config.booster, max_depth=config.max_depth,
                          learning_rate=config.learning_rate, subsample=config.subsample)
    model.fit(X_train, y_train)

    # 테스트 데이터로 예측 수행
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]

    # 예측 결과 평가
    accuracy = accuracy_score(y_test, predictions)
    print(f"Accuracy: {accuracy:.0%}")
    run.log({"accuracy": accuracy})

3. 에이전트로 Sweep 실행하기

이제 wandb.agent를 호출해서 sweep을 시작합니다. wandb.agent는 W&B에 로그인되어 있고, 다음 조건을 만족하는 어떤 머신에서든 호출할 수 있습니다.
  • sweep_id가 있고,
  • 데이터셋과 train 함수가 있으며
해당 머신은 sweep에 참여하게 됩니다.
참고: random sweep은 기본적으로 무기한 실행되면서 새로운 파라미터 조합을 계속 시도합니다. 앱 UI에서 sweep을 중지할 때까지 계속됩니다. 이를 방지하려면 agent가 완료해야 하는 실행의 총 count를 지정하면 됩니다.
wandb.agent(sweep_id, train, count=25)

결과 시각화하기

이제 스윕이 완료되었으니, 결과를 살펴볼 차례입니다. W&B가 여러 가지 유용한 플롯을 자동으로 생성해 줍니다.

병렬 좌표 플롯

이 플롯은 하이퍼파라미터 값을 모델 지표에 매핑합니다. 최상의 모델 성능을 낳은 하이퍼파라미터 조합을 좁혀 나갈 때 유용합니다. 이 플롯은 트리를 learner로 사용할 경우 단순 선형 모델을 learner로 사용할 때보다 약간, 하지만 극적인 차이는 아니게, 더 좋은 성능을 낸다는 것을 시사합니다.
sweeps_xgboost

하이퍼파라미터 중요도 플롯

하이퍼파라미터 중요도 플롯은 어떤 하이퍼파라미터 값이 메트릭에 가장 큰 영향을 미쳤는지를 보여줍니다. 상관관계(선형 예측 변수로 가정했을 때의 상관계수)와 특성 중요도(결과에 대해 random forest를 학습한 후 산출한 값)를 모두 제공하므로, 어떤 파라미터가 가장 큰 영향을 미쳤는지와 그 영향이 긍정적인지 부정적인지를 확인할 수 있습니다. 이 차트를 통해 위의 병렬 좌표 차트에서 관찰한 추세를 정량적으로 확인할 수 있습니다. 검증 정확도에 가장 큰 영향을 준 것은 학습기(learner)의 선택이었고, gblinear 학습기는 일반적으로 gbtree 학습기보다 성능이 떨어졌습니다.
sweeps_xgboost
이러한 시각화는 가장 중요한 파라미터(및 값 범위)에 집중함으로써, 고비용의 하이퍼파라미터 최적화를 수행하는 데 필요한 시간과 리소스를 절약하고, 추가적으로 탐색할 가치가 있는 파라미터를 좁히는 데 도움을 줍니다.