이 글은 Coursera에서 Andrew Ng 교수님의 머신러닝 강의를 듣고 읽기 자료를 읽으면서 복습차원에서 개인적으로 요약한 글입니다.
Building a Spam Classifier
우선순위 정하기: 스팸 분류기 예시
이제까지 배운 머신 러닝 알고리즘을 이용하면 간단한 스팸 메일 분류기를 구상할 수 있다.
입력 데이터 x는 이메일의 피쳐로 구성을 할 것이며 이는 이메일을 구분할 수 있는 키워드 단어의 포함 여부로 사용할 수 있다.
xj={1(if word j appears in email)0(otherwise)
이를 테면 andrew 단어가 이메일에 있으면 해당 피쳐는 1이다.
이런 식으로 피쳐 100개를 선정하여 100차원짜리 x벡터를 입력 데이터로 사용할 수 있다. 실제로는, 가장 빈번하게 나타나는 단어 10000~50000개를 선정하여 피쳐로 사용한다고 한다.
클래스는 스팸이면 1, 아니면 0으로 판단하는 이진 분류 문제이다.
이제 가설을 세우고 데이터를 모아 학습시키면 될 것인데 여기서 에러율을 낮출 수 있는 다양한 방법을 생각할 수 있다.
- 엄청난 양의 데이터를 모은다. 현재 이메일 분류기 관련해서는 'honeypot' 프로젝트 같이 많은 양의 데이터를 모으려는 프로젝트도 진행 중이다.
- 이메일 본문뿐만 아니라 이메일 주소의 도메일을 피쳐로 사용하면 스팸메일을 보내는 이메일 주소가 피쳐로 들어간 것이므로 더 좋은 분류를 학습할 수 있을 것이다.
- 단어 피쳐를 더 세련되게 분류할 수 있도록 한다. 예를 들어 discount와 discounts는 같은 단어 피쳐인지, deal과 Dealer는 같은 단어 피쳐인지, 구두점 등의 포함여부 등을 고려해볼 필요가 있다.
- 오타 탐지 알고리즘을 포함할 것인가? 예를 들어서 m0rtgage, med1cine, w4tches 등이 있다. 실제로 스팸을 보내는 곳에서는 탐지되지 않기 위해서 일부러 저런 오타를 포함시킨다고 한다.
에러 분석
학습 알고리즘을 설계하고 분석할 때는 다음과 같은 접급 방식을 추천한다고 한다.
- 먼저 구현할 수 있는 간단한 알고리즘을 빠르게 구현하고 이를 학습시키고 검증 셋을 통해 테스트한다.
- 학습 곡선을 그려서 더 많은 데이터가 필요한지, 더 많은 피쳐가 필요한지 등을 판단한다.
- 에러 분석: 에러율이 높다면 해당 테스트에서 사용된 검증 셋을 분석해 본다. 검증 셋에서 어떤 체계적인 규칙이나 에러를 만들어내는 요소가 있는지 발견할지도 모른다.
예를 들어 500개의 이메일 데이터를 가진 검증 셋을 테스트했더니 그 중 100개를 잘못 분류했다고 하자. 그럼 그 100개의 데이터를 검사해서 다음 기준을 기반으로 분류해보자.
- 그 이메일이 무슨 타입인가 (약물 광고, 페이크, 비밀번호 도용 등)
- 그 이메일은 제대로 분류하려면 어떤 피쳐가 필요할까 (오타 포함, 흔하지 않은 이메일 도메인, 이상한 구두점 등)
그러면 이제 위의 근거를 바탕으로 알고리즘을 재설계할 수 있다.
재설계한 알고리즘이 향상되었는지 쉽게 알 수 있는 가장 좋은 방법은 좋은 알고리즘에 대한 좋은 수치 평가 방식을 사용하는 것이다. 정확도든 비용함수 값이든 이러한 평가 수치가 있어야지만 직관적으로 알고리즘이 향상되었는지를 판단할 수 있다.
예를 들어서 discount/discounts/discounted/discounting 단어들이 모두 같이 취급되어야 하면 그래야 할 것이다. 이러한 단어들을 같이 취급해주는 소프트웨어가 따로 있는데 이를 'stemming software'라고 한다. 그렇다면 이 소프트웨어를 사용하는 것이 무조건 옳냐라고 할 수 있냐 하면 그건 또 아닌 것이 universe/university 같은 단어들도 같은 것으로 취급될 수 있기 때문이다. 이런 경우에는 간단히 stemming software를 돌려본 결과와 돌리지 않은 결과를 비교함으로써 해당 소프트웨어의 사용 여부를 결정할 수 있을 것이다. 이 때 평가 수치가 매우 유용하게 사용될 수 있다.
예를 들어 stemming software를 사용하지 않은 에러율이 5%, 사용한 에러율이 3%이면 stemming software를 사용하면 될 것이다.