최고의 요리 레시피 찾기
이 프로젝트는 마치 최고의 요리 레시피를 찾기 위한 여정과 같습니다. 모델 성능을 극대화하려는 목표는 마치 손님이 모두 만족할 수 있는 완벽한 요리를 만들기 위한 시도와 비슷합니다.
- 탐색 공간 정의 (xgb_search_space):
- 요리 재료와 조리법을 선택할 범위를 정의하는 과정입니다.
- 요리를 하기 전에 양념의 양, 재료의 비율, 조리 시간 등을 결정해야 하는데, 이 과정에서 가능한 선택지들의 범위를 정합니다. 예를 들어:
- max_depth는 조리 시간으로 비유할 수 있습니다. (너무 길면 과도하게 익혀져 버리지만, 짧으면 덜 익은 상태가 될 수 있습니다.)
- learning_rate는 불의 세기로 생각할 수 있습니다. (너무 세면 요리가 타버리고, 너무 약하면 익지 않습니다.)
- 여기서, HyperOpt의 hp.quniform() 같은 함수는 양념을 1g씩 늘려가며 테스트할 수 있는 범위를 정하는 것과 같습니다.
- 최적의 요리법 찾기 (fmin()):
- HyperOpt의 fmin() 함수는 요리사가 다양한 레시피를 시도해 보는 과정입니다.
- 요리사는 fmin()을 통해 가능한 모든 양념의 조합을 시도하고, 각 조합의 맛(성능)을 평가합니다.
- 이 과정에서 최고의 맛을 찾기 위해 레시피를 조금씩 바꾸어가며 최적의 조합을 찾아내는 것이 목표입니다. 이때 algo=tpe.suggest는 기존 시도들을 바탕으로 더 나은 조합을 예측해서 새로운 레시피를 제안해주는 요리 보조사 역할을 합니다.
- 목적 함수 (objective_func):
- 목적 함수는 레시피에 따라 실제로 요리를 만드는 과정입니다.
- 각 레시피(하이퍼파라미터 조합)가 들어오면, 이 함수는 그 조합에 따라 요리를 하고 손님들에게 맛을 보게 합니다.
- 여기서 모델 학습은 마치 요리를 만드는 것과 같고, 교차 검증(K-Fold)은 여러 명의 손님에게 요리를 맛보게 하는 과정입니다.
- 여러 명의 손님이 맛을 보고 그 평가를 평균 내는 것이 교차 검증을 통해 성능을 측정하는 것과 같습니다.
- 마지막에 return -1 * np.mean(roc_auc_list)는 손님들의 평가를 기반으로 음수 값을 반환하는데, 이는 HyperOpt가 최소화 문제로 동작하기 때문에, 맛 점수가 높을수록 좋다는 것을 반대로 표현하는 것과 같습니다.
- 교차 검증 (KFold):
- 교차 검증은 다양한 손님 그룹에게 요리를 맛보게 하는 과정입니다.
- KFold(n_splits=3)는 세 그룹의 손님을 만들어, 각 그룹에 조금씩 다른 요리 버전을 제공합니다.
- 이는 특정 손님 그룹에게만 맞춘 요리법(즉, 과적합된 모델)을 만드는 것이 아니라, 모든 손님이 좋아할 수 있는 요리법을 찾기 위함입니다. 그래서 여러 번 다양한 평가 그룹으로 나누어 테스트합니다.
- ROC AUC 계산 (roc_auc_score):
- 손님들의 만족도를 측정하는 과정입니다.
- 이 함수는 마치 요리를 먹은 각 손님의 만족도를 점수화하는 것과 같습니다.
- roc_auc_score()는 모델의 예측 성능을 평가하는 지표로, 손님들이 얼마나 만족했는지를 수치로 표현합니다. 1에 가까울수록 매우 만족스러운 요리, 0.5에 가까울수록 그냥 평균적인 요리라고 생각하면 됩니다.
- 조기 종료 (early_stopping_rounds):
- 요리를 하면서 지나치게 많은 시간을 들여 맛을 개선하려고 할 때를 막아주는 기능입니다.
- 만약 특정 요리법에서 일정 시간 동안 맛의 개선이 없다면, 더 이상의 노력을 멈추고 새로운 방법을 시도하는 것과 같습니다. 이는 낭비를 줄이기 위해 적절한 시점에서 요리 과정을 멈추게 해주는 역할입니다.
한 눈에 보는 비유를 통한 전체 프로세스
- 재료와 조리법 탐색 (xgb_search_space):
- 여러 종류의 재료와 양념 비율을 정하는 과정.
- 요리법 테스트 (fmin()):
- 탐색한 재료와 조리법을 바탕으로 여러 레시피를 시도해 보는 과정.
- 실제 요리 (objective_func):
- 레시피에 따라 요리를 만들고 손님들에게 맛을 보게 하는 과정.
- 교차 검증 (KFold):
- 여러 손님 그룹에게 요리를 제공하여 다양한 평가를 받는 과정.
- 만족도 측정 (roc_auc_score):
- 손님들의 피드백을 수치로 측정하여 만족도를 평가.
- 조기 종료 (early_stopping_rounds):
- 시간과 자원을 절약하기 위해, 요리가 더 이상 개선되지 않을 때 시도를 멈추는 과정.
요약
하이퍼파라미터 최적화는 최고의 맛있는 요리법을 찾기 위한 노력과 같습니다. HyperOpt는 여러 재료와 조리 방법을 탐색하며 최적의 조합을 찾기 위해 여러 시도를 하게 되고, 교차 검증을 통해 다양한 손님에게 평가받는 과정을 거칩니다. 손님들의 만족도를 높이기 위해 레시피를 조금씩 조정하고, 불필요한 노력을 줄이기 위해 조기 종료도 설정합니다.
HyperOpt가 최소화 문제로 동작하는 이유
HyperOpt는 기본적으로 "최소화"를 목표로 하는 최적화 도구입니다. 즉, HyperOpt는 함수에서 반환되는 값이 가장 작은 값이 되도록 하이퍼 파라미터를 찾으려고 합니다.
하지만 우리가 사용하고 있는 ROC AUC 점수는 "높을수록 좋은 값"입니다. 높은 점수일수록 모델이 더 잘 작동하고 있다는 뜻이죠. 그렇다면 HyperOpt의 "최소화" 방식과 우리의 목표인 "최대화"가 서로 반대되는 상황입니다.
비유를 통한 설명
HyperOpt가 마치 "맛이 가장 덜한 요리"를 찾으려고 하는 요리사라고 생각해 봅시다. 하지만 우리의 목표는 맛이 가장 좋은 요리를 찾는 것입니다. 여기서 우리가 HyperOpt에게 "맛이 덜한 요리를 찾아줘"라고 요청한다면, 당연히 우리의 목표와 맞지 않게 되겠죠.
이 문제를 해결하기 위해 우리는 맛 점수를 음수로 바꿉니다. 예를 들어,
- 맛 점수가 90점인 요리는 -90으로 변환됩니다.
- 맛 점수가 50점인 요리는 -50으로 변환됩니다.
이제 HyperOpt는 "가장 작은 값(가장 낮은 음수)"을 찾으려고 하니까, -90이 -50보다 더 낮은 값이라고 판단하고, 그 요리가 더 좋다고 인식하게 됩니다. 결과적으로 HyperOpt는 맛 점수가 가장 높은 요리를 선택하게 되는 것이죠.
코드에서 어떻게 표현되는지
- np.mean(roc_auc_list): 교차 검증을 통해 구한 ROC AUC 점수의 평균을 계산합니다. 이 값은 높을수록 모델의 성능이 좋다는 것을 의미합니다.
- -1 * np.mean(roc_auc_list): 이 값을 음수로 변환합니다. 예를 들어, 점수가 0.85라면, 이를 -0.85로 바꿉니다.
- HyperOpt는 이 음수 값을 최소화하려고 하므로, 가장 큰 ROC AUC 점수를 가진 하이퍼파라미터 조합을 찾게 됩니다.
정리하자면
- HyperOpt는 최소화 문제만 해결하려고 설계되었습니다.
- ROC AUC 점수는 높을수록 좋으므로 최대화 문제입니다.
- HyperOpt에게 최대화 문제를 풀게 하기 위해 점수를 음수로 바꿔 반환하여, HyperOpt가 "가장 낮은 음수 값", 즉 가장 큰 양수 점수를 선택하게 합니다.
요약하면, HyperOpt가 "최소화"를 목표로 하기에, "높을수록 좋은 값"을 음수로 바꿔서 최소화하도록 만드는 것입니다. 😊
ROC AUC란?
ROC(Receiver Operating Characteristic Curve) AUC(Area Under Curve)는 모델이 좋은 예측을 하고 있는지를 평가하기 위한 점수입니다. 특히, 이 점수는 모델이 양성(예: 불만족 고객)과 음성(예: 만족 고객)을 얼마나 잘 구분하는지를 보여줍니다.
비유를 통해서 이해해 보겠습니다.
예시: 문을 지키는 경비원
- 당신이 클럽의 경비원이라고 상상해봅시다. 클럽에는 들어오면 안 되는 사람들(음성)과 들어와도 괜찮은 사람들(양성)이 있습니다.
- 당신의 임무는 들어와도 괜찮은 사람들만 입장시키고, 들어오면 안 되는 사람들은 막아야 합니다.
- 그런데, 사람들은 외모나 옷차림이 다 비슷해서 누가 들어오면 안 되는지 구분하기가 어렵습니다.
여기서 모델이란, 이 경비원의 판단 능력과 비슷합니다. ROC AUC 점수는 이 경비원이 얼마나 정확하게 구분하고 있는지를 나타내는 점수입니다.
ROC AUC의 점수 이해하기
- AUC = 1.0 (완벽한 경비원)
- 경비원이 항상 정확하게 판단합니다.
- 들어오면 안 되는 사람은 절대 입장시키지 않고, 들어와도 괜찮은 사람은 항상 입장시킵니다.
- 이 상황에서 AUC 점수는 1.0입니다. 완벽한 판단을 하고 있는 것이죠.
- AUC = 0.5 (동전 던지기 경비원)
- 경비원이 무작위로 사람을 입장시킵니다. 그냥 동전 던지기로 결정한다고 보면 됩니다.
- 들어오면 안 되는 사람도 가끔 입장시키고, 들어와도 되는 사람도 가끔 막습니다.
- 이 경우 AUC 점수는 0.5입니다. 즉, 무작위로 판단하는 것과 같은 수준입니다.
- AUC < 0.5 (반대로 판단하는 경비원)
- 경비원이 오히려 잘못된 판단을 더 많이 합니다. 들어오면 안 되는 사람은 입장시키고, 들어와도 되는 사람은 막는 일이 더 많습니다.
- 이 경우 AUC 점수는 0.5보다 낮습니다. 즉, 잘못 판단하고 있다는 뜻입니다.
왜 ROC AUC 점수가 중요한가?
- 불만족 고객이 아주 적은 경우, 단순히 정확도로만 평가하면 모델이 대부분 만족 고객을 맞추면서도 높은 점수를 받을 수 있습니다.
- 하지만 중요한 것은 불만족 고객을 얼마나 잘 예측하는가입니다.
- ROC AUC 점수는 양성(불만족 고객)과 음성(만족 고객)을 얼마나 잘 구분하는지를 평가하기 때문에, 정확도보다 더 의미 있는 지표입니다.
요약 비유
ROC AUC 점수는 경비원이 얼마나 정확하게 들어올 사람과 막아야 할 사람을 구분하는지를 나타내는 점수입니다.
- 1에 가까울수록: 경비원이 완벽하게 구분하고 있다는 뜻입니다.
- 0.5: 경비원이 그냥 운에 맡기고 구분하는 것과 같습니다.
- 0.5보다 작으면: 경비원이 오히려 틀린 판단을 더 많이 하고 있다는 뜻입니다.
즉, AUC가 높을수록 우리의 모델이 더 똑똑한 경비원처럼 양성과 음성을 잘 구분한다는 것을 의미합니다.
'데이터사이언티스트 Data Scientist' 카테고리의 다른 글
데이터 이해 (0) | 2024.12.11 |
---|---|
[지도학습] 분류(Classificaion) - (1) 의사결정나무(Decision Tree) 모델 (1) | 2024.11.08 |
고유값(Eigenvalue) (1) | 2024.11.07 |
의사결정나무(Decision Tree) (1) | 2024.11.07 |
Train Data 와 Test Data 를 나누는 이유 (2) | 2024.11.07 |