그리드 서치 소개

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

Alex Scriven

Data Scientist

하이퍼파라미터 2개 자동화

이전 작업:

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

이후 DataFrame으로 모아 분석했습니다.

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

하이퍼파라미터 2개 자동화

 

하이퍼파라미터 2개의 값을 테스트하려면?

GBM 알고리즘 사용:

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

(_중첩_) for 루프를 쓸 수 있습니다!

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

하이퍼파라미터 2개 자동화

먼저 모델 생성 함수:

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Python에서의 하이퍼파라미터 튜닝

하이퍼파라미터 2개 자동화

 

이제 하이퍼파라미터 목록을 순회하며 함수를 호출합니다:

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

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

하이퍼파라미터 2개 자동화

 

이 결과를 DataFrame에 담아 출력할 수 있습니다:

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

결과 테이블

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

모델은 몇 개?

 

하이퍼파라미터와 값이 늘면 더 많은 모델이 생깁니다.

  • 관계는 선형이 아니라 지수적입니다
  • 값 하나를 늘리면 모델도 하나만 늘지 않습니다
  • 하이퍼파라미터1이 5, 하이퍼파라미터2가 10이면 50개 모델!

교차 검증은 어떨까요?

  • 10-폴드면 50x10 = 500개 모델!
Python에서의 하이퍼파라미터 튜닝

2개에서 N개 하이퍼파라미터로

 

하이퍼파라미터를 더 늘리면?

루프를 중첩할 수 있습니다!

# 테스트할 값 목록 조정
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Python에서의 하이퍼파라미터 튜닝

2개에서 N개 하이퍼파라미터로

함수를 조정합니다:

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Python에서의 하이퍼파라미터 튜닝

2개에서 N개 하이퍼파라미터로

for 루프를 중첩합니다:

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Python에서의 하이퍼파라미터 튜닝

2개에서 N개 하이퍼파라미터로

 

이제 모델은 몇 개일까요?

  • 7x9x5x2 = 630개 (교차 검증 시 6,300개!)

무한정 중첩할 수는 없습니다!

또한 이런 정보가 필요할 수 있습니다:

  • 학습 시간과 점수 상세
  • 교차 검증 점수 상세
Python에서의 하이퍼파라미터 튜닝

그리드 서치 소개

그리드를 만듭니다:

  • 왼쪽에는 모든 max_depth 값
  • 위에는 모든 learning_rate 값

하이퍼파라미터 조합 표

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

그리드 서치 소개

그리드의 각 셀을 순회합니다:

하이퍼파라미터 조합 표

(4,0.001)은 다음 추정기와 같습니다:

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Python에서의 하이퍼파라미터 튜닝

그리드 서치: 장단점

 

이 접근의 장점:

장점:

  • 수천 줄의 코드를 작성할 필요가 없습니다
  • 그리드 내 최적 모델을 찾습니다(특별 참고!)
  • 설명하기 쉽습니다
Python에서의 하이퍼파라미터 튜닝

그리드 서치: 장단점

 

이 접근의 단점:

  • 계산 비용이 큽니다! 6,000+ 모델이 얼마나 빨리 늘어났는지 기억하세요
  • ‘비지도’ 방식입니다. 한 모델의 결과가 다음 모델에 도움되지 않습니다.

 

‘지도’ 방식은 나중에 다룹니다!

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

Lass uns üben!

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

Preparing Video For Download...