2009/02/01 14:37
if (IR or NLP)
떨어진 미션이 있어서 통계 공부를 좀 하고, 공부한 내용을 정리해 봤습니다. 내용을 요약하자면, 검색엔진의 정확도를 평가했을 때, 그 평가가 얼마나 신뢰할만한지 통계학의 정규분포 이론을 이용해서 계산하고, 설명하는 내용입니다. 이 포스트를 이해하면 팀장과 이런 대화를 나눌 수 있습니다.
일의 출발은 이렇습니다.
우리가 개발한 검색엔진의 정확도를 측정하려고 합니다. 정확도는 재현율일 수도 있고, 정확률일 수도 있고, F-measure일 수도 있습니다. 그냥 통칭해서 정확도라고 하겠습니다. 정확도를 측정하기 위해서 수작업을 통해서 정답셋을 만들기로 했습니다.
어떤 질의 Q에 대한 정답셋은 아래와 같이 만듭니다.
1. 검색엔진이 색인하는 모든 문서에서 n개의 문서를 샘플링합니다.
2. n개의 샘플 문서를 사람이 하나씩 하나씩 읽어가며 질의 Q에 대해서 검색결과로 올바른지 아닌지 체크를 합니다.
3. 체크된 n개의 샘플 문서를 질의 Q에 대한 정답셋이라고 합니다.
정답셋을 이용해서 질의 Q에 대해 검색엔진의 정확도는 다음과 같이 측정합니다.
1. 검색엔진에 질의 Q를 실행하면 검색 결과가 주루룩 나올 것입니다.
2. n개의 샘플 문서를 하나씩 하나씩 검토합니다.(검색 결과를 하나씩 살피는게 아닙니다.)
- 각각의 문서에 대해 정답셋에서 체크한 내용과 검색엔진의 판단이 같으면 검색엔진이 정답을 맞춘것입니다.
- 반대로 판단이 다르면, 즉, 정답셋에는 이 문서는 이 질의에 나와야 된다 그러는데 검색엔진이 이 문서를 안찍었다든가, 아니면 정답셋에는 이 문서가 이 질의에 안 맞다고 그랬는데 검색엔진 결과에 포함되었을 때 검색엔진이 틀린 답을 낸 것입니다.
3. 여기까지 하면, 질의 Q에 대해서 검색엔진이 n개의 문제를 풀어서 맞춘게 몇개, 틀린게 몇개 그래서 점수는 몇점 이렇게 성적표를 받게 됩니다.
여기서 질문이 하나 생깁니다.
검색엔진한테 10개의 문제를 풀게하는 것보다는 당연히 100개의 문제를 풀게 하는게 실력을 파악하는데 더 정확할 것입니다. 엔진은 지치지 않으니까 당연히 다다익선! 더 많은 문제를 풀게 할 수록 우리가 얻는 점수는 더 신뢰할 수 있는 점수 일 것입니다. 그런데 문제는 엔진이 지치는게 아니라, 사람이 지친다는 것입니다. 정답셋을 만드는 과정은 만일 100만개의 문서를 샘플링했다면 100만개의 문서를 하나씩 읽어가며 질의에 적합한 문서인지 아닌지 체크를 해야 합니다. 그러니까, '많을 수록 좋은건 알아, 하지만, 적어도 몇개의 문서를 샘플링하면 믿을만 한거야?' 이것이 문제입니다.
결론부터 얘기하자면 통계학을 이용하면 위의 질문에 대해서 직접적인 답은 못주지만, 다음과 같이 결론을 이야기할 수는 있습니다.
음... 뭐랄까 신중하지만 정확한 설명입니다. 샘플의 개수를 좀더 늘리면서 똑같이 95%의 신뢰도로 정확도가 얼만지 측정하면, 이번에는 구간이 좁아질 것입니다.
바로, 지체 없이, 공식과 예제 들어가도록 하겠습니다.
샘플 문서의 개수가 n개, 검색엔진 돌려서 채점한 결과 r개가 맞았을 때, 이 검색엔진의 정확도를 N% 만큼 신뢰도로 구하면 다음과 같은 구간을 구할 수 있습니다.

