본문 바로가기
Generalist/data science

가짜뉴스 분류 모델(RNN, LSTM, GRU, CNN-LSTM)

by 홍원 2022. 12. 11.

0. 들어가며

학교 수업에서 조별로 주제를 정해 딥러닝 모델을 만들고, 발표를 하는 기회가 있었습니다. 이번 글은 제가 했던 발표를 남기기 위해 작성하는 글입니다.  발표 대본 초안을 옮겨놓은 글이므로 다소 정제되지 않았을 수 있고, 발표 대상이 대부분 데이터 사이언스 초보이었기에 자세한 내용보다는 모델링 과정을 최대한 쉽게 설명을 했습니다.


1. 데이터 소개

저희가 맞은 주제는 가짜뉴스 분류 모델입니다. 그럼 발표를 시작하겠습니다

여기 두가지 기사가 있습니다. ‘예일 대학교는 칼훈 칼리지의 이름을 바꿀 수 있는 정책을 수립했다.’ ,‘ 텔레비전은 아이들의 발달에 부정적인 영향을 끼친다.’ 어떤것 진짜 뉴스이고, 가짜 뉴스인 것 같나요?

실제로 미국을 대표하는 사립학교인 예일대 산하 학부인 칼훈 칼리지는, 7대 부통령인 칼훈의 이름에서 따왔는데요, 사실 그는 강력한 노예제도의 옹호론자였다는 것이 논란이 되었고, 예일대학교는 그레이스 머레이 호퍼 칼훈 칼리지로 바꾸었습니다... 더 멋있어진 것 같긴 한데 일단 바꿨다는 기사는 진실이네요.

아래의 텔레비전이 아이들의 발달에 부정적이다 라는 연구결과는 아직 없다고 합니다. 오히려 부모와 함께 TV를 보는 것이 아이 뇌 발달에 도움을 주고 교육영상의 경우 아이들 지적능력 향상에 도움이 된다는 결과도 있다네요.

이처럼 저희가 이번에 만들어 볼 모델은 진짜 뉴스와 가짜뉴스를 분류하는 모델입니다. 그럼. 데이터셋을 보겠습니다. 저희는 캐글의 Fake News라는 데이터셋을 가져왔습니다. 크게. train,test,submit 파일이 있었는데요. 트레인 파일에는 기사 번호인 id,기사 제목, 작가, 기사 내용인 text, 그리고 이것이 진짜인지 가짜인지 알려주는 라벨 열이 있습니다.

당연히 진짜면 0, 가짜면 1입니다. 테스트 셋은 트레인에서 라벨만 뺀 것입니다.


2. 데이터 전처리

그럼 이제 저희가 어떻게 전처리를 했는지 알아보겠습니다.

처음 한 것은 토탈 열의 생성입니다. 타이틀 열과 기자 열을 합쳐서 토탈 열을 만들었습니다. 그러니까 기사의 제목과 기자를 사용해서 분류를 해보기로 했습니다. 검정 네모 박스인 결과를 잘 보시고 텍스트가 어떻게 변하는지 잘 따라와 주세요!!

 

그리고 텍스트 전처리를 했습니다 sub 함수를 사용해서 토탈 열의 영어 외의 모든 문자를 없앴습니다. 그 다음 lower 함수로 소문자화, split()으로 띄어쓰기 별로 단어를 분리했습니다. 그리고 스템 함수를 사용해서 단어를 어간으로 만들었습니다. 예를 들어 말 하다인 say,says,saying,said 모두 say에서 왔죠, steam 함수가 이런 어간 추출 역할을 하는 겁니다. 그리고 stopword는 포함되지 않게 해서, total 열 속 불용어를 삭제했습니다. 그리고, 리스트에 넣었습니다, 결과를 보시고 이해해주세요

그런 다음함수로 문자를 숫자로 변환했습니다. 컴퓨터가 영어를 읽기엔 너무 시간이 많이 걸리겠죠? 이 원핫 함수는 단어별로 번호를 부여해주는 함수입니다. 아까 정제된 토탈 열이 숫자로 바뀌었네요.

 

다음으로 pad_sequence 함수를 사용해서 각 행의 길이를 맞춰줬습니다. 아무래도. 문장의 길이가 같다면 기계가 학습하기에 편하겠죠? 이 패드 시퀀스 함수를 사용하면 모든 문장을 가장 긴 문장의 길이에 일치시키고, 그때 생긴 빈 공간은 제로 패딩 합니다.

마지막으로 저희가 만든 함수를 모두 적용 한 모습입니다. 이해가 되시죠?

그리고 중요한 라벨 역시 분리해줬습니다.

