단일 실수 평가 척도

실수로 된 평가 척도가 하나 있다면 머신러닝 모델을 개선시키는 데 상당한 도움이 될 것이다.

분류기(모델) 정밀도 재현율
A 95% 90%
B 98% 85%

경험적인 과정을 통해 위와 같은 두 개의 모델을 만들었다고 하자. 정밀도는 모델이 분류한 정답 중에 진짜 정답이 얼만큼 있는지를 측정한다. 재현율은 실제 정답 중에 모델이 정답을 얼만큼 분류했는지를 측정한다.

정밀도와 재현율은 보통 상충관계(trade-off) 관계에 있다고 알려져 있다. 그러나 우리는 어느 하나도 포기할 수 없다.

따라서 우리는 새로운 수치를 도입할 수 있다. 일명 'F1 점수'다. F1 점수는 쉽게 생각해서 정밀도와 재현율의 평균이다. 더 정확하게는 조화평균으로, $\frac{2}{\frac{1}{P}+\frac{1}{R}}$로 구한다.

정밀도와 재현율 계산에는 dev set를 이용한다. Dev set와 하나의 정략적(실수) 평가 척도를 사용하게 되면 더 빠른 모델선택이 가능하다. 이를 통해 알고리즘 개선의 순환 속도를 향상시킬 수 있다.


단일 실수 평가 척도를 세울 수 없다면?

그러나 모든 상황에서 위처럼 평균을 이용해 척도를 세울 수 있는 것은 아니다.

예를 들어 모델의 정밀도와 구동 시간을 동시에 고려한다고 해보자. 정밀도는 백분율(%)의 수치이고, 구동 시간은 ms의 수치이다. 평균을 구하는 것은 불가능하다.

대안으로 사용할 수 있는 한 가지 방법은 새로운 비용함수를 정의하는 것이다. 정밀도와 구동 시간을 적절히 스케일링한 공식을 세울 수 있다.

또다른 방법으로는 최적화 척도와 조건 척도를 사용하는 것이다. 최적화 척도는 말 그대로 최적화 해야하는 척도로, 모델을 고를 때 일단 이 척도가 가장 뛰어난 것을 선택한다. 조건 척도는 상대적으로 중요도가 떨어지는 척도이며, 일정한 조건만 성립하면 된다. 앞선 예시에서 최적화 척도가 정밀도, 조건 척도가 구동 시간이라고 해보자. 일단 구동 시간이 내가 선택한 최대 허용치 미만(ex. $\leq 1000$ ms)인 모델을 추린 뒤, 그 중에서 가장 정밀도가 뛰어난 모델을 선택하면 된다.

N개의 척도가 있다고 할 때, 1개의 최적화 척도와 N-1개의 조건 척도를 설정하는 것이 일반적이다.

다른 예시를 하나 더 보자. 우리는 인공지능 비서를 부를 때 ‘OK Google’, ‘시리야’ 등으로 부르곤 한다. 이런 단어들을 유발 단어(Wake words)라고 한다. AI비서를 개발할 때는 유발 단어를 오인하지 않는 것이 중요할 것이다. 유발 단어 인식에서 정밀도와 위양성(유발 단어를 말하지 않은 경우에 장치가 일어남) 횟수가 있다고 하면, 정밀도를 최적화 척도, 위양성 빈도를 조건 척도로 둘 수 있다.


Dev set, test set의 분포

고양이 분류 프로그램을 개발할 때, 미국, 영국, 중국, 유럽, 오스트레일리아 등 다양한 지역의 고양이 사진을 이용할 수 있을 것이다. 그런데 dev set과 test set을 정한답시고 미국, 영국, 유럽, 아프리카의 사진을 dev set, 인도, 중국, 오스트레일리아의 사진을 test set으로 둘 생각을 했다면 유감스럽지만 매우 나쁜 결정이다. 서로 다른 지역의 사진들은 다른 분포를 가질 것이고, dev set과 test set의 분포가 확연히 차이 나면 제대로 된 모델을 만들 수 없다.

또다른 실제 사례도 있다. 어떤 연구진이 대출 승인에 관한 모델을 만들기 위해 중산층의 우편번호 데이터를 dev set으로 이용했다. 이렇게 개발한 모델의 test set으로 그들은 저소득층의 우편번호 데이터를 선정했다(도대체 왜?). 당연히 확연한 분포 차이를 보이는 집합들이었기에 그들은 3개월 가량의 개발 기간을 날린 꼴이 되었다.

Dev set과 test set은 미래에 얻을 것으로 예상되고, 좋은 결과를 내는 중요한 데이터를 반영해야 한다. 또, 둘의 분포가 동일해야 한다.

올림픽 양궁은 70m 거리에서 진행된다. 훈련을 30m에서 하고, 실전에서 처음 70m를 도전할 필요는 없지 않은가?


Dev set과 test set의 크기

이 이야기는 전에도 잠깐 한 적이 있다.

집합의 크기 복습하기

요약하자면, 현대 빅데이터 시대에는 전체 데이터의 98%를 train set, 나머지 1%씩을 dev set, test set으로 설정해도 충분하다.

현실에서 벌어지는 일을 하나만 짚고 넘어갈 필요가 있다. 현실에서 대부분의 사람들이 dev set 없이 train set과 test set으로 모델을 개발한다고 이야기 한다. 그러나 그렇게 말해놓고 test set으로 개발 과정을 반복하는 경우가 태반이다. 즉, test set이 사실상 dev set인 것이다. 용어를 정확히 할 필요가 있다.


척도 바꾸기

고양이 사진 선별 프로그램의 척도를 ‘분류 오류’로 결정했다고 하자. A 모델은 3%, B 모델은 5%의 오류를 보인다. 그런데 A 모델은 고양이 사진이 아닌 성인용 사진을 가끔 보여준다. 어떤 모델을 선택해야 할까?

수치적으로는 분명 A가 뛰어나다. 우리가 정한 척도를 고려해도 그렇다. 그러나 개발자와 사용자에게는 B가 더 나을 것이다. A를 선택해서 서비스를 개시했다가는 얼마 못 가 음란물 유포 혐의로 구속되고 말 것이다.

이럴 경우 평가 척도를 살짝 비틀어서 우리가 원하는 결과를 만들 수 있다. 원래 오류값을 다음과 같이 구한다고 해보자.

$\frac{1}{m_{dev}}\displaystyle \sum_{i=1}^{m_{dev}}{I\lbrace y_{pred}^{(i)} \neq y^{(i)}\rbrace}$

I는 이어지는 중괄호가 성립하면 1, 아니면 0의 값을 가진다.

성인용 사진의 경우 가중치(w)를 가지도록 위 식을 변경해보자.

$\frac{1}{\sum{w^{(i)}}}\displaystyle \sum_{i=1}^{m_{dev}}{w^{(i)}I\lbrace y_{pred}^{(i)} \neq y^{(i)}\rbrace}$

$w^{(i)}$는 사진이 성인용일 경우 10, 아니면 1의 값을 가지도록 한다.


데이터 변경하기

앞선 척도 바꾸기에서는 어떻게 척도를 정할지를 주로 고민했다. 과녁을 어디에 놓을지를 결정하는 단계였던 것이다. 우리는 그 다음으로 그 과녁을 어떻게 맞출지, 즉 척도를 어떻게 만족시킬지(좋은 성능을 낼지)를 고민해야 한다.

좋은 성능을 이끌어내기 위해서는 데이터를 변경하는 방법을 생각할 수 있다. 실제 모델에 사용될 데이터를 엄선해서 개발한다면 좋은 성능을 가지는 모델을 만들 수 있을 것이다.

댓글남기기