여기서 Z(N)은 신뢰도에 따라 값이 달라지는데 95% 신뢰도로 구하고 싶으면, 1.96이라는 값을 사용하면 되고, 90% 신뢰도로 구하고 싶으면 1.64라는 작은 값을 사용하게 됩니다. 좀 낮은 신뢰도로 말하면 더 좁은 구간을 제시할 수 있다 이런 얘기입니다.
위 식을 사용하는 예제 들어갑니다.
"이 검색엔진의 정확도는 0.79216 ~ 0.80784 일 확률이 95% 입니다." 라고 더 정확하게 얘기할 수 있게됩니다.
얘기가 이정도 진행되면, 지금 정규분포(Normal Distribution)를 얘기하려 한다는 것을 알만한 사람은 다 알 수 있을 것입니다. Z(N) = 1.96 이 숫자도 통계책 부록 표준 정규분포표에서 따온 숫자입니다.
그렇다면, 도대체 뭐가 정규분포를 따른다는 얘기일까요? 이 질문이 가장 핵심적인 부분입니다.
'의'를 중첩해서 대단히 죄송합니다만, 이 포스트를 이해하고 싶으신 분은 이 문장이 가슴에 와닿을 때까지 반복해서 읽으셔야만 합니다. 도저히 와닿지 않으면, 아래 그림의 x축과 y축을 곱씹고 다시 저 문장이 와닿을 때까지 읽어보십시오.
즉, 다음과 같은 정규분포입니다.
이 그래프의 경우 검색엔진의 정확도가 60%일 확률이 가장 높습니다. 검색엔진의 정확도가 50%일 확률과 70%일 확률은 같습니다. 즉, 대칭입니다.
우리가 저 위의 식을 사용하겠다는 것은 검색엔진의 정확도가 이 그래프처럼 생긴 정규분포라고 가정하겠다는 뜻입니다.
그런데, 무슨 근거로 검색엔진의 정확도가 정규분포라고 함부로 가정을 할 수가 있는 것일까요? 여기서 통계 이론 하나가 더 필요합니다.
검색엔진이 정답을 맞춘 횟수의 분포는 이항분포(이항분포가 뭔지는 잠깐만 홀딩)입니다. 이항분포는 샘플의 개수가 충분히 크다면 정규분포가 됩니다. 정답을 맞춘 횟수를 샘플의 개수 n으로 나눈 정확도의 분포 또한 정규분포가 됩니다.
정리하자면, 검색엔진의 정답 맞추기의 확률분포는 이항분포입니다. 이항분포에서 샘플 개수가 충분히 크면 정규분포입니다. 정규분포라면 저 위의 공식에다가 샘플의 개수와 샘플에서 측정한 정확도를 대입하여, 검색엔진의 진짜 정확도를 추정(Estimation)할 수가 있습니다. 그럼 마지막으로 이항분포가 뭔지, 검색엔진의 정답 맞추기가 왜 이항분포인지를 설명하고 마치도록 하겠습니다.
통계학에서 성공-실패 두 가지 경우의 수가 존재하는 독립적인 실행을 n번 반복하는 것을 베르누이 시행(Bernoulli Trial)이라고 합니다. 베르누이 시행에서 성공 횟수의 확률 분포를 이항분포라고 합니다. 베르누이 시행의 대표적인 예로 찌그러진 동전 던지기를 들 수 있습니다. 이 실험의 목적은 찌그러진 동전이 앞면 몇% 짜리 동전인지 알아보는 것입니다. 이 것을 알아보기 위해 100번을 던져봤더니 앞면이 70번 나왔습니다. 이게 한번의 n=100짜리 베르누이 시행입니다. 첫번째 베르누이 시행의 결과는 이 동전은 앞면 70% 짜리 동전입니다. 두번째 베르누이 시행을 하면 아마 70번 언저리의 어떤 숫자가 또 나올 것입니다. 베르누이 시행을 여러번 하면 이 동전에 대해서 다음과 같이 얘기할 수 있을 것입니다.
"이 동전은 n=100짜리 베르누이 시행을 했을 때 앞면이 70번 나올 확률이 30%, 69번 나올 확률이 10%, 68번 나올 확률이 7%..."
이 내용을 그래프로 그리면 이 동전의 이항분포가 되는 것입니다.
우리 검색엔진의 정확도 평가 또한 이항분포를 따릅니다. n=100 이라면 100개의 문서 각각에 대해 결과를 맞추는지 못맞추는지 판단합니다. 즉, 동전을 100번 던집니다. 통계학 정리에 따르면 n이 충분히 큰 이항 분포는 정규분포로 가정할 수 있다고 합니다. 일반적으로(Rule of Thumb) n>=30 정도면 정규분포로 볼 수 있고, np(1-p) > 5 라는 식으로도 최소한의 n을 산정할 수가 있습니다. 여기서 p는 검색엔진의 진짜(궁극적인, 실제의)정확도인데, 그건 우리가 구하고자 하는 그 자체이므로, 실험에서 구해지는 추정치(즉, 맞춘개수/n)를 대입하면 될 것입니다.
마지막으로 정리 한번 더 하겠습니다. 반복 또 반복...
검색엔진의 정답 맞추기는 동전 던지기처럼 베르누이 시행이고, 확률분포는 이항분포입니다. 이항분포이므로 샘플개수가 충분히 크면 정규분포 가정을 이용할 수 있습니다. 정규분포 가정을 이용하면 저 위의 식을 이용하여 검색엔진의 정확도를 계산하고 그 결과를 다음과 같이 얘기할 수 있습니다.
"이 검색엔진의 정확도는 0.85~0.95일 확률이 95%이다."
이 말을 통계학적인 용어로 바꿔말하면 "95% 신뢰구간에서 +- 0.05의 오차를 가진다" 라고 얘기합니다.
만일 더 많은 샘플을 사용한다면 같은 신뢰구간에서 더 작은 오차를 가지게 될 것입니다.
-----------------------------------------------------------------------------------------------------------------
제가 정규분포에 대해 스터디를 하게 된 것은 두가지 질문에 답을 얻기 위한 것이었습니다.
첫째, 우리가 할 검색엔진 평가 작업에 대해서 정규분포 가정을 적용할 수 있을까?
둘째, 신뢰도를 95%로 고정하면 몇개의 문서를 샘플링을 해야 하나?
첫번째 질문에 대해서는 검색엔진 평가가 베르누이 시행이라는 설명으로 해결했다고 할 수 있습니다만, 둘째 질문에 대해서는 정규분포 이론에 대해서 무지했었다는 것을 알게 되었습니다. 샘플링은 다다익선이고 샘플이 적으면 오차 범위가 넓어지는 것이 공식이 설명하는 바였습니다. 아 물론, 이항분포가 정규분포가 되기 위해서 샘플이 30개는 넘어야 한다는 사실은 알게 되었습니다.
A: 우리 검색엔진의 정확도는 85~90%입니다.
팀장: 그 말 몇 %나 신뢰할 수 있지?
A: 믿어주세요. 95% 확실합니다.
팀장: 그 말 몇 %나 신뢰할 수 있지?
A: 믿어주세요. 95% 확실합니다.
일의 출발은 이렇습니다.
우리가 개발한 검색엔진의 정확도를 측정하려고 합니다. 정확도는 재현율일 수도 있고, 정확률일 수도 있고, F-measure일 수도 있습니다. 그냥 통칭해서 정확도라고 하겠습니다. 정확도를 측정하기 위해서 수작업을 통해서 정답셋을 만들기로 했습니다.
어떤 질의 Q에 대한 정답셋은 아래와 같이 만듭니다.
1. 검색엔진이 색인하는 모든 문서에서 n개의 문서를 샘플링합니다.
2. n개의 샘플 문서를 사람이 하나씩 하나씩 읽어가며 질의 Q에 대해서 검색결과로 올바른지 아닌지 체크를 합니다.
3. 체크된 n개의 샘플 문서를 질의 Q에 대한 정답셋이라고 합니다.
정답셋을 이용해서 질의 Q에 대해 검색엔진의 정확도는 다음과 같이 측정합니다.
1. 검색엔진에 질의 Q를 실행하면 검색 결과가 주루룩 나올 것입니다.
2. n개의 샘플 문서를 하나씩 하나씩 검토합니다.(검색 결과를 하나씩 살피는게 아닙니다.)
- 각각의 문서에 대해 정답셋에서 체크한 내용과 검색엔진의 판단이 같으면 검색엔진이 정답을 맞춘것입니다.
- 반대로 판단이 다르면, 즉, 정답셋에는 이 문서는 이 질의에 나와야 된다 그러는데 검색엔진이 이 문서를 안찍었다든가, 아니면 정답셋에는 이 문서가 이 질의에 안 맞다고 그랬는데 검색엔진 결과에 포함되었을 때 검색엔진이 틀린 답을 낸 것입니다.
3. 여기까지 하면, 질의 Q에 대해서 검색엔진이 n개의 문제를 풀어서 맞춘게 몇개, 틀린게 몇개 그래서 점수는 몇점 이렇게 성적표를 받게 됩니다.
여기서 질문이 하나 생깁니다.
몇개의 문서를 샘플링해야 위에서 계산한 검색엔진의 성적이 믿을만 할까?
검색엔진한테 10개의 문제를 풀게하는 것보다는 당연히 100개의 문제를 풀게 하는게 실력을 파악하는데 더 정확할 것입니다. 엔진은 지치지 않으니까 당연히 다다익선! 더 많은 문제를 풀게 할 수록 우리가 얻는 점수는 더 신뢰할 수 있는 점수 일 것입니다. 그런데 문제는 엔진이 지치는게 아니라, 사람이 지친다는 것입니다. 정답셋을 만드는 과정은 만일 100만개의 문서를 샘플링했다면 100만개의 문서를 하나씩 읽어가며 질의에 적합한 문서인지 아닌지 체크를 해야 합니다. 그러니까, '많을 수록 좋은건 알아, 하지만, 적어도 몇개의 문서를 샘플링하면 믿을만 한거야?' 이것이 문제입니다.
결론부터 얘기하자면 통계학을 이용하면 위의 질문에 대해서 직접적인 답은 못주지만, 다음과 같이 결론을 이야기할 수는 있습니다.
1만개의 문서를 샘플링해서 측정한 이 검색엔진의 정확도는 0.7 ~ 0.9일 확률이 95% 입니다.
음... 뭐랄까 신중하지만 정확한 설명입니다. 샘플의 개수를 좀더 늘리면서 똑같이 95%의 신뢰도로 정확도가 얼만지 측정하면, 이번에는 구간이 좁아질 것입니다.
2만개로 샘플을 늘려서 측정한 이 검색엔진의 정확도는 0.75~0.85일 확률이 95% 입니다.
바로, 지체 없이, 공식과 예제 들어가도록 하겠습니다.
샘플 문서의 개수가 n개, 검색엔진 돌려서 채점한 결과 r개가 맞았을 때, 이 검색엔진의 정확도를 N% 만큼 신뢰도로 구하면 다음과 같은 구간을 구할 수 있습니다.
여기서 Z(N)은 신뢰도에 따라 값이 달라지는데 95% 신뢰도로 구하고 싶으면, 1.96이라는 값을 사용하면 되고, 90% 신뢰도로 구하고 싶으면 1.64라는 작은 값을 사용하게 됩니다. 좀 낮은 신뢰도로 말하면 더 좁은 구간을 제시할 수 있다 이런 얘기입니다.
위 식을 사용하는 예제 들어갑니다.
예제> 1000개의 문서를 샘플링 해서 검색엔진이 800개를 맞췄다. 95% 신뢰구간으로 검색엔진의 정확도를 설명하라.
풀이> x=800/1000 = 0.8 이고, Z(N) 루트 어쩌구 하는 식은 1.96X루트(0.8X0.2/1000)=0.02479 이므로
"이 검색엔진의 정확도는 0.77521 ~ 0.82479 일 확률이 95% 입니다." 라고 얘기할 수 있습니다.
샘플링 하는 문서 개수를 10000개로 늘려보고, 같은 비율인 8000개를 맞췄다면 이번에는 Z(N) 루트 어쩌구 하는 식이 1.96X루트(0.8X0.2/10000)=0.00784 이므로풀이> x=800/1000 = 0.8 이고, Z(N) 루트 어쩌구 하는 식은 1.96X루트(0.8X0.2/1000)=0.02479 이므로
"이 검색엔진의 정확도는 0.77521 ~ 0.82479 일 확률이 95% 입니다." 라고 얘기할 수 있습니다.
"이 검색엔진의 정확도는 0.79216 ~ 0.80784 일 확률이 95% 입니다." 라고 더 정확하게 얘기할 수 있게됩니다.
얘기가 이정도 진행되면, 지금 정규분포(Normal Distribution)를 얘기하려 한다는 것을 알만한 사람은 다 알 수 있을 것입니다. Z(N) = 1.96 이 숫자도 통계책 부록 표준 정규분포표에서 따온 숫자입니다.
그렇다면, 도대체 뭐가 정규분포를 따른다는 얘기일까요? 이 질문이 가장 핵심적인 부분입니다.
우리가 만든 검색엔진의 정확도의 확률분포는 정규분포이다.
'의'를 중첩해서 대단히 죄송합니다만, 이 포스트를 이해하고 싶으신 분은 이 문장이 가슴에 와닿을 때까지 반복해서 읽으셔야만 합니다. 도저히 와닿지 않으면, 아래 그림의 x축과 y축을 곱씹고 다시 저 문장이 와닿을 때까지 읽어보십시오.
즉, 다음과 같은 정규분포입니다.
이 그래프의 경우 검색엔진의 정확도가 60%일 확률이 가장 높습니다. 검색엔진의 정확도가 50%일 확률과 70%일 확률은 같습니다. 즉, 대칭입니다.
우리가 저 위의 식을 사용하겠다는 것은 검색엔진의 정확도가 이 그래프처럼 생긴 정규분포라고 가정하겠다는 뜻입니다.
그런데, 무슨 근거로 검색엔진의 정확도가 정규분포라고 함부로 가정을 할 수가 있는 것일까요? 여기서 통계 이론 하나가 더 필요합니다.
이항분포(Binomial Distribution)에서 샘플의 개수 n이 충분히 크다면 그 이항분포는 정규분포이다.
검색엔진이 정답을 맞춘 횟수의 분포는 이항분포(이항분포가 뭔지는 잠깐만 홀딩)입니다. 이항분포는 샘플의 개수가 충분히 크다면 정규분포가 됩니다. 정답을 맞춘 횟수를 샘플의 개수 n으로 나눈 정확도의 분포 또한 정규분포가 됩니다.
정리하자면, 검색엔진의 정답 맞추기의 확률분포는 이항분포입니다. 이항분포에서 샘플 개수가 충분히 크면 정규분포입니다. 정규분포라면 저 위의 공식에다가 샘플의 개수와 샘플에서 측정한 정확도를 대입하여, 검색엔진의 진짜 정확도를 추정(Estimation)할 수가 있습니다. 그럼 마지막으로 이항분포가 뭔지, 검색엔진의 정답 맞추기가 왜 이항분포인지를 설명하고 마치도록 하겠습니다.
통계학에서 성공-실패 두 가지 경우의 수가 존재하는 독립적인 실행을 n번 반복하는 것을 베르누이 시행(Bernoulli Trial)이라고 합니다. 베르누이 시행에서 성공 횟수의 확률 분포를 이항분포라고 합니다. 베르누이 시행의 대표적인 예로 찌그러진 동전 던지기를 들 수 있습니다. 이 실험의 목적은 찌그러진 동전이 앞면 몇% 짜리 동전인지 알아보는 것입니다. 이 것을 알아보기 위해 100번을 던져봤더니 앞면이 70번 나왔습니다. 이게 한번의 n=100짜리 베르누이 시행입니다. 첫번째 베르누이 시행의 결과는 이 동전은 앞면 70% 짜리 동전입니다. 두번째 베르누이 시행을 하면 아마 70번 언저리의 어떤 숫자가 또 나올 것입니다. 베르누이 시행을 여러번 하면 이 동전에 대해서 다음과 같이 얘기할 수 있을 것입니다.
"이 동전은 n=100짜리 베르누이 시행을 했을 때 앞면이 70번 나올 확률이 30%, 69번 나올 확률이 10%, 68번 나올 확률이 7%..."
이 내용을 그래프로 그리면 이 동전의 이항분포가 되는 것입니다.
우리 검색엔진의 정확도 평가 또한 이항분포를 따릅니다. n=100 이라면 100개의 문서 각각에 대해 결과를 맞추는지 못맞추는지 판단합니다. 즉, 동전을 100번 던집니다. 통계학 정리에 따르면 n이 충분히 큰 이항 분포는 정규분포로 가정할 수 있다고 합니다. 일반적으로(Rule of Thumb) n>=30 정도면 정규분포로 볼 수 있고, np(1-p) > 5 라는 식으로도 최소한의 n을 산정할 수가 있습니다. 여기서 p는 검색엔진의 진짜(궁극적인, 실제의)정확도인데, 그건 우리가 구하고자 하는 그 자체이므로, 실험에서 구해지는 추정치(즉, 맞춘개수/n)를 대입하면 될 것입니다.
마지막으로 정리 한번 더 하겠습니다. 반복 또 반복...
검색엔진의 정답 맞추기는 동전 던지기처럼 베르누이 시행이고, 확률분포는 이항분포입니다. 이항분포이므로 샘플개수가 충분히 크면 정규분포 가정을 이용할 수 있습니다. 정규분포 가정을 이용하면 저 위의 식을 이용하여 검색엔진의 정확도를 계산하고 그 결과를 다음과 같이 얘기할 수 있습니다.
"이 검색엔진의 정확도는 0.85~0.95일 확률이 95%이다."
이 말을 통계학적인 용어로 바꿔말하면 "95% 신뢰구간에서 +- 0.05의 오차를 가진다" 라고 얘기합니다.
만일 더 많은 샘플을 사용한다면 같은 신뢰구간에서 더 작은 오차를 가지게 될 것입니다.
-----------------------------------------------------------------------------------------------------------------
제가 정규분포에 대해 스터디를 하게 된 것은 두가지 질문에 답을 얻기 위한 것이었습니다.
첫째, 우리가 할 검색엔진 평가 작업에 대해서 정규분포 가정을 적용할 수 있을까?
둘째, 신뢰도를 95%로 고정하면 몇개의 문서를 샘플링을 해야 하나?
첫번째 질문에 대해서는 검색엔진 평가가 베르누이 시행이라는 설명으로 해결했다고 할 수 있습니다만, 둘째 질문에 대해서는 정규분포 이론에 대해서 무지했었다는 것을 알게 되었습니다. 샘플링은 다다익선이고 샘플이 적으면 오차 범위가 넓어지는 것이 공식이 설명하는 바였습니다. 아 물론, 이항분포가 정규분포가 되기 위해서 샘플이 30개는 넘어야 한다는 사실은 알게 되었습니다.


댓글을 달아 주세요
흠흠, 회사에서는 윗분의 감성 척도가 평가 기준 아닐까요? ㅎㅎㅎ