안녕하세요, 재주스입니다.
리얼 면접 시리즈에 대한 소개는 아래를 참고해 주세요.
우버의 머신러닝 엔지니어 면접 중 ML 기초코딩 문제입니다.
"Write an AUC from scratch using vanilla Python"
저는 위 문제를 다음과 같이 표현하겠습니다.
"AUC 평가지표를 Built-in Python으로 구현하라"
문제 난이도 자체는 너무 쉽습니다.
제가 만약 면접 중 이런 문제를 만났다면 다음의 순서로 대답하겠습니다.
* 코딩테스트가 아니라는 전제입니다. 코딩 테스트면 그냥 구현하면 끝이겠죠?
1. AUC 평가지표가 무엇인지
2. AUC 평가지표의 '한계점'은 무엇인지
* 저는 모든 알고리즘과 지표에는 한계가 있다고 생각합니다. 그것을 누가 더 솔직하게 논리적으로 표현하는지도 중요한 역량 중 하나라고 생각합니다.
3. AUC 평가지표 입코딩/수도코딩
* 포스팅에서는 수식까지 작성하겠지만, 평소에 외우고 다닐 것 같지는 않습니다. 만약 면접 본다면 그때 외워두는 준비는 할 듯?
4. AUC 평가지표를 사용한 경험
5. 나라면 Following Question을 어떻게 할 것인가?
1. AUC 평가지표가 무엇인지?
AUC 평가지표는 Area Under the Curve의 줄임말입니다.
재밌는 건, 우리가 머신러닝에서 흔히 말하는 AUC는 ROC (Receiver Operating Characteristic)와 함께 사용됩니다.
그 이유는 'AUC' 자체가 갖는 의미는 그저 주어진 곡선의 아랫 면적을 계산하는 알고리즘이기 때문입니다.
* 우버에서 ML 엔지니어 면접 중 AUC를 묻는 것이니 ROC-AUC라고 암묵적으로 생각해도 좋을 것 같습니다.
* 오히려 이러한 생각을 부정적으로 평가하려고 내는 문제일 수도?
따라서, 본 문제가 묻는 질문인 AUC는 주어진 곡선의 아랫 면적을 계산하는 알고리즘이며, AUC-ROC와 함께 사용되는 경우 주어진 테스트 셋에서 모델이 얼마나 정확히 작동하는지 평가하는 알고리즘으로 활용할 수 있습니다.
AUC-ROC는 True/False가 있는 분류 문제에서 흔히 사용되는 General Metrics 중 하나입니다.
AUC-ROC는 FPR와 TPR로 표현할 수 있습니다.
- ROC 곡선은 FPR(가로축)과 TPR(세로축) 간의 관계를 시각화한 것
- FPR은 False Positive Rate으로 '틀렸는데 맞았다고 예측한 경우'입니다.
- TPR은 True Positive Rate으로 '맞았는데 맞았다고 예측한 경우'입니다.
- AUC-ROC는 ROC 곡선 아래의 면적이며, 모델의 전반적인 구분 능력을 하나의 숫자로 요약한 지표입니다.
- 종합적으로 해석할 경우 이 모델이 맞았다고 했을 때, 실제로 맞을 확률이 얼마나 되는지를 평가합니다.
또한, AUC는 Precision-Recall 그래프와도 같이 사용될 수 있습니다.
Precision-Recall 그래프가 주어졌을 때 AUC를 구하는 것입니다.
- PR 곡선은 Recall(세로축)과 Precision(가로축) 간의 관계를 시각화한 것
- Recall은 재현율로 TPR과 동일합니다.
- Precision은 정밀도로 '맞았다고 예측한 샘플 중 실제로 맞은 비율'입니다.
- AUC-PR은 PR 곡선 아래의 면적이며, 모델이 높은 정밀도와 재현율에서 얼마큼의 성능을 유지하는지 확인하는데 사용됩니다.
- 종합적으로 해석할 경우 '이 모델이 맞았다고 했을 때, 실제로 맞았을 경우 얼만큼의 Recall을 유지할 수 있느냐'를 평가합니다.
- 객체탐지를 기준으로 조금 더 쉽게 설명하면 다음과 같습니다.
- Recall이 높으면 100개의 객체 중 100개를 다 찾을 확률이 높습니다.
- Precision이 높으면 찾은 100개의 객체 중 올바르게 찾을 확률이 높습니다.
- 저희 회사는 실제로 'AUC-PR' 지표를 적극적으로 활용하여 객체 탐지 모델을 평가합니다.
2. AUC 평가지표의 '한계점'은 무엇인지
우리가 흔히 말하는 AUC-ROC 커브의 문제는 Biased Dataset에서의 평가가 정확하지 않다는 것입니다.
만약 음성 클래스가 99%인 데이터에서 대부분 음성을 예측하는 모델도 높은 AUC 점수를 얻을 수 있다는 것입니다.
- 조금 더 쉽게 표현하면 다음과 같습니다.
- 숫자 분류 모델이 있습니다.
- 이 모델은 학습이 덜 진행되어 '0'으로만 예측합니다.
- 테스트 데이터가 0이 90%이고, 나머지가 10%입니다.
- 이럴 때 AUC-ROC는 높은 점수가 나올 수 있습니다.
- 그러나 해당 숫자 분류 모델은 사실 0만 예측하는 모델로 '댕청'합니다!
따라서, AUC-PR 같은 보완 지표가 필요합니다.
3. AUC 평가지표 입코딩/수도코딩
AUC 수도코딩
- 1. 가로축(x) 값과 세로축(y) 값을 정렬된 순서로 준비
- 2. 인접한 x와 y 값들 사이의 사다리꼴 면적을 계산:
- 면적 = (이전 x - 현재 x) * (현재 y + 이전 y) / 2.
- 3. 모든 면적을 더하여 AUC 값을 계산
- 4. AUC 값을 출력
x = [0.0, 0.1, 0.4, 0.7, 1.0] # 가로축 값
y = [0.0, 0.3, 0.5, 0.9, 1.0] # 세로축 값
auc = 0
for i in range(1, len(x)):
auc += (x[i] - x[i - 1]) * (y[i] + y[i - 1]) / 2
print("AUC:", auc)
AUC-ROC 수도코딩
- 1. 예측 점수를 큰 값부터 작은 값 순으로 정렬해 임계값 리스트(thresholds)를 준비
- 2. 각 임계값에 대해 TP, FP, FN, TN을 계산:
- TP: 임계값 이상에서 실제 양성.
- FP: 임계값 이상에서 실제 음성.
- FN: 임계값 미만에서 실제 양성.
- TN: 임계값 미만에서 실제 음성.
- 3. TPR을 계산하여 저장
- 4. FPR을 계산하여 저장
- 5. 초기 AUC 값(auc_roc)을 0으로 설정
- 6. FPR과 TPR 값들 사이의 사다리꼴 면적을 계산
- 면적 = (이전 FPR - 현재 FPR) * (현재 TPR + 이전 TPR) / 2.
- 7. 모든 면적을 더해 AUC 값을 계산합니다.
- 8. AUC-ROC 값을 출력합니다.
AUC-PR 수도코딩
- 1. 예측 점수를 큰 값부터 작은 값 순으로 정렬해 임계값 리스트(thresholds)를 준비
- 2. 각 임계값에 대해 TP, FP, FN을 계산
- TP: 임계값 이상에서 실제 양성.
- FP: 임계값 이상에서 실제 음성.
- FN: 임계값 미만에서 실제 양성.
- 3. Precision(정밀도)을 계산하여 저장
- 4. Recall(재현율)을 계산하여 저장
- 6. 초기 AUC 값(auc_pr)을 0으로 설정
- 6. Recall과 Precision 값들 사이의 사다리꼴 면적을 계산
- 면적 = (이전 Recall - 현재 Recall) * (현재 Precision + 이전 Precision) / 2.
- 7. 모든 면적을 더해 AUC 값을 계산
- 8. AUC-PR 값을 출력합니다.
4. AUC 평가지표를 사용한 경험
AUC를 사용하는 경험은 너무 많습니다.
그중 기억에 남는 것은 처음 논문을 작성할 때입니다.
제 첫 논문이었던 [exe 파일의 opcode를 통한 바이러스탐지]를 수행할 때입니다.
본 논문은 exe파일에서 opcode를 추출하여 이미지 파일로 변환한 후, 이미지 분류를 수행하는 논문입니다.
학부 3학년 때 수행하던 연구였고, 매우 직관적이고 간단했습니다.
당시 평가지표보다 '모델링'에 많은 관심이 많았기에 평가 절차를 단순하게 생각했습니다.
당연하게도 분류모델 평가지표 중 가장 쉽고 간단한 Accuracy와 F1 Score를 사용하였습니다.
그러나, 평가하다 보니 베이스라인들이 일관된 성능을 보이지 않았고 들쑥날쑥 (Fluctuation)한 현상을 보였습니다.
확인해 보니 연구에 활용하고 있던 데이터셋이 어느 정도 불균형이 있었습니다.
본 연구의 실험 결과를 더욱 자세히 확인하기 위해 'AUC-ROC'와 'AUC-PR'을 사용하여 전체적으로 확인하였습니다.
본 연구는 성공적으로 MDPI symmetry 저널에 출판될 수 있었습니다.
또한, 20회 이상의 ciatation으로 후속 연구자들에게 기여를 하고 있습니다.
재밌는 건, 저는 이때 이후로 '평가 절차'에 많은 관심을 갖게 되었고 지표마다 한계점이 있다는 것을 알았습니다.
그 이후 WWW에 short paper로 '딥페이크 데이터셋 균형 평가 방법'이라는 논문을 제출한 적이 있습니다.
급하게 준비하고 성의를 쏟지 않았던 터라, 3 Strong Reject을 받았던 기억도 납니다.
평가절차를 항상 엄숙하고 확실히 하게 되는 제 개인적인 경험이었습니다 ㅎㅎ 😀
5. 나라면 Following Question을 어떻게 할 것인가?
제가 경험을 말하면서 F1 Score를 얘기했기 때문에 AUC-ROC와 F1 Score의 관계를 물어볼 것 같습니다.
그 이유는 두 지표 모두 분류 모델에서 흔히 쓰이는 지표인 동시에, 단일 성능만 측정하는 것이 아니기때문입니다.
두 지표 모두 복합적인 성능을 한 번에 표현하기 위해 사용되며 이러한 특징을 알고있는지 확인할 수 있습니다.
- AUC-ROC
- 전체적인 구분 능력을 평가
- 모든 임계값에서의 성능을 종합적으로 반영
- 데이터 불균형이 적을 때, 양성과 음성 간의 구분 능력을 측정하기 적합
- F1 Score
- 특정 임계값에서의 Precision과 Recall 간의 균형을 평가
- 특히, 데이터가 불균형한 경우, 양성 클래스에 대한 모델의 성능을 측정하는 데 유리
- 관계
- 두 지표는 서로 보완적으로 사용
- AUC-ROC는 모델의 전반적인 구분 능력을 평가
- F1 Score는 특정 상황에서 Precision과 Recall 간의 균형을 측정
- AUC-ROC가 높더라도 특정 임계값에서의 Precision과 Recall 간 균형이 깨지면 F1 Score가 낮아질 수 있음
AUC 하나로 이렇게 떠들 수 있다니 재밌었습니다.
제 답변에 대해서 우버 면접관 분들이 보셨다면 어떻게 피드백을 주실까요?
너무 궁금합니다.
인공지능 & 머신러닝 면접을 준비하시는 많은 분들께 도움이 되셨다면 좋겠습니다.
항상 응원합니다, 우리 같이 계속 성장합시다 !
'인공지능 생존일지 > 인공지능 리얼면접' 카테고리의 다른 글
[리얼 면접] 이것도 대답못하면 인공지능 & 머신러닝 엔지니어 가능할까? (2) | 2024.11.30 |
---|