AI/Machine Learning

Building a spam classifier

Linuxias 2018. 3. 18. 22:58
반응형

Building a spam classifier

: Prioritizing what to work on &

Error Analysis


아래 내용은 Andrew Ng 교수님의 강의와 자료를 기반으로 학습한 내용을 정리하여 작성하였습니다.

개인의 학습 내용이기에 잘못 해석 및 이해하고 있는 부분도 있을 수 있으니, 다양한 자료를 기반으로 참고하시는 걸 추천드립니다.


이번 글에서는 스팸 분류를 통한 예제를 기반으로 어떻게 Error를 분석할 수 있는지 하나의 예시를 살펴보도록 하겠습니다.


  • Prioritizing what to work on

먼저 바로 예시를 하나 살펴보도록 하죠. 여러분에게 두 통의 메일이 왔습니다. 둘 중 어느 것이 Spam 메일인지 한번 알아보시죠. 둘 중에 어느것이 Spam인지 바로 알 수 있나요?



사람은 이런 메일을 보고 빠르게 Spam 메일과 아닌 메일을 구분해 낼 수 있습니다. 위 메일 중 좌측 메일이 스팸이란 것 바로 알 수 있으시죠? 일단 제목부터 어떤 제품의 구매를 강요하는 것 같습니다! 이런 스팸은 메일 필터링 단어 추가로 해결할 수 있습니다. 여러분들이 Medicine, Morgages 란 단어를 필터링 하였다고 가정해봅시다. 이 사람은 각 단어 중 i는 1로, o는 숫자 0으로 변경해서 필터링을 피했습니다.!! 악질이군요.. 이런 경우에선 단순 단어 매칭으로는 필터링을 할 수 없습니다. 그런데 만약 여러분들이 메일 내용 중 단어가 숫자와 혼합된 상태의 스팸 메일을 필터링 하고 싶으시다면 어떻게 해야 할까요? 저렇게 문자를 숫자로 변경한 모든 경우의 단어들을 필터링하도록 입력해 놔야 할까요? 그건 정말.. 차라리 메일이 올때마다 삭제하는게 더 편할 것 같습니다.


자, 저렇게 변형된 메일은 뒤로 미뤄두고, 일단 정상적인 상태에서의 스팸분류만 따져보도록 합시다. 앞선 글들에서 Supervised Learning, 감독학습은 입력 feature와 출력, 결과가 정해져 있어야 학습이 가능하다고 말씀드렸습니다. 그럼 각 메일에 대해 선정된 단어들을 이용해서 구분해 볼까요?


 

Andrew

Buy

Deal 

Discount 

... 

Spam(1) /

Non-Spam(0) 

Email 1 

 0

 1

...

Email 2 

 1

0

 ...


위 2개의 메일을 구분하기 위해 SPAM으로 의심되는 단어들을 나열해 놓고 포함상태 여부를 체크하고, 최종적인 결과를 입력합니다. 이 떄 Andrew, Buy, Deal, Discount 등등의 단어들이 각 입력 feature들이 되고 Spam여부가 결과값입니다. 


위와 같이 스팸 메일을 분류 시 오류를 낮추기 위해 여러분들이 할 수 있는 것이 무엇들이 있을까요? 정리해 봅시다. 


      • 더 많은 데이터를 수집

      • E-mail header, Message body에 속해 있는 Sophisticated feature' 정보들을 개발

      • 다양한 방식으로 입력을 처리하는 알고리즘


다양한 방식으로 입력을 처리하는 알고리즘은 나중에 기회가 된다면 다뤄보도록 하겠습니다. 재미있는 알고리즘들이 많이 있거든요 : )


여러분들이 스팸 메일 분류를 위한 모델을 만들었다고 합시다. 이 모델의 Error 분석을 위한 방법을 살펴봅시다. 방법이라기보단 여러분들도 충분히 알 수 있는 내용입니다. Andrew Ng 교수님이 강의에서 추천하는 접근방식으로 3가지를 말해주고 있습니다.


  • 빠르게 최소한으로 Model을 만든다.
    - Learning-curve를 이용해 parameter 수에 따른 Error 확인

  • Error가 발생한 것만 뽑아 추가적으로 분석한다.
    - Feature를 수정하는 작업을 합니다. 모든 feature를 사용할 수는 없으니 선별하는 작업이 필요합니다.
      하지만 이 경우 feature들이 분석 가능한 경우에만 사용합니다.

  • Learning curve를 그려라
    - Data, Feature 등이 더 필요한지 확인해보세요.


Cross validation set이 500개가 있는 상태에서 알고리즘이 100개를 잘못 분류했다고 가정해봅시다. 수동적으로 100개의 잘못 분류된 메일을 확인하고 새로이 분류해 줘야 합니다. 


feature를 등록할 때 discount / discounts / discounted / discounting을 같은 의미의 단어로서 처리할 것인지, 어원이 같은 단어들, 예를들어 universe/university는 어떻게 처리를 할 것인지? 많은 고민들이 필요합니다.


오류 분석은 성능을 향상시킬 수 있는지 판단하는 데 도움이되지 않을 수 있습니다. 유일한 해결책은 모델을 만들고 검증하고 제대로 결과가 나오는지 확인하는 것입니다. 어간 추출을 위해서 형태소 분석기를 사용하거나 사용하지 않은 상태에서의 알고리즘 성능의 수치 평가 (교차 유효성 검사 오류)등이 필요합니다.


이상으로 긴 글 읽어주셔서 감사합니다.






반응형