6-3 Building a Spam Classifier 본문
머신러닝 시스템을 설계하기 위해 어떻게 해야 하는지 알아본다.
스팸메일 분류 시스템을 만든다고 해보자.
왼쪽은 스팸메일이고 오른쪽은 스팸메일이 아니다. 스팸메일의 경우 의도적으로 단어의 철자를 제대로 사용하지 않는 것을 볼 수 있다. 이와 같이 이러한 메일 data set이 있고 스팸인지 아닌지에 대한 라벨링이 붙어있다고 하자 그러면 지도학습을 통해서 어떻게 스팸 분류 시스템을 만들어야 할까?
스팸메일 분류 시스템을 설계하기 위해서 해야 할 첫번째 순서는 이메일이라는 데이터에서 feature x를 정의하는 것이다. Feature x와 이에 대한 labeling y가 존재한다면 앞서 배웠던 로지스틱 회귀와 같은 방법을 사용해서 분류를 할 수 있을 것이다. 여기서 feature x는 이메일에서 존재할 수 있는 여러 단어들 중에서 100개를 선택한 것이고 해당 단어 feature는 스팸메일인지 아닌지 구분할 수 있는 feature로 사용한다. 절대적인 건 아니지만 예를 들어 deal, buy, discount와 같은 단어가 많이 등장한다면 스팸메일일 가능성이 높을 것이다.
만약 오른쪽과 같은 메일이 있다면 우리가 선택하기로 한 100개의 단어 feature 벡터를 사용해서 벡터에 존재하는 특정 단어가 메일에 있는지 없는지 판단하여 해당 메일에 대한 100차원의 feature 벡터 x를 정의할 수 있을 것이다. (중복은 하나로 친다.) 이 예제에선 100개의 단어를 사용하기로 했지만 실제로 이메일에 나타나는 단어의 종류는 굉장히 많을 것이다. 그래서 실제로 이러한 시스템을 설계하고자 할 때는 트레이닝 셋을 잘 분석하여 빈번하게 등장하는 단어를 10,000 ~ 50,000개 정도 선택하여 feature 벡터를 정의해야 한다.
이러한 방식으로 spam classifier를 설계한다고 할 때, accuracy는 향상시키면서 error를 줄일 수 있는 방법이 필요하다.
여러 가지 방법이 존재하지만 첫번째로 가장 쉽게 생각해볼 수 있는 것이 데이터를 많이 모아서 알고리즘의 성능을 높일 수 있다고 생각하는 것이다. 하지만 이메일이라는 도메인에서 가짜 이메일 주소를 사용하는 스팸메일을 대량으로 만들어낼 수 있기 때문에 무작정 데이터를 많이 모은다고 성능 향상을 기대할 순 없다. 앞서 배웠던 것처럼 train data를 많이 모으는 것이 도움이 될 수도 있고 안 될 수도 있는 것이다.
두번째 방법은 보다 정교한 feature를 만드는 것이다. 이메일의 라우팅 정보를 분석하여 스팸메일처럼 비정상적인 루트를 통해 발송된 이메일을 파악하는 것이다. 또는 discount와 discounts를 같은 단어로 취급할 것인지 deal, dealer를 같은 단어로 취급할 것인지와 같은 부분을 고려하고 의도적으로 스펠링에 맞춤법 오류를 적용한 단어를 찾아낼 수 있는 정교한 알고리즘을 개발해야 한다.
* 머신러닝을 통해 문제를 풀어나가는 과정에서 이러한 것들을 많이 brain storming해보게 된다. 우리가 앞서 살펴본 여러 옵션들 중에서 실제로 어떤 것이 가장 좋은 옵션인지 명확하게 말하기가 힘들다. 우리가 선택한 사항이 실제로 도움이 되지 않은 부분일 수도 있다. 그리고 많은 사람들이 여러가지 아이디어를 분석해보고 시행착오를 겪는 과정 대신 직감적인 것에 의존하려는 경향이 있다. 이러한 문제에 빠지지 않고 좀 더 명확한 근거를 통해 시스템을 개선해나가는 방법일 이후에 알아본다.
머신러닝 시스템을 설계할 때 성능을 개선시킬 수 있는 접근법 Error analysis에 대해 알아본다.
머신러닝 시스템을 설계하는데 있어서 추천하는 approach는 다음과 같다.
처음부터 복잡하고 어려운 시스템을 설계하는 것이 아니라 심플하고 빠르게 시스템을 구현하는 것이다. 그렇게 설계한 시스템을 cross-validation data를 가지고 테스트해본다.
이전에도 배웠지만 learning curver를 그려보는 것이다. 그래서 현재 알고리즘이 어떤 문제를 겪고 있는지 원인(high bias or high variance)을 파악하고 그에 맞는 해결책을 하나하나 적용해본다.
그 다음 매뉴얼하게 알고리즘의 error를 분석해본다.(현재 시스템에서 나타나는 에러가 어떤 경향을 띄는지 파악해보는 것이다.)
Error를 분석하는 과정은 다음과 같다. Cross validation set을 사용하여 현재 시스템을 테스트해봤더니 500개중 100개의 이메일을 잘못 분류하였다고 해보자.
이제 100개 에러에 대해서 이메일의 type에 따라 다시 분류해볼 수도 있고 성능을 개선할 수 있는데 도움이 될 수 있는 단서나 주요 정보는 어떤 것이 있는지 분석해보는 것이다.
100개 에러 이메일에 대해 분류해보니 패스워드를 스틸하려는 이메일이 53개로 가장 많았다는 분석결과가 나왔다. 그러면 steal password 이메일을 잘 분류할 수 있도록 다른 정보나 feature를 분석해야 한다. Steal password에 해당하는 이메일을 다시 분석해보니 unusual punctuation이 가장 많이 나왔으므로 이를 잘 처리할 수 있도록 모델을 수정하는 시도를 해볼 수 있을 것이다.
학습 알고리즘을 개발할 때 또 하나의 유용한 방법은 numerical evaluation을 해보는 것이다. 수치적으로 알고리즘의 성능을 평가해보면 이 방법을 적용했을 때 얼마나 성능이 향상됐는지 혹은 기존보다 성능이 더 떨어졌는지 쉽게 판단할 수 있다. 예를 들어 discount/discounts/discounted/discounting와 같은 단어들을 같은 단어로 봐야 하는지 아닌지에 대한 문제를 겪고 있을 때 형태소 분석 방법을 적용한다면 해당 단어를 모두 한번에 같은 단어로 쉽게 취급할 수 있다. 하지만 형태소 분석 방법을 사용했을 때 발생할 수 있는 문제점은 universe / university와 같이 전혀 뜻이 다른 단어를 같은 단어로 취급할 수 있다는 점이다. 이러한 문제가 있기 때문에 stemming 방법을 사용하는 것이 정말로 도움이 되는지 아닌지 쉽게 판단할 수가 없다.
이때 numerical evaluation을 해보는 것이다. 이 방법이 성능 향상에 도움이 될 수 있을지 없을지 확신할 순 없지만 일단 시도해보고 잘 작동한다면 우리가 더 좋은 선택을 할 수 있다는 점은 틀림없다. 만약 stemming을 사용하지 않았을 때 cross validation set으로 테스트 해보니 5%의 error가 발생했다고 해보자. 그리고 stemming을 사용해서 다시 테스트해보니 3%의 error가 발생했다. 따라서 numerical evaluation을 통해서 명확하게 stemming을 사용하는 것이 더 좋은 방법이라는 것을 확인할 수 있다. 나아가 대소문자를 구분하는 방법을 적용하여 테스트 해보니 3.2% error가 발생했다면 이 방법은 사용하지 않는 게 더 좋다는 걸 쉽게 판단할 수 있다.
다시 정리하면
- 처음에는 알고리즘을 쉽고 빠르게 구현하여 cross validation set으로 테스트 해본다.
- Learning curve를 그려 문제의 원인을 진단해보고 이에 적합한 해결책을 적용해본다.
- Error를 좀 더 분석해보고 나타난 에러들에 어떤 특징이 있는지 확인해본다.
- 문제를 해결하기 위한 다양한 아이디어를 접목하여 시도해보고 어떤 것이 좋은 방법인지 numerical evaluation을 통해 판단한다.
'ML & DL > Coursera-ML' 카테고리의 다른 글
6-5 Data for machine learning (0) | 2019.01.29 |
---|---|
6-4 Error Metrics for Skewed Classes (0) | 2019.01.29 |
6-2 Bias vs Variance (0) | 2019.01.28 |
6-1 Evaluating a Learning Algorithm (0) | 2019.01.21 |
5-2 Backpropagation in Practice (0) | 2019.01.21 |