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
관리 메뉴

꿈 많은 사람의 이야기

Keras를 활용한 딥러닝 추천 시스템(deep learning recommender system) 구현하기 본문

deep learning(딥러닝)

Keras를 활용한 딥러닝 추천 시스템(deep learning recommender system) 구현하기

이수진의 블로그 이수진의 블로그 2020. 3. 8. 21:14

포스팅 개요

이번 포스팅은 딥러닝(Deep Learning)을 활용해 추천 시스템(Recommender system)을 구현하는 포스팅입니다.

그 중 개인화 된 추천 시스템(personalized recommendation system)을 한 번 만들어보겠습니다.

파이썬(Python)을 활용했으며 라이브러리는 케라스(Keras)를 사용했습니다.

고급진 기술보다 기초적인 수준에 가까운 글이니 참고 부탁드리겠습니다.

이번 추천 시스템의 목적은 뉴스 추천 시스템입니다.

==참고 사항==

본 글에 나오는 Dataset은 제가 임의로 만든 Dataset입니다.
그래서 현실적인 면에서 조금 동떨어질 수 있습니다.

부디 참고 부탁드리며 Insight만 얻어 가시길 바랍니다.

 

또한, 본 포스팅 글은 지난 번에 작성한 추천 시스템 구현의 연장이 되는 글입니다. 지난 글은 아래와 같습니다.

https://lsjsj92.tistory.com/571

 

파이썬(Python)으로 간단한 뉴스 추천 시스템(recommender system) 구현해보기

포스팅 개요 이번 포스팅은 파이썬(Python)을 활용해서 추천 시스템(recommender system)을 구현해보는 포스팅입니다. 이번 포스팅은 "정말 단순한 아이디어"를 가지고 네이버 뉴스를 추천해주는 것을 구현해보려..

lsjsj92.tistory.com


포스팅 본문

앞서 말씀드렸듯이 이번 포스팅은 딥러닝 기반으로 추천 시스템을 만들어보는 포스팅입니다.

Python언어를 사용하며 사용에 필요한 파이썬 라이브러리는 아래와 같습니다.

  • Keras
  • Pandas
  • Numpy
  • Gensim(Doc2vec)

 

1. Dataset

제가 이번 포스팅에서 작성하는 추천 시스템은 뉴스 추천 시스템(News recommender system)입니다. 뉴스 데이터는 구글에서 검색하면 나오는 오픈된 데이터를 활용했습니다. 

이 데이터는 5개의 카테고리를 가지고 있으며, 총 53만여개 정도 되는 데이터입니다.

 

정확히 532772개의 데이터를 가지고 있고 정치, 경제, IT 등 카테고리가 5개 카테고리를 가지고 있습니다.

또한, 저는 이 뉴스 데이터를 은전한닢(Mecab)을 사용해서 형태소 분석을 미리 진행했습니다. Mecab 형태소 분석기를 이용해서 진행한 형태소 분석의 결과는 tok 이라는 컬럼에 넣어 놓았습니다.

2. News embedding

recommender system을 만들기전에 먼저 이 뉴스 데이터를 embedding 해야합니다. embedding의 종류에는 상황에 따라 다양한 방법이 있을 것입니다. 저는 단순하게 doc2vec을 사용했습니다. 여기서 doc2vec의 개념은 설명하지 않겠습니다. 이미 훌륭하신 분들의 글에서 자세히 설명된 것이 있기 때문입니다. 저는 단순히 doc2vec을 사용해 text 데이터를 embedding 했습니다. 이때 doc2vec 차원은 128 차원입니다.

 

그리고 그 embedding 값은 미리 저장했었고 이제 사용해야 하니까 load했습니다.

 

3. user history data

추천 시스템을 만드려면 사용자에게 맞춤형 콘텐츠를 추천할 수 있는 추천 시스템을 만들어야 합니다.

저는 여기서 어떻게 하면 사용자 맞춤형 추천 시스템을 만들 수 있을까?를 고민했습니다. 한 2~3주 고민한 것 같네요..

사용자 맞춤형 추천 시스템은 personalized recommendation system이라고도 부를 수 있습니다.

즉, 개인화 된 추천 시스템인 것이죠. 그래서 사용자 히스토리(user history) 데이터가 필요했습니다.

하지만 저는 개인적으로 여러가지 테스트 해보는 것인데 사용자 히스토리 데이터.. 그런 것은 절대 없었습니다. 제가 할 수 있는 방법은 '임의'로 만드는 것이었습니다.

포스팅 개요에서도 말씀드렸듯이, 이건 제가 '임의로'만든 사용자 히스토리 데이터 셋입니다. 그래서 정확하지 않은 추천 시스템이 만들어질 수 있음을 다시 말씀드립니다 ㅠㅠ

 

제가 만든 사용자 데이터셋은 아래와 같은 기준으로 만들었습니다.

  • 1000여명의 유저라고 가정
  • 유저당 최근 본 100개의 콘텐츠를 기준으로 삼았다고 가정
  • 유저 당 콘텐츠를 보았는지(1), 보지 않았는지(0)을 체크
  • 본 데이터(1)과 보지 않은 데이터(0)의 비율은 3:7

