정보 기반 방법: 베이즈 통계

Python에서의 하이퍼파라미터 튜닝

Alex Scriven

Data Scientist

베이즈 소개

 

베이즈 규칙:

새로운 증거를 사용해 어떤 결과에 대한 우리의 믿음을 반복적으로 업데이트하는 통계적 방법

  • 증거가 늘수록 더 나아지는 ‘정보 기반’ 탐색과 직관적으로 맞습니다.
Python에서의 하이퍼파라미터 튜닝

베이즈 규칙

베이즈 규칙의 형태:

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • 좌변(LHS) = B가 발생했을 때 A의 확률. B는 새로운 증거.

    • 이를 사후확률(posterior)이라 함
  • 우변(RHS)은 계산식.

  • P(A)는 사전확률(prior). 사건에 대한 초기 가설. P(A|B)와 다르며, P(A|B)는 새로운 증거가 주어졌을 때의 확률.
Python에서의 하이퍼파라미터 튜닝

베이즈 규칙

 

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • P(B)는 주변우도(marginal likelihood). 이 새로운 증거가 관측될 확률.
  • P(B|A)는 우도(likelihood). 관심 사건 A가 주어졌을 때 증거를 관측할 확률.

혼란스러울 수 있으니, 의료 진단 예시로 살펴보겠습니다.

Python에서의 하이퍼파라미터 튜닝

의학에서의 베이즈

 

의료 예시:

  • 전체 인구의 5%가 특정 질병 보유
    • P(D)
  • 10%는 소인(취약) 보유
    • P(Pre)
  • 질병 보유자 중 20%가 소인 보유
    • P(Pre|D)
Python에서의 하이퍼파라미터 튜닝

의학에서의 베이즈

임의의 사람이 질병을 가질 확률은?

$$ P(D) = 0.05 $$

증거가 없으므로 단순히 사전확률입니다.

소인이 있는 사람이 질병을 가질 확률은?

$$ P(D \mid Pre) = \frac{P(Pre \mid D) \, P(D)}{P(pre)} $$

$$ P(D \mid Pre) = \frac{0.2 \, * 0.05}{0.1} = 0.1 $$

Python에서의 하이퍼파라미터 튜닝

하이퍼파라미터 튜닝의 베이즈

이 논리를 하이퍼파라미터 튜닝에 적용합니다:

  • 하이퍼파라미터 조합 선택
  • 모델 학습
  • 새로운 증거(모델 점수) 획득
  • 믿음을 업데이트하고 다음 라운드에 더 나은 하이퍼파라미터 선택

베이즈 하이퍼파라미터 튜닝은 최근 방법이지만, 큰·복잡한 튜닝에서 최적 조합을 잘 찾아 널리 사용됩니다

Python에서의 하이퍼파라미터 튜닝

Hyperopt로 베이즈 하이퍼파라미터 튜닝

 

Hyperopt 패키지 소개.

베이즈 튜닝을 위해 필요한 것:

  1. 도메인 설정: 그리드(약간 변형)
  2. 최적화 알고리즘 설정(기본 TPE 권장)
  3. 최소화할 목적 함수: 1-Accuracy 사용
Python에서의 하이퍼파라미터 튜닝

Hyperopt: 도메인(그리드) 설정

그리드 설정 방법:

  • 단일 숫자
  • 목록에서 선택
  • 값의 분포

Hyperopt는 그리드의 점 값을 쓰지 않고, 각 점을 하이퍼파라미터 값의 확률로 표현합니다.

여기서는 균등분포를 쓰지만, 문서에 더 많은 옵션이 있습니다.

Python에서의 하이퍼파라미터 튜닝

도메인

 

그리드 설정:

space = {
    'max_depth': hp.quniform('max_depth', 2, 10, 2),
    'min_samples_leaf': hp.quniform('min_samples_leaf', 2, 8, 2),
    'learning_rate': hp.uniform('learning_rate', 0.01, 1, 55),
}
Python에서의 하이퍼파라미터 튜닝

목적 함수

목적 함수가 알고리즘을 실행합니다:

def objective(params):
    params = {'max_depth': int(params['max_depth']),
        'min_samples_leaf': int(params['min_samples_leaf']),
        'learning_rate': params['learning_rate']}
    gbm_clf = GradientBoostingClassifier(n_estimators=500, **params)

best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=10, n_jobs=4).mean() loss = 1 - best_score
write_results(best_score, params, iteration) return loss
Python에서의 하이퍼파라미터 튜닝

알고리즘 실행

 

알고리즘 실행:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Python에서의 하이퍼파라미터 튜닝

Passons à la pratique !

Python에서의 하이퍼파라미터 튜닝

Preparing Video For Download...