본문 바로가기
인공지능 생존일지/인공지능 리얼면접

[리얼 면접] 우버 - Write an AUC from scratch using vanilla Python

by 재주스 2024. 11. 30.

안녕하세요, 재주스입니다.

리얼 면접 시리즈에 대한 소개는 아래를 참고해 주세요.

 

 

[리얼 면접] 이것도 대답못하면 인공지능 & 머신러닝 엔지니어 가능할까?

안녕하세요, 재주스입니다. 죄송합니다, 제목이 신전떡볶이 처럼 자극적이였습니다.하지만 단순히 주목을 끌기 위해서 그런 것은 아닙니다.‘이것도 대답 못하면 인공지능 & 머신러닝 엔지니

jaeju.tistory.com


우버의 머신러닝 엔지니어 면접 중 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)한 현상을 보였습니다.

확인해 보니 연구에 활용하고 있던 데이터셋이 어느 정도 불균형이 있었습니다.

 

실제로 사용하였던 데이터셋. Microsfot의 Open 바이러스 데이터셋이다.

 

 

본 연구의 실험 결과를 더욱 자세히 확인하기 위해 '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 하나로 이렇게 떠들 수 있다니 재밌었습니다.

제 답변에 대해서 우버 면접관 분들이 보셨다면 어떻게 피드백을 주실까요?

너무 궁금합니다.

 

인공지능 & 머신러닝 면접을 준비하시는 많은 분들께 도움이 되셨다면 좋겠습니다.

항상 응원합니다, 우리 같이 계속 성장합시다 !