[SPAM FILTER] 간단한 스팸 분류기

2020. 4. 15. 11:55Artificial Intelligence

www.lifewire.com

 

 

 

이번 포스팅에서는 spamassassin에서 제공하는 스팸 메일과 정상 메일 데이터셋을 가지고 스팸 메일을 분류하는 간단한 머신 러닝 모델을 만들어 보았습니다. 실제로 사용되고 있는 스팸 메일 분류기는 RNN (Recurrent Neural Network)등을 응용한 딥 러닝 모델을 사용하여 높은 정밀도와 효율성을 보여주고 있습니다.

 

 

이번에 구현할 스팸 필터 분류기는 주어진 메일에 들어있는 단어들의 집합만을 가지고 메일을 분류하는 모델이기 때문에, 단어의 맥락이나 전체 글의 맥락까지 고려할 수 있는 딥러닝 기반 RNN 스팸 메일 분류기보다는 효율적이지는 못하지만, 그래도 테스트 셋에서 꽤 정밀한 결과를 나타낸다는 점과, 간단한 머신 러닝 모델에 대한 전반적인 파이프라인을 공부한다는 점에서 의의가 있습니다. 

 

 

 

 

 

 

 

스팸어쌔신(Spamassassin)에서 가져온 데이터셋을 간단하게 전처리해서 csv파일로 가져왔습니다. 파일은 이메일의 내용을 담은 부분과, 해당 이메일이 스팸인지 아닌지를 1과 0으로 분류한 부분으로 구성되어 있습니다. 전처리 과정에서 URL들을 'URL' 스트링으로, 여러 가지 숫자 정보들은 'NUMBER'로 변환된 것을 확인할 수 있습니다. 

 

 

 

머신 러닝 모델에 단어들의 집합을 입력값으로 넣어주기 위해 추가적인 전처리 단계가 필요합니다. 공백과 점(comma), 따옴표, 특수문자등을 제거하고 (특수문자를 꼭 제거할 필요는 없습니다. 경우에 따라서 특수문자의 사용 여부는 스팸 메일을 가려내는 데 의미 있는 단서를 제공하기도 합니다.) 메일을 구성하는 각 단어들을 어근형태로 바꾸어 줍니다. (예를 들어 take, took, taken, taking 등의 단어는 모두 'take'라는 동사 원형으로 바꾸어 줍니다. 이와 같은 기능을 하는 파이썬 라이브러리를 사용하면 됩니다.)

 

 

 

메일을 전처리하여 어근들의 배열 형태로 바꾸어 줍니다. 예를 들어 "I ate apples" 라는 문장이 있다면, 이를 전처리하여

['I', 'eat', 'apple']의 형태로 바꾸어주는 것입니다. 

 

 

 

궁극적으로 모델에 들어가야하는 내용은 해당 이메일이 스팸으로 분류될 만한 단어들을 가지고 있는지 아닌지를 판단하는 것입니다. 따라서 전체 데이터셋의 이메일을 전처리하여 나온 단어들을 Dictionary(사전) 자료구조 안에 집어넣습니다. 

 

 

 

 예를 들어 앞선 예시의 경우 문장을 전처리하면서 사전에 { 'I' : 1, 'eat' : 2, 'apple' : 3} 의 형태로 단어를 추가해 나가는 것입니다. 여러 이메일들을 전처리하면서 단어가 이미 사전에 있는 경우에는 그냥 넘어가고, 사전에 있는 경우에는 새롭게 사전에 해당 단어를 추가하는 것입니다.

 

 

 

" I ate apples" 라는 문장 다음에 "I love bananas"라는 문장이 나왔다면 "love"와 "banana"가 사전에 추가되어 { "I": 1, "eat" : 2, "apple" : 3, "love" : 4, "banana" : 5 } 가 될 것입니다. 

 

 

 

 

 

 

이렇게 사전을 구축하고 나면, 특정 이메일을 사전의 특정 단어를 포함하는지 아닌지의 여부로 표현할 수 있게 됩니다. "I love banana"의 경우 [ 1, 4, 5 ] 의 집합으로, "I ate apple"은 [ 1, 2, 3]의 집합으로 표현할 수 있게 되며, 이를 궁극적으로는 사전을 구성하는 전체 5개의 원소중 어떤 원소가 있는지를 나타내는 One-hot vector인코딩으로 표현할 수 있게 되는 것입니다.

 

1.  "I ate apples"

2.  "I eat apple"

3.  [ "I", "eat", "apple"]

4.  [ 1, 2, 3]

5.  [ 1, 1, 1, 0, 0]

 

이렇게 모든 이메일을 Dictionary를 기준으로 One-hot vector 인코딩하고 나면, Random Forest Classification등을 통해 스팸 메일을 분류할 수 있게 됩니다. 

 

 

 

 

 

scikit - learn 라이브러리에 이미 잘 구현된 Classification 모델이 여러 개 있으므로 Classifier 모델을 따로 구현하지는 않고, 기존에 있는 RandomForestClassifier를 사용하여 훈련시켰습니다.

 

 

Cross_validation 수행시에 약 98%의 정확도를 보이는 것을 알 수 있으며, Test Set을 통해 실험해 본 결과 97.5% 정도의 정확도를 보이는 것을 알 수 있습니다.

 

 

Limits

 

One-hot Vector 인코딩 머신러닝 모델을 사용한 스팸 메일 분류기의 경우 테스트 셋에서 97.5% 의 비교적 높은 결과를 가져오는 것처럼 보입니다. 하지만 실제로 사용되고 있는 스팸 메일 분류기의 정확도가 99%에 육박하는 점을 고려하면 정확도에서 아직 한계를 보이고 있습니다.

 

 

또한 이 모델을 훈련시키면서 사용한 사전의 크기는 3만개가 되지 않았지만, 실제로 다양한 언어의 다양한 메일을 분류하는 데에는 3만개를 훌쩍 넘는 크기의 사전이 필요하게 될 것이며, 이는 One-hot vector 인코딩의 특성상 파라미터 개수를 크게 늘려 학습의 속도를 저하시키고 정확도를 낮추는 원인이 됩니다. (특히 다국어 스팸 메일을 분류하는 경우)

 

 

따라서 실제로 사용되는 스팸메일 분류기에는 이러한 특징등을 고려했을때, 단어간의 상호작용을 고려하여 RNN이나 LSTM등을 사용한 딥 러닝 모델이 적용되어 있습니다.

 

반응형