세로형
Recent Posts
Recent Comments
Link
04-16 03:26
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

[7주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어 처리(nlp) 스팸(spam) 본문

kaggle(캐글)

[7주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어 처리(nlp) 스팸(spam)

이수진의 블로그 2019. 3. 12. 08:46

이번 커널 필사편은 자연어 처리 부분입니다.

당분간은 자연어 처리 위주로 글을 올릴 예정입니다

캐글에 있는 자연어 처리 데이터 중 쉬운 편에 속하는 스팸(sparm or ham) 데이터를 가지고 해당 글이 스팸인지 아닌지를 딥러닝으로 처리해보겠습니다.

https://www.kaggle.com/uciml/sms-spam-collection-dataset

캐글 데이터는 여기서 구할 수 있습니다!


먼저 필요한 라이브러리를 불러옵니다

파이썬의 판다스(pandas), numpy와 그래프를 그릴 matplotlib, seaborn을 불러옵니다.

그리고 머신러닝 라이브러리 scikit learn(사이킷런)과 딥러닝 라이브러리인 keras(케라스)를 불러옵니다



데이터는 v1, v2 컬럼으로 각각 라벨, 문장으로 되어있습니다.

하지만 위에서 보는바와 같이 Unnamed 라는 이상한 컬럼이 있기에

pd.drop을 이용해서 컬럼을 drop 시켜줍니다

그리고 컬럼명도 바꿔줍니다



pandas의 value_counts를 통해서 plot 그래프를 그려보니까

라벨 데이터가 불균형한 데이터라는 것을 알 수 있습니다!



이제 데이터를 나눠줍니다

X에다가 data.content를 넣어주고

y에는 라벨을 넣어줍니다

그리고 사이킷런의 train_test_split을 이용해서 데이터를 나눠줍니다



그리고 간단한 EDA를 진행합니다.

len을 통해서 글자의 길이를 파악하는데요~

보통 0~200 사이에 글자 길이가 집중되어 있는 것을 볼 수 있습니다.

그리고 200 이상부터 600까지 있는데 이건 이상치(outlier)라고 볼 수 있습니다

평균 길이는 121정도이고 90% 정도 되는 데이터 길이는 156 정도 됩니다.



그래서 여기서는 max_words 즉 사용되는 단어의 수는 1000개(상위 1000개)

최대 길이는 150으로 정하고 keras의 Tokenizer를 이용합니다.

그리고 text 데이터를 sequence하게 바꿔주고

데이터가 부족한 부분은 padding 해줍니다



이제 모델을 설계합니다!

Sequential()을 가지고 딥러닝 layer를 쌓을 수도 있지만 여기서는 function api를 사용합니다

keras에서 제공해주는 Input, Embedding, Dense, Activation 등을 사용하고 Model(input, output)을 이용해서 모델을 만들어주는 함수를

구현해서 저 함수를 호출해 모델을 만듭니다



compile은 binary_crossentropy를 사용하고 optimizer는 adam을 사용하겠습니다

그리고 fit을 시키니까 98%의 정확도가 나오네요!

근데 이건 f1-score로 보아야 하는게 정확합니다.

왜냐하면 라벨이 벨런스하지 않으니까요



그래프도 그릴 수 있습니다.

에폭(epochs)에 따라서 loss가 떨어집니다



그리고 이건 epoch에 따라서 acc가 올라가네요

위는 y축 label이 loss라고 잘못쓰여진 것입니다(acc입니다 ㅠ)

 

오늘은 여기까지입니다.

간단하고 쉬운 자연어 처리 방법이었습니다


다음 글들도 한 3개 정도는 nlp로 계속할 것 같습니다!


반응형
그리드형
Comments