마지막으로 전체 함수를 적용했고, 아래 결과는 x 즉 데이터 값과y 열의 한 행을 예시로 보여드리고 있습니다.

자 이제 진짜 마지막으로 모델링을 위해 트레인, 벨리데이션, 테스트 셋을 분리하였습니다. . 총데이터에서 테스트 셋을 먼저 때고, 벨리데이션 셋을 때서 총 26000개의 행이 테스트 셋 21060,21060, 밸리데이션 셋 2340, 테스트2340, 셋 2600으로 나누어졌습니다.


3. 모델링

자 이제 모델링입니다. 저희는 우선 RNN 과 LSTM, GRU 이 세 가지의 모델을 사용해서 모델링해보았습니다..

 

화면이 조금 복잡할 수 있는데, 저를 잘 따라와 주세요.. 우선 텍스트 분류에서 가장 기본이 되는 RNN부터 모델링해보았습니다.. 모델을 벨리데이션 세트로 검증해본 결과 정확도 0.9 이었는데요, 좋은 정확도 라고 생각해서 기분은 좋았습니다.

코드를 조금 뜯어보자면, 처음 시퀀셜 쓰고, 임베딩을 하는데요, 임베딩 층에선 단어를 밀집 벡터로 만들어줍니다. 그리고 바로 RNN을 돌렸고, 이진 분류를 위해 시그모이드 함수를 선택했습니다. 컴파일의 손실 함수도 이진 분류이기에 바이너리를 선택했습니다.

얼리 스탑을 했기에 에포크는 10번 중 세 번이 돌았는데요, 트레인 셋의 정확도는 계속 높아졌지만, 밸리데이션은 계속 낮아져서 조금 더 발전시킬 필요가 있었습니다.

다음으로 LSTM 모델을 써보았습니다. 아까 트레인 셋의 점수가 계속 높아져서. 이번에는 드롭아웃 층을 넣었습니다. 그리고 렐루 함수 층을 넣어서 학습을 도와봤습니다. 마지막은 당연히 시그모이드 구요. 점수는 0.916이었습니다. 그래도 손실 그래프가 RNN 보다는 안정 한 모습을 보였습니다.

마지막으로 GRU 모델을 써봤습니다. 이번 모델은 LSTM과 파라미터 값을 동일하게 해 봤습니다.. 로스 0.256, 정확도 0.916으로 LSTM과 정확도는 같았지만, 로스가 약간 작았습니다.

그리고 이 기본 모델 외에도 새로운 모델을 찾아보았습니다. 바로 한국 정보통신학회에서 발간한 논문집 중 새로운 텍스트 분류 방법이라는 제목의 논문이었습니다. 여기선 CNNLSTM을 결합한 융합 모델을 제시했는데요, CNN의 특징 추출과 LSTM의 시계열 메모리 콘텍스트의 특성의 장점을 결합하여 만든 모델이었습니다, 저희 수업시간에서 배운 두 모델을 합쳐 한 모델로 만들었다는 점이 흥미로워서 진행해보았습니다..

 

텍스트 형식이기에 임베딩층 다음 컨볼루션 원 디멘션 층을 추가하였고 맥스 풀링 하였습니다.

결과는 정확도 0.92로 위 세모델보다 더 좋은 정확도를 보여주었습니다,


4. 최종 평가

그래서 저희는 최종모델로 새로운 기법인 모델인 CNN-LSTM 모델을 선택 하였습니다.. 선택된 CNN-LSTM 모델에 테스트 셋으로 평가한 결과 정확도 0.91점으로 만족스러운 결과를 보였습니다. 컨퓨전 메트릭스의 정확도만 살펴보자면 저희 모델은 테스트 셋 총 2600개 중 진짜 뉴스를 진짜로 예측한 1175개와 가짜 뉴스를 가짜로 예측한 1197개를 더한 2372개를 맞추었습니다.

 

이상 가짜 뉴스 분류 모델 발표였습니다. 감사합니다.


5. 마치며

저 역시 딥러닝 모델링을 처음 해봐서 파라미터 조정이 어려웠습니다. 교수님께서 에포크 수를 더 늘려봐라는 피드백을 주셨고, 각 모델별 에포크를 수정하여 따로 진행해봤습니다. 해당 방법은 아래 깃허브 링크에서 확인하실 수 있습니다.

 

GitHub - hongwon2/HG-MLDL: 혼자 공부하는 머신러닝 + 딥러닝

혼자 공부하는 머신러닝 + 딥러닝. Contribute to hongwon2/HG-MLDL development by creating an account on GitHub.

github.com

 

 

 

댓글