그래서 데이터는 총 10여만개의 데이터가 만들어졌습니다.

 

4. Deep Learning model

이제 데이터 셋이 만들어졌으니 딥러닝을 활용해서 추천 시스템을 만들어보겠습니다.

하지만, 아직 완벽한 데이터 셋이 만들어진 것이 아닙니다. 왜냐하면, 이거는 사용자가 본 콘텐츠(content)를 기준으로 합니다. 그리고 저는 콘텐츠를 doc2vec을 이용해서 embedding 했구요. 

즉, 사용자 히스토리 데이터를 content id에 대응되는 doc2vec embedding 값을 가지고와서 그걸로 input 데이터를 만들어주어야 합니다. 저는 doc2vec embedding을 128차원으로 만들었습니다. 

그래서 shape는 위와 같은 형태로 나오게 됩니다. y 값은 봤다(1), 보지 않았다(0)의 값을 띄게됩니다.

또한, user vector는 view history를 기준으로 mean을 한것으로 만들었습니다.

 

이제 추천 시스템을 위한 딥러닝 모델을 만들어줍니다.

딥러닝 모델은 저는 파이썬의 Keras(Python Keras)를 사용했습니다. 그리고 그 모델의 형태는 아래와 같습니다.

단순히 Dense layer만 쌓은 형태의 딥러닝 추천 시스템입니다. 처음에는 128개의 input을 받고 점점 작아져서 마지막은 sigmoid로 0, 1을 판단하도록 하였습니다. 

 

자! 이제 이 모델에 아까 만들었던 data를 활용해서 모델을 훈련시켜줍니다.

빠른 학습과  시간 조절을 위해서 저는 checkpoint도 두어서 callback에 넣었습니다.

 

이제 본격적으로 추천 시스템 모델을 훈련시켜줍니다!

아래와 같이 말이죠.

임의로 만든 dataset인데도 불구하고 loss가 어느정도 떨어지는 것을 볼 수 있습니다.

이제 최종적으로 얼만큼 추천 시스템 모델의 성능이 나오는지 확인해봅니다.

 

딥러닝 기반 추천 시스템의 최종 결과는 아래와 같습니다. (혹은 위 사진과 같습니다.)

  • f1-score : 71%
  • precision : 57%
  • recall : 91%
  • acc : 80%

 


마무리

성능은 썩 좋지 않았습니다. 성능이 좋지 않은 이유는 아무래도 임의로 만든 데이터 셋이라서 더욱 그럴 것입니다.

만약, 충분한 데이터 셋과 real dataset이었다면 성능이 잘 나왔을까요?? ㅎㅎ 그건 잘 모르겠습니다.

부디 insight만 얻어가시길 바랍니다.

