Link
10-22 07:20
«   2020/10   »
        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 31
Archives
Today
272
Total
1,079,402
관리 메뉴

꿈 많은 사람의 이야기

[8주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어 처리(nlp) toxic 데이터(toxic keras lstm) 본문

kaggle(캐글)

[8주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어 처리(nlp) toxic 데이터(toxic keras lstm)

이수진의 블로그 이수진의 블로그 2019. 3. 13. 13:59

이번 커널 필사편은 7주차 이후로 또 다시 자연어 처리 편입니다

이 커널은 toxic 이라는 데이터로 알려져 있는데요. 캐글에서 자연어 처리(nlp) 데이터 셋으로 많이 유명합니다.

일종의 분류 문제입니다. 하지만 label이 1개가 아닌 6개를 가진 특이한 데이터 구조입니다


처음 캐글을 시작할 때 타이타닉 다음으로 이 데이터 셋으로 했었는데..

당시에는 아무것도 모를 때라 그냥 너무 어렵다.. 하고 포기했었는데요

처음 봤을 때보다 지금이 7개월 정도 흘렀는데 이젠 좀 눈에 보이네요 ㅎㅎ 필사를 하면서 이해가 되더군요

제가 그 만큼 공부를 했다는 거겠죠 ㅎㅎ


바로 진행합니다




역시 처음에 필요한 라이브러리를 가져와줍니다

keras, matplotlib, seaborn, pandas, numpy 등을 가져와줍니다

layers를 가져올 때 일반적인 Embedding, Dense, Input, LSTM 외에도

Bidirectional을 가져옵니다.

이건 양방향으로 데이터를 바라본다고 생각하시면 됩니다.



데이터를 불러와서 .head()를 이용해서 확인합니다.

id 값이 있고 commnet_text가 있습니다. 그리고 toxic, severe_toxic 등이 있죠

저것들이 다 라벨 값입니다. 저 라벨을 한번에 넣어줘야 합니다



간단하게 데이터를 살펴보기 위해서 pandas의 shape를 이용합니다.

그리고 문자의 길이가 어떻게 되는지 살펴보기 위해서 .apply에 len을 넣어주어 길이 값을 가져옵니다.

그리고 matplotlib을 이용해서 그래프를 그립니다. 

plt.figure로 설정해주고 plt.hist를 이용해서 히스토그램을 그립니다.

긴 것은 5000자 까지 있네요 ㄷㄷ



최대 길이, 최소 길이, 평균 길이 등을 살펴보면

제일 긴건 5000, 가장 짧은것은 6이네요. 평균은 395 정도 됩니다.


이제 데이터를 나눠야하겠죠

X에는 feature 값을 넣어줍니다. comment_text겠죠

y에는 label을 넣어줍니다.



y에 들어가는 데이터 모습은 위와 같이 됩니다. 2차원 배열이고 내부 배열이 6개입니다.

그리고 가장 많이 사용한 단어 2만개를 사용하고 최개 길이는 너무 길지 않게 150자로 제한하니다.

또한, 임베딩 크기(embedding size)도 설정합니다.


이후에 keras의 Tokenizer를 이용해서 token을 나눠줍니다.

fit_on_texts를 해주고 texts_to_sequences를 해줘서 데이터를 시퀀스로 변환합니다.



그리고 max_len 만큼 길이를 짤라서 부족한 부분은 padding을 해줍니다



이제 모델 설계입니다.

중간에 Bidirectional이 있죠. 아까 말씀드린대로 양방향으로 보기 위한 구조입니다.

일반적인 LSTM을 사용하면 단방향으로 보는데요. Bidirectional을 사용하면 양방향으로 보는 것이 가능합니다.

그리고 Dense와 Dropout, maxpooling 등을 진행하며 keras model을 쌓아줍니다.



그리고 keras에서 제공해주는 callback 함수인 ModelCheckpoint와 EarlyStopping을 사용해서 결과가 좋은 것만 저장하고

더 이상 val_loss가 좋아지지 않으면 early stopping을 해줍니다.

그래서 monitor를 val_loss로 해두죠


저렇게 훈련을 시키고

제출을 하면!



무려 97%의 정확도가 나옵니다.

1등이 98.4%인가 그정도 되고 대부분 사람들이 98%가 넘기 때문에 그렇게 높은 순위에는 들어가지 못합니다.

하지만 자연어 처리 방법에 대해서 배울 수 있는 간단한 방법입니다.

0 Comments
댓글쓰기 폼