Tokenizer에서 토큰을 어떤 식으로 추출하느냐가 필터 성능에 영향을 많이 미친다고 한다. 뽑아낸 토큰에 기존 통계값을 할당해주는데, 여기에도 몇 가지 변형이 있다.
일단 토큰에 값을 할당할 때는 여러 가지 방법이 있겠지만..
Graham이 썼던 수식은 아래와 같다. 약간 공격적으로 스팸을 분류한다.
SH : 이 토큰이 스팸에 몇 번 포함되었나.
IH : 이 토큰이 정상적인 메일에 몇 번 포함되었나.
TS : 전체 스팸 메일 수
TI : 전체 정상적인 메일 수
Robinson은 Graham의 수식을 보정해서 false positive를 줄였다.
N : 토큰이 데이터셋에 몇 번 등장했나 (스팸이든 아니든)
X : 이 토큰에 대한 기록이 없다면 할당할 값. 보통 0.5에서 상황봐서 조정하는게 적당함.
S : 필터 성능 튜닝할 때 쓰는 보정값. 당연히 기본값은 1.
P(W) : Graham 수식으로 계산한 값
Single-Corpus Tokens
어떤 단어는 한쪽 Corpus에만 나타나는 경우가 있는데, 사실 어떤 단어가 나오면 항상 반드시! 스팸이라고 말할 수 있는 것은 아니다. 100%는 99% 정도, 0%는 1% 정도로 보정해준다.
A Biased filter
Graham의 경우 false positive 때문에 IH만 2배로 보정. 워낙 상대적으로 정상 메일이 적기 때문에 이렇게 한 것이다.
Hapaxes
한 번도 본 적이 없는 Token이 나온 경우는 어떻게 할 것인가. 또는 그 단어를 판단할 근거 데이터가 충분하지 않은 경우는 어떻게 할 것인가? 이런 토큰은 hapaxes라고 부른다. 몇 번 이상 발생하지 않았다면 상대적으로 중간 값에 가까운 값을 할당해준다. hapaxial value라고 해서 0.4나 0.5 정도를 할당해준다. 이런 중성적인 값을 쓰는 이유는 스패머들이 고의로 쓰레기 단어를 막 섞어넣는 경우가 많기 때문이다. 그렇다고 아예 스팸으로 분류하자니 사용자 메일 습관이 바뀌어서 단어가 추가되는 경우도 있기 때문에 애매하다. 따라서 기껏해야 판단 근거로 안 쓰게 중간에 가까운 값을 할당하는게 유일한 선택지라고 하겠다. 여담으로, 이런 방식을 사용하고 있기 때문에 스팸에 소설 써봐야 베이지안 필터를 속이긴 힘들다.
이것을 Analysis Engine에 들여보내서 Decision Matrix를 생성하고 전체 값을 계산해낸다. 보통 대부분의 베이지안 필터는 15에서 27개 정도의 가장 편향된 값들을 골라서 (peak window value) 결과를 계산해낸다. 결과는 중간값이 거의 없고 대단히 편향적으로 (0에 아주 가깝거나 100에 아주 가깝거나..) 90을 넘으면 스팸으로 분류해주면 된다.
피드백은 프로토콜이나 인터페이스에 따라 다양한 방식이 있겠지만, 어쨌거나 통계 데이터셋을 보정한다는 점에선 다른게 없다.
훈련 방식은 크게 4가지로 나뉘는데, 각각 장단점이 있다.
Training Everything (TEFT)
Unsupervised Learning이라고 부르기도 한다. 새로운 유형의 데이터에 빨리 반응할 수 있는 장점을 가지고 있다. 대부분의 통계적 필터가 지원하는 방식이긴 한데 항상 추천되는 방식은 아니다. 스팸이 상대적으로 너무 많이 들어오는 경우에는 정상적인 메일 자체를 받을 기회가 매우 적어지기 때문에, 아무리 수학 공식이 커다란 데이터 편향을 용인해준다고 해도 오류가 발생할 가능성이 커지게 된다. 게다가 계속해서 데이터셋을 쌓아가기 때문에 용량 문제도 있다. 어쨌거나 이런 결점에도 불구하고 대부분의 사용자들에게는 굉장히 뛰어난 성능을 보여준다. 대체로 70% 정도의 비율로 스팸을 받는 경우 TEFT로 좋은 성능을 얻을 수 있다.
Train-on-Error (TOE)
에러가 날 때만 피드백을 통해 보정하는 방식을 쓴다. 용량을 덜 차지하기 때문에 시스템 관리자들이 좋아하는 방식이다. 그렇지만 TOE의 장점이 반대로 약점이라 할 수 있다. 새로운 유형의 메일에 대응하는 속도가 느리다는 것이다. 뉴스 그룹을 자주 바꾼다든지 메일 사용 패턴이 자주 달라지는 사용자라면 잦은 false positive 때문에 짜증이 날 수 있다. 마찬가지로 스팸 진화 속도에 따라가지 못하는 문제도 발생할 수 있다. TOE는 굉장히 높은 비율로 스팸을 받는 경우 (90% 이상) 또는 많은 양의 메일을 받는 경우 (하루에 5000건 이상) 대체로 잘 동작한다. 메일 패턴이 계속 바뀌는 사용자에게는 적합하지 않다.
Train-Until-Mature (TUM)
TUM은 TEFT와 TOE의 절충안이다. SpamProbe나 DSPAM 같은 스팸 필터에서 지원한다. 한 번 각 토큰을 어떻게 분류할지 결정되고 나면 실수하기 전엔 결정을 뒤집지 않는다. TEFT처럼 새로운 유형의 데이터를 계속 학습하지만 개별 토큰이 충분한 데이터를 모았다고 생각되면 학습을 중단한다. TUM의 장점은 새로운 데이터를 받을 때 나타난다. 새로운 데이터는 즉시 반영하고, 그 외에는 에러가 발생할 때만 재학습한다.
Train-Until-No-Errors (TUNE)
CRM114 Descriminator 같은 제품에서 지원하는 모드. 좀 무식해보이는데 에러가 없을 때까지 무한정 학습한다. 만약 에러가 발생하면.. 정말 무식해보이는데 전체 Corpus를 처음부터 다시 학습시켜야 한다. 대량으로 메일을 받는 사용자에겐 별로 실용적이지 않다.
일단 토큰에 값을 할당할 때는 여러 가지 방법이 있겠지만..
Graham이 썼던 수식은 아래와 같다. 약간 공격적으로 스팸을 분류한다.
SH : 이 토큰이 스팸에 몇 번 포함되었나.
IH : 이 토큰이 정상적인 메일에 몇 번 포함되었나.
TS : 전체 스팸 메일 수
TI : 전체 정상적인 메일 수
P = (SH / TS) / (SH / TS + IH / TI)상식적으로 단순히 토큰의 스팸 카운트, 정상 카운트만 가지고 계산하면 지금까지 받았던 스팸 메일의 비율에 영향을 크게 받을 수 밖에 없기 때문에, 전체 스팸 수와 정상 메일 수로 나누어 비율을 맞춰주는 것이다.
Robinson은 Graham의 수식을 보정해서 false positive를 줄였다.
N : 토큰이 데이터셋에 몇 번 등장했나 (스팸이든 아니든)
X : 이 토큰에 대한 기록이 없다면 할당할 값. 보통 0.5에서 상황봐서 조정하는게 적당함.
S : 필터 성능 튜닝할 때 쓰는 보정값. 당연히 기본값은 1.
P(W) : Graham 수식으로 계산한 값
F(W) = (SX + N(P(W))) / (S + N)
Single-Corpus Tokens
어떤 단어는 한쪽 Corpus에만 나타나는 경우가 있는데, 사실 어떤 단어가 나오면 항상 반드시! 스팸이라고 말할 수 있는 것은 아니다. 100%는 99% 정도, 0%는 1% 정도로 보정해준다.
A Biased filter
Graham의 경우 false positive 때문에 IH만 2배로 보정. 워낙 상대적으로 정상 메일이 적기 때문에 이렇게 한 것이다.
Hapaxes
한 번도 본 적이 없는 Token이 나온 경우는 어떻게 할 것인가. 또는 그 단어를 판단할 근거 데이터가 충분하지 않은 경우는 어떻게 할 것인가? 이런 토큰은 hapaxes라고 부른다. 몇 번 이상 발생하지 않았다면 상대적으로 중간 값에 가까운 값을 할당해준다. hapaxial value라고 해서 0.4나 0.5 정도를 할당해준다. 이런 중성적인 값을 쓰는 이유는 스패머들이 고의로 쓰레기 단어를 막 섞어넣는 경우가 많기 때문이다. 그렇다고 아예 스팸으로 분류하자니 사용자 메일 습관이 바뀌어서 단어가 추가되는 경우도 있기 때문에 애매하다. 따라서 기껏해야 판단 근거로 안 쓰게 중간에 가까운 값을 할당하는게 유일한 선택지라고 하겠다. 여담으로, 이런 방식을 사용하고 있기 때문에 스팸에 소설 써봐야 베이지안 필터를 속이긴 힘들다.
이것을 Analysis Engine에 들여보내서 Decision Matrix를 생성하고 전체 값을 계산해낸다. 보통 대부분의 베이지안 필터는 15에서 27개 정도의 가장 편향된 값들을 골라서 (peak window value) 결과를 계산해낸다. 결과는 중간값이 거의 없고 대단히 편향적으로 (0에 아주 가깝거나 100에 아주 가깝거나..) 90을 넘으면 스팸으로 분류해주면 된다.
피드백은 프로토콜이나 인터페이스에 따라 다양한 방식이 있겠지만, 어쨌거나 통계 데이터셋을 보정한다는 점에선 다른게 없다.
훈련 방식은 크게 4가지로 나뉘는데, 각각 장단점이 있다.
Training Everything (TEFT)
Unsupervised Learning이라고 부르기도 한다. 새로운 유형의 데이터에 빨리 반응할 수 있는 장점을 가지고 있다. 대부분의 통계적 필터가 지원하는 방식이긴 한데 항상 추천되는 방식은 아니다. 스팸이 상대적으로 너무 많이 들어오는 경우에는 정상적인 메일 자체를 받을 기회가 매우 적어지기 때문에, 아무리 수학 공식이 커다란 데이터 편향을 용인해준다고 해도 오류가 발생할 가능성이 커지게 된다. 게다가 계속해서 데이터셋을 쌓아가기 때문에 용량 문제도 있다. 어쨌거나 이런 결점에도 불구하고 대부분의 사용자들에게는 굉장히 뛰어난 성능을 보여준다. 대체로 70% 정도의 비율로 스팸을 받는 경우 TEFT로 좋은 성능을 얻을 수 있다.
Train-on-Error (TOE)
에러가 날 때만 피드백을 통해 보정하는 방식을 쓴다. 용량을 덜 차지하기 때문에 시스템 관리자들이 좋아하는 방식이다. 그렇지만 TOE의 장점이 반대로 약점이라 할 수 있다. 새로운 유형의 메일에 대응하는 속도가 느리다는 것이다. 뉴스 그룹을 자주 바꾼다든지 메일 사용 패턴이 자주 달라지는 사용자라면 잦은 false positive 때문에 짜증이 날 수 있다. 마찬가지로 스팸 진화 속도에 따라가지 못하는 문제도 발생할 수 있다. TOE는 굉장히 높은 비율로 스팸을 받는 경우 (90% 이상) 또는 많은 양의 메일을 받는 경우 (하루에 5000건 이상) 대체로 잘 동작한다. 메일 패턴이 계속 바뀌는 사용자에게는 적합하지 않다.
Train-Until-Mature (TUM)
TUM은 TEFT와 TOE의 절충안이다. SpamProbe나 DSPAM 같은 스팸 필터에서 지원한다. 한 번 각 토큰을 어떻게 분류할지 결정되고 나면 실수하기 전엔 결정을 뒤집지 않는다. TEFT처럼 새로운 유형의 데이터를 계속 학습하지만 개별 토큰이 충분한 데이터를 모았다고 생각되면 학습을 중단한다. TUM의 장점은 새로운 데이터를 받을 때 나타난다. 새로운 데이터는 즉시 반영하고, 그 외에는 에러가 발생할 때만 재학습한다.
Train-Until-No-Errors (TUNE)
CRM114 Descriminator 같은 제품에서 지원하는 모드. 좀 무식해보이는데 에러가 없을 때까지 무한정 학습한다. 만약 에러가 발생하면.. 정말 무식해보이는데 전체 Corpus를 처음부터 다시 학습시켜야 한다. 대량으로 메일을 받는 사용자에겐 별로 실용적이지 않다.




덧글