16 Comments
  • 프로필사진 ㅇㅇ 2020.03.23 22:52 주인장님 혹시 뉴스 데이터 어디서 받는지 말씀해주실 수 있을까요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.03.24 07:41 신고 안녕하세요. 데이터는 구글에 검색해서 찾았습니다. 저하테는 지금 없구요 ㅠ 저작권 문제에 걸릴 수 있기 때문에 사용하고 바로 삭제처리해서요 ㅠ
  • 프로필사진 2020.04.26 11:35 비밀댓글입니다
  • 프로필사진 2020.04.26 16:12 비밀댓글입니다
  • 프로필사진 2020.04.27 10:30 비밀댓글입니다
  • 프로필사진 ㅇㅇ 2020.06.04 20:07 안녕하세요! 머신러닝을 처음 접하면서 블로그에 작성해주신 내용들을 보면서 조금씩 배워가고있습니다.
    이번 포스팅을 보면서 결과가 어떤 식으로 출력되는지 궁금해져서 질문 남기게 됐습니다.
    학습을 마친 이후에 모델에 임의의 유저 히스토리 데이터를 주면 그 결과를 토대로 추천결과를 내주는 건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.04 21:27 신고 안녕하세요~ 네 맞습니다.
    얼마든지 응용 가능합니다!
  • 프로필사진 ㅇㅇ 2020.06.07 05:54 포스팅 보면서 비슷하게 만들어본 게 있는데 러닝 돌려본 결과가 이해가 잘 안돼서 질문드립니다.
    깃헙에 올려주신 코드도 같이 참고하면서 작성했는데 모델에 들어가는 X_train이 유저 히스토리 데이터의 content열의 값과 대응하는 doc2vec으로 임베딩한 뉴스 데이터이고 y_train은 유저 히스토리 데이터의 viewed 열의 0, 1값으로 이해했는데 맞을까요?
    제가 만든건 음식점이름과 이름을 형태소분석한 것, 업종이름을 하나의 텍스트로 만들어서 doc2vec으로 임베딩 해주었고
    y_train에는 유저 히스토리 데이터의 viewed 열만 추출해서 넣었는데 정확도는 70% 언저리로 나오고 있습니다.
    정확도가 낮은건 임의로 만든 히스토리 데이터다보니 정확도가 높지 않을 것이라고 말씀하셨는데, 저는 각 Epoch마다 val_loss, val_acc에 거의 변화가 없다시피 해서 입력 데이터를 잘못 준건지 혹은 다른 문제가 있는건지 잘 모르겠습니다 ㅠㅠ
  • 프로필사진 ㅇㅇ 2020.06.07 06:35 위에서 질문드린 사람입니다.
    혹시 X_train 데이터가 유저 히스토리에 있는 content가 가리키는 뉴스데이터의 임베딩 값인데 이 임베딩값이 user별로 구분이 되어있어야하나요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 13:33 신고 안녕하세요.

    네 일단 제가 진행한 것은 X_train은 doc2vec이 맞구요, y값은 사용자가 보았다, 보지 않았다의 binary label 값입니다.

    음.. 정확히 어떻게 데이터가 되어 있으신지 몰라서 정확히 말씀은 드릴 수 없을 것 같습니다.
    정확도가 무조건 높게 나온다는 것도 보장할 수 없고, 해당 데이터 셋에 저 model이 적합하지 않을 수도 있습니다.

    제가 이해하기로는
    - 음식점 이름 및 업종 이름 = doc2vec - X값
    - 사용자가 봤다, 안봤다 - y 값

    이것이 맞을까요?

    그렇다면, 음식점 따로 업종 따로 embedding을 해서 따로 input으로 넣어줘 보는 것도 방법일 것 같습니다. 또한, doc2vec보다 word2vec 같은 다른 방법도 생각해보세요 ~

    그리고 user 별로 구분되어 있다는 말은 정확히 이해를 잘 못하겠습니다 ㅠㅠ
    doc2vec은 문서(혹은 content)를 embedding 하는 것입니다.

    그래서 사용자가 A문서를 보았다면 A문서에 해당하는 embedding 값을 뽑아서 그걸 training d에 넣는 것입니다!
  • 프로필사진 ㅇㅇ 2020.06.07 18:38 바로 윗 댓글 질문드렸던 사람입니다! 우선 답변 남겨주셔서 감사합니다!
    임베딩 방법을 바꿔보는 것도 한 번 시도해봐야겠습니다. ㅜㅜ
    user별로 구분되어야하는지 질문드린것은 모델에 임베딩 값을 인풋할 때 user_0의 기록 100개에서 viewed의 0, 1을 모델이 보고 1일 때의 임베딩 값을 학습해서 user_0의 경향을 익히는건가 라고 생각해서 여쭤본거에요! 지금 X_train은 임베딩값만 있고 y_train도 0, 1값만 갖고있으니 모델이 학습하는게 유저별 기록을 토대로 유저별 경향을 학습하는게 아니라 사용자 전체의 경향을 학습하는건가 생각이 들어서요
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 19:31 신고 안녕하세요.
    아 무슨 말씀이신지 알겠습니다.
    네 충분히 일리 있는 말씀이시고 저 또한 고민했던 부분입니다.

    그래서 가장 좋은 것은, 모델 input에다가 user의 profile 등의 정보를 함께 넣어주면 더 좋다고 생각됩니다.
    물론, 저도 해당 글에서 시도는 해보지 못했지만, 사용자 프로필 정보가 있고, 그 프로필(예를 들어 나이, 성별 등등) 그것에 따라서 사용자가 보았던 것을 기반으로 훈련을 시켜주면 그래도 좋지 않을까 싶습니다.

    해당 부분은 저도 계속 고민되는 부분이네요 ㅎㅎ 부족한 점 지적해주셔서 감사합니다.
  • 프로필사진 ㅇㅇ 2020.06.07 19:56 헉.. 부족한 점이라니요 ㅠㅠ 아닙니다.
    위에서 작성하신 딥러닝, 머신러닝 포스팅들이 저한테 얼마나 큰 도움이 됐는지 ㅎㅎ
    좋은 글 작성해주셔서 정말 감사드리고 이렇게 댓글로 답변 남겨주신 것도 감사합니다!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.08 06:48 신고 아닙니다 ㅎㅎ
    해당 부분은 나중에라도 꼭 더 좋게 시도해보려고 하고 있습니다 ~
    데이터 셋을 만들어야 하는데, 그게 쉽지 않아서 문제지만요 ㅠ 감사합니다~
  • 프로필사진 우용 2020.08.27 02:34 개인적인 아이디어로 모델을 구현하시는게 너무 멋있습니다.. 이렇게 스스로 모델링 할 수 있으려면 딥러닝에 대한 전반적인 개념과 이론이 선행돼야겠지요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.08.27 10:14 신고 안녕하세요. 좋게 봐주셔서 감사합니다.

    음 어느정도의 개념까지 있으면 좋을 것 같습니다 ㅎㅎ 저도 엄청 잘 아는 것은 아니고, 그냥 이해한거로 시도해 본 것일 뿐입니다.

    저는 너무 이론에만 빠지면 오히려 흥미도 떨어지고 재미도 없더라구요 ㅎㅎ 그래서 그냥 개괄적으로 이해하고 코드로 넘어갔습니다.
댓글쓰기 폼