Link
10-22 10:21
«   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
535
Total
1,079,665
관리 메뉴

꿈 많은 사람의 이야기

파이썬 Matrix Factorization 영화 추천 시스템(movie recommender system) 구현해보기 - 2 본문

machine learning(머신러닝)

파이썬 Matrix Factorization 영화 추천 시스템(movie recommender system) 구현해보기 - 2

이수진의 블로그 이수진의 블로그 2020. 1. 31. 07:51

포스팅 개요

해당 글에 대한 코드는 아래 github 링크에 전부 올려두었습니다.

 

lsjsj92/recommender_system_with_Python

recommender system tutorial with Python. Contribute to lsjsj92/recommender_system_with_Python development by creating an account on GitHub.

github.com

 

이번 포스팅은 파이썬(Python)으로 영화 추천 시스템(recommender system) 기본을 구현해보는 두 번째 포스팅입니다.

이번 포스팅에서 구현하는 추천 시스템은 아래와 같은 개념을 기반으로 구현합니다.

  • 잠재 요인 협업 필터링(latent factor collaborative filtering)을 구현하며, 이때 Matrix Factorization(행렬 분해)를 사용해서 구현
  • 사용자 개인에게 맞춤으로 영화를 추천해주는 개인화 추천 방식

지난 포스팅에서도 파이썬으로 Matrix Factorization을 사용해 추천 시스템을 구현해보았습니다.

(https://lsjsj92.tistory.com/569)

 

파이썬으로 추천 시스템 구현하기(Python recommender system) - Matrix Factorization(행렬 분해)를 사용

포스팅 개요 이번 포스팅은 파이썬(Python)으로 추천 시스템(Recommendation system)을 구현해보는 포스팅입니다. 지난 포스팅에는 추천 시스템 협업 필터링(Collaborative Filtering)을 구현해봤습니다. 그 중 아..

lsjsj92.tistory.com

하지만, 이 때의 문제점은 개인에게 맞춤형 추천이 아닌, 특정 영화와 비슷한 영화를 추천해주는 것이었습니다.

즉, 만약에 '가디언즈 오브 갤럭시' 영화를 input으로 넣으면 가오갤과 비슷한 영화 목록을 뿌려주는 것이었죠.

그래서 이번 포스팅에서의 영화 추천 시스템은 사용자 개인 영화 히스토리(movie history)를 기반으로 영화를 추천해주는 추천 시스템을 간단하게 구현해봅니다.

 

해당 자료는 아래에서 참고했습니다.

데이터는 캐글의 MovieLens 데이터를 사용했습니다. (https://www.kaggle.com/sengzhaotoo/movielens-small)


포스팅 본문

이번 파이썬 추천 시스템(Python recommender system) 구현 기본편은 아래의 이론적 내용을 기반으로 합니다.

추천 시스템에서 협업 필터링(collaborative filtering) 내용

 

혹시 내용을 모르신다면 위 내용을 먼저 읽고 오시는 것을 권장합니다.

 

이번 포스팅은 위 내용 중 Python Matrix Factorization 추천 시스템을 간단하게 구현해봅니다.

 

파이썬 코드

 

먼저, 필요한 데이터를 import 합니다. csv 기반이기 때문에 Python의 pandas.read_csv를 사용하면 편리합니다.

이 데이터는 2개의 데이터가 있습니다.

  • 사용자-영화 평점 데이터
  • 영화 정보 데이터

먼저, 사용자-영화 평점 데이터를 pivot table 형식으로 바꿔줍니다.

즉, 사용자 별 각 영화 평점 방식으로 바꿔주는 것입니다. 그러면 N명의 사용자가 있고 M개의 영화가 있으면 N x M 크기의 행렬이 만들어질 것입니다.

위 사진과 같이 말이죠!

 

그 다음으로 각 N명의 사용자들이 매긴 각각의 평균 평점은 어떻게 되는지 구하겠습니다.

그리고 그 값을 사용자-영화 평점(user-movie rating) 값에서 빼도록 하겠습니다.

 

 

그러면 원래 0~5까지 존재하던 평점 데이터 분포가 각 사용자의 평점 평균을 빼니까 0.00025 이런식으로 변경되어 집니다.

 

이런 식으로 말입니다!

아까와 똑같이 영화-사용자 평점 데이터입니다. N 명의 user가 M개의 movie에 rating한 것이죠.

단지, N명의 사용자가 매긴 각각의 평균을 사용자 별로 빼주었기 때문에 값이 조금 변경되었을 뿐입니다.

 

자! 이제 SVD(Singular Value Decompostion), 특이값 분해를 사용해서 latent factor maxtirx factorization을 진행하겠습니다. SVD의 개념은 아래와 같습니다.

우리나라 말로 특이값 분해라고 불리우는 SVD는 m x n 크기의 데이터 행렬 A를 아래와 같이 분리하는 것을 말합니다.

행렬 U와 V에 속한 벡터를 특이벡터(singular vector)라 불리웁니다.

∑로 생긴 것도 행렬인데요. 이 행렬은 대각 행렬(Diagonal Matrix) 성질을 가지고 있습니다. 그래서 대각 성분이 행렬 A의 특이값이고 나머지는 0의 값을 가지고 있습니다.

 

여기서 Truncated SVD도 등장하는데요. Truncated SVD는 SVD의 변형입니다.

즉, ∑ 행렬의 대각원속(특이값) 가운데 상위 p개를 골라낸 것입니다. 이렇게 하면 기존 행렬 A의 성질을 100% 원복할 수 없지만 기존 행렬 A와 거의 근사한 값이 나옵니다.

좀 더 자세히 알고 싶으신 분들은 참조 맨 마지막 링크인 ratsgo님 블로그를 참고해주세요

 

저는 여기서 Python scipy에서 제공해주는 svd를 사용하겠습니다.

Python scikit learn에서도 SVD를 제공해주긴 합니다. 하지만 사이킷런에서는 U, Sigma, Vt를 return하지 않습니다.

그래서 scipy에 있는 svd를 이용해 U, Sigma, Vt를 받을 수 있도록 합니다. 또한, scipy에서 제공해주는 scipy.sparse.linalg.svds는 TruncatedSVD 개념을 사용하므로 이것을 사용하겠습니다.

 

위 사진과 같이 진행을 하면 현재 Sigma 행렬은 0이 아닌 값만 1차원 행렬로 표현된 상태입니다.

즉, 0이 포함된 대칭행렬로 변환할 때는 numpy의 diag를 이용해야합니다.

 

위 파이썬 코드와 같이 말이죠!

 

자, 여기서 현재까지 상황을 한 번 정리하고 넘어가겠습니다.

현재 까지 상황을 정리하면 아래와 같습니다.

  1. 원본 user-movie 평점 행렬이 있었음
  2. 이를 user의 평균 점수를 빼서 matrix_user_mean 이라는 행렬로 만듬
  3. 2번의 값을 SVD를 적용해 U, Sigma, Vt 행렬을 구했음
  4. Sigma 행렬은 현재 0이 포함이 되지 않은 값으로만 구성되어 있음. 이를 대칭행렬로 변환

 

matrix_user_mean을 SVD를 적용해 분해를 한 상태입니다.
이제, 다시 원본 행렬로 복구시켜야겠죠?

원본 행렬로 복구시키는 방법은 아래와 같습니다.

  • U, Sigma, Vt의 내적을 수행

즉, np.dot(np.dot(U, sigma), Vt)를 수행하면 됩니다.

그리고 아까 사용자 평균을 빼주었으니 여기서는 더해줍니다.

그럼 위와 같이 SVD 특이값 분해를 사용해 Matrix Factorization(행렬 분해)를 기반으로 데이터를 변경해줍니다.

 

자! 이제 데이터 준비는 되었습니다. 

Python 함수를 하나 만들죠. 이 함수의 기능은 아래와 같습니다.

  • 인자로 사용자 아이디, 영화 정보 테이블, 평점 테이블 등을 받음
  • 사용자 아이디에 SVD로 나온 결과의 영화 평점이 가장 높은 데이터 순으로 정렬
  • 사용자가 본 데이터를 제외
  • 사용자가 안 본 영화에서 평점이 높은 것을 추천

사용자 히스토리 기반으로 가장 연관성이 높은 영화를 추천해주어야 합니다.

그래서 이미 사용자의 평균 평점 데이터를 넣어놨었죠? 또한, 여기에서는 사용자가 본 영화는 제외하고 영화를 추천해줍니다.

이렇게 함수를 만들었습니다.

그럼 이제 결과를 봐봅니다.

330번 user가 Matrix Factorization 기반의 추천 시스템에게 받은 영화 추천 목록입니다.

이렇게 추천을 받을 수 있습니다.


이번 포스팅에서는 파이썬을 활용해 Matrix Factorization 기반 영화 추천 시스템을 만들어보았습니다.

그리고, 지난 포스팅에서 못했던 사용자 개인에게 추천해주는 것도 적용해보았습니다.

코드가 완벽하지는 않을겁니다. 제가 잘하는 사람이 아니라서요.

하지만, 부디 어떤 분들에게는 도움이 되길 바랍니다.

 

다음 포스팅에서는 좀 독특한 방법으로 추천 시스템을 적용해보겠습니다.

39 Comments
  • 프로필사진 thnku 2020.03.19 18:49 raise ValueError("k must be between 1 and min(A.shape), k=%d" % k)
    ValueError: k must be between 1 and min(A.shape), k=6

    여기서 k 값을 이해를 잘 못하겠어서 댓글 남겨 봅니다.

    이게 어떤경우에 걸리는건지 알수 있을까요? 쿼리로 로드해서 테스트 진행중인데 일부 작은 데이터들에서 저런 에러가 나는데 어떤 이유에서인지를 잘 모르겠어서요

    혹시 간단하게 알려주실수 있으실까요 구글링은 영어라 이해를 못하겠습니다^^;

    저 값을 안주고 해도.. U, sigma, Vt = svds(matrix_user_mean)..이런식으로 해도 특정 데이터셋에서만 에러가 나서 문의 드렸습니다

    우선 기본 설명 해주신 데이터로는 제대로 잘 돌아갑니다 덕분에 많이 배웠습니다 미리 감사드립니다~

  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.03.19 22:03 신고 안녕하세요.
    해당 SVD부분에서 K는 특이값 분해의 차원이라고 생각하시면 됩니다.

    어떤 데이터를 어떻게 사용하시는지 잘 모르겠어서.. 제가 확답을 드릴 수가 없네요.

    일부 작은 데이터들에서 나온다고 하시는 것 보니, k가 적은 데이터의 차원수보다 큰 것일 수도 있구요.

    그냥 이렇게만 봐서는 저도 잘 모르겠습니다 ㅠㅠ 죄송해요
  • 프로필사진 보노보노 2020.05.05 14:23 안녕하세요, 너무나 큰 도움 되었습니다. 제가 가진 데이터에 적용시켜보다가 질문이 있어 댓글 남기게 되었습니다.

    작성하신 것처럼 1,2,3,4,5로 평점을 매기는 다른 데이터에 적용해보는 도중에,
    마지막에 나오는 sorted_user_predictions을 살펴보았습니다. ( 이미 매긴 rating들을 제외해주기 전)
    그러나 이때, 가장 상위에 분포하고 있을거라 생각했던, 해당 user가 최고점인 5점을 매긴 대상들이, 그렇지 않음을 확인했습니다.
    5점을 받은 대상은 최상단에 위치해야한다고 생각했는데 그렇지 않아서 의아했습니다.

    (최상단에 위치한 모든 대상이 이전에 5점을 매긴 대상일 필요는 없지만, 적어도 이전에 5점을 매긴 대상은 최상단에 위치해야 한다고 생각했습니다.)

    이런 결과가 나올 수 있는건가요? 아니면 제가 생각하지 못하는 부분이 있는건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.06 09:35 신고 안녕하세요. 도움이 되셨다면 다행입니다.
    음.. 저도 그 부분은 체크를 굳이 해보질 않아서 정확하게는 말씀드릴 수는 없을 것 같습니다.
    다만, 그럴 수 있다고는 생각이 들긴하네요.

    결국은 SVD로 인해 차원이 축소된 결과로 사용자가 평점을 매기지 않았던 정보들에 대해서도 점수가 들어갈 수 있기 때문이죠.
    그러면, 사용자가 이전에 5점을 매겼고 X라는 영화에 대해서 아무런 평점을 매기지 않았다고 했을 때 SVD 결과로 인해 X의 결과가 이전에 매긴 5점의 결과보다 score 값이 높게 나올 수도 있을 것 같습니다.

    그래서 보노보노님께서 걱정하시는 바와 같이 최상단에 똑같이 위치하지 않을 수도 있지만, 그래도 SVD의 결과 추측상 상위권에는 있을 것이라고 생각이 드네요. (저의 경험으로 비추어 볼때요 ㅎㅎ)
  • 프로필사진 민트카카오 2020.05.06 15:45 신고 이 포스팅 덕분에 이해하기 수월했습니다. 감사합니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.06 16:38 신고 도움 되셨다면 다행입니다 ㅎㅎ
  • 프로필사진 PMS 2020.05.13 17:00 좋은 자료 감사드립니다. 도움이 많이 되었습니다~

    데이터 핸들링 하신 부분 관해서 한 가지 질문있습니다!
    사용자-영화에 대해 사용자의 평균 평점을 빼신 이유가 궁금합니다.
    혹시 data normalization을 위해서 해당 작업을 해주신 걸까요~?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.13 21:46 신고 안녕하세요.

    저도 해당 부분은 kaggle에 내용을 필사하면서 똑같이 따라했는데요.
    딱히, 큰 이유는 모르겠고 저도 data normalization으로 생각했습니다.
    데이터 중 0인 데이터도 많고 하니까요~
  • 프로필사진 rose 2020.05.15 13:49 안녕하세요
    올려주신 좋은 자료 덕분에 많이 배워갑니다!

    공부하면서 제가 이해한게 맞는지 질문이 생겼습니다.

    df_user_movie_ratings.tail(10) , 즉 처음의 행렬과
    svd 를 사용해서 원본 행렬을 복구한 값 행렬 df_svd_preds를 서로 비교해보면

    1. 원본 행렬에서 높은 평점을 주었던 부분이 복구된 행렬에서 높은 값을 보이는게 맞나요?

    확인해본 결과 높게 나오기는 하지만 0에 해당하는 부분들과 점수 차이가 분명하지 않네요..

    2. k 부분이 특이값 분해의 차원이라고 말씀하셨는데 이것이 추출하는 잠재 요인의 개수라고 생각하면되는건가요? 그리고 이 k를 정하는 기준이 있을까요?

    감사합니다

  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.16 10:21 신고 안녕하세요.

    1. 점수 차이가 분명하지 않은 이유는 k 차원의 개수가 줄어든 만큼 그 값어치에 근사하지 못하기 때문일 것이라 생각됩니다.
    만약, k 차원의 개수를 원본 차원과 똑같이 했다면 높은 평점을 주었던 부분이 높은 값을 보여주겠죠? 이런 의미에서 생각하시면 될 것 같습니다

    2. 네 맞습니다. k의 개수 또한 하이퍼파라미터 입니다. 적절한 것을 찾아내야합니다. 기준까지는 잘 모르겠어요 ㅠㅠ
  • 프로필사진 공부하는대학생 2020.05.24 14:24 안녕하세요 우선 좋은 자료와 예제들 감사드립니다. 궁금한 것이 생겨서 글 남깁니다. matrix factorization 기법을 사용하셨다고 했는데요. 해당 포스팅글을 보면 수많은 파라미터 값들이 이 기법으로 단순히 사용자 x 아이템 간의 관계가 아니라 사용자 x feature x 아이템 간의 관계가 되면서 파라미터 수가 줄어드는 부분이 있습니다. 그렇다면 여기서는 어떤 값이 feature값으로 적용이 된것인가요? 사용자의 별점값들이 feature가 된것인가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.25 09:25 신고 안녕하세요
    MF의 방법론이 그 차원수를 줄여주는 것입니다.
    어떤 값이 feature로 되는 것이라고 하면 그건 알 수가 없습니다 ㅎㅎ
    MF를 한다는 것 자체가 기존의 데이터에서 차원의 수를 줄여, 기존 데이터를 표현할 수 있는 벡터로 표현하는 것이기 때문입니다.
    예를 들어서 사용자-영화 데이터를 2개의 feature로 MF를 진행했다면, 2개의 latent factor는 '오락, 액션' 과 같은 의미를 담고 있을 수도 있겠네요 ~
  • 프로필사진 공부하는대학생 2020.05.24 14:47 더불어서 처음 이 기법을 이용해서 영화와 비슷한 영화들을 추천을 할때에는 SVD기법을 하고나서 corr을 이용을 해서 피어슨의 상관계수를 이용해서 관련도를 넣어주셨습니다. 그런데 개인화에 맞춘 영화를 추천을 할때에는 corr이부분이 이용이 안된것 같은데 SVD기법만으로도 사용자와 아이템간의 관계에 있어서 비어진부분에 연관도가 채워질수 있는건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.25 09:32 신고 첫 글에서 제가 corr을 이용한 것과 해당 글은 약간의 '목적' 차이가 있습니다.

    첫 글에서 corr을 이용한 것은 '어떤 영화와 비슷한 영화'를 뽑아내기 위함이고
    본 글에서의 목적은 '한 유저와 제일 관련 있는 영화' 입니다.

    그렇기에 첫 글에서는 corr을 사용을 했습니다.

    개인화에서 svd를 이용하게 된다면, 결국엔 사용자가 매긴 '영화의 점수'가 svd를 적용 후 값이 바뀌게 됩니다. 여기서 사용자가 본 영화를 제외하고 svd로 나온 값이 높은 영화를 추천하면 사용자에게 맞춤형 영화가 추천되는 것이죠
  • 프로필사진 공부하는대학생 2020.05.26 15:52 답변 감사드립니다. MF자체가 기존의 데이터에서 차원의 수를 줄여 기존데이터를 표현할 수 있는 벡터로 표현이 된다고 하셨습니다. 예를 들어서 영화를 본 사용자들을 index로 지정하고 영화의 제목들을 feature로 지정을 하고 그에 대한 평점을 표로 나타내서 데이터로 사용된다고 가정합니다. 이것을 svd기법으로 추천을 한다고 했을때, 결국에는 영화 title이 가지는 문맥적의미와 사용자간의 관계가 연관이 되어서 추천이 된다고 볼 수 있는건가요? 그 추천 정도는 별점을 통해서 연관성이 높다고 판단을 하는것일까요? 문맥에 한정되는 것이 아닐경우, 결론적으로는 사용자가 영화에 매기는 별점을 기반으로 (사용자가 어떤 영화에 높은 별점을 주는데는 여러가지의 이유가 있을것이다.) 추천을 하는것이 svd기법인가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.27 09:18 신고 안녕하세요.
    댓글이 여러개라 어디에 답변을 달아야 할 지 몰라 그냥 하나하나 달겠습니다.
    먼저, MF에 대해서 잘 나와있는 유튜브 설명이 있습니다.
    https://www.youtube.com/watch?v=ZspR5PZemcs&feature=youtu.be

    여기 참고하시면 어느정도 이해가 되실 겁니다.
    또한, MF의 기법 중 SVD가 있는 것입니다.
    사용자가 영화에 매기는 별점을 기반으로 추천을 하는 것이 SVD가 아니라, 어떤 벡터 공간이 있을 때 이 벡터 공간의 차원을 줄이면서, 기존의 벡터 공간을 표현할 수 있는 '표현'을 찾아내는 것이 SVD라고 생각하시면 될 것 같습니다.
  • 프로필사진 공부하는대학생 2020.05.26 16:40 더불어서 영화와 비슷한 영화를 고르기 위한 포스팅 부분에서 질문이 있습니다. 여기서 이용되는 corr는 문맥간의 관계에서 오는 상관관계를 판단하는 것인가요? 아니면 별점을 기반으로해서 상관관계를 분석을 하나요? 가디언즈 오브 갤럭시를 넣으셨을때 마블과 관계되는 영화가 꽤 나왔었는데 이를 보면 타이틀이 가지는 문맥을 기반으로 분석이 되는건가요? 아니면 단순히 사용자의 영화타이틀에 대한 별점을 기반으로 해서 이렇게 추론이 된건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.27 09:20 신고 코드를 보시면 아시겠지만, corr을 하기 전에 SVD를 진행했습니다. 이 SVD로 나온 score 값을 이용해서 각 영화마다 상관관계를 본 것입니다.
    title이 가지는 문맥 기반으로도 얼마든지 가능합니다 ~
    다만, 여기 글에서는 그렇게 사용하지 않았을 뿐이죠 ㅎㅎ
  • 프로필사진 공부하는대학생 2020.05.26 19:27 마지막으로 생각을 더 해봤는데, Mf기법은 참고하신 https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/04/06/pcasvdlsa/
    를 고려하면, 사용자 - 영화타이틀 - 별점 을 각각 기저로 가지는 3차원 데이터형을 2차원으로 그 차원수를 줄여서 일종의 연관관계를 가지는 벡터로 나타낼 수 있다는 뜻이 되나요? 직관적으로 이해를 하면 사용자가 영화에 별점을 내렸을 때는, 이미 그 행위 자체에서 사용자가 가지는 영화에 가지는 취향(마블,액션,무협)같은 것들이 latent factor로 적용이 되었다고 볼 수 있는 건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.27 09:22 신고 벡터의 차원 수는 말씀하신대로 3차원으로 볼 수도 있구요, '영화'를 기준으로 하면 영화의 개수가 차원의 수가 될 수도 있습니다. 이거는 목표에 따라 달라지겠네요.

    어쨌던, 기존의 공간(예를 들어 100차원)을 10차원으로 줄이고 싶은데(차원이 너무 크니) 10차원으로 줄여서 기존의 100차원의 벡터를 표현할 수 있는 것을 찾아내는 것이 MF의 방법입니다.
    그리고 MF에서 찾아낸 10차원의 요소가 latent factor입니다. (저는 그렇게 이해했어요 ㅎㅎ)
  • 프로필사진 공부하는대학생 2020.05.26 19:29 그러한 효과를 주기위해 3차원의 데이터형을 가지는 user_movie_rating 의 데이터를 svd기법을 사용해서 U x sigma x Vt 의 형태로 차원을 줄여서 나타낸 후 sigma 행렬을 componet 수를 줄여 나타낸후, 다시 내적을 통해서 복원을 하는 기법을 사용하는 건가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.27 09:24 신고 네 맞습니다. 차원을 줄여서 표현한 후 그 줄인 차원을 기반으로 다시 값을 복원하는거죠.
    그러면, 사용자가 점수를 매기지 않은 요소의 점수들이 어떤 score 값이 나오겠죠?
    이것을 이용해서 사용자들이 어떤 영화에 관심을 갖을 지, 아니면 어떤 영화와 비슷한 영화는 무엇인지 뽑아내는 것입니다.
  • 프로필사진 감사합니다 2020.06.16 20:42 안녕하세요. 좋은 글 포스팅해주셔서 감사합니다. MF를 이해하는데 많은 도움이 됐습니다.
    궁금한 점이 하나 있습니다. 이 예시에서는 평점을 예측하는데 평점이 아닌 장바구니 담기 여부나 구매 여부와 같이 예측하려는게 0,1로 이루어진 바이너리 데이터일 때도 이 알고리즘을 그대로 사용해도 괜찮은지 궁금합니다.
    감사합니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.17 09:32 신고 안녕히세요.
    네 풀 수 있을 것 같습니다.
    user-item 행렬이 있다고 하면
    예를 들어 구매를 했으면 5점, 장바구니는 3점, 구매하지 않은 것은 1점 등으로 점수를 분포시키면 될 것 같네요 ~
    만약, user history가 있다면 굳이 MF를 사용하지 않고도 딥러닝 기반 등을 사용할 수 있을 것 같습니다.
  • 프로필사진 김기남 2020.08.30 17:53 큰 도움이 되었습니다. 감사합니다!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.08.30 19:18 신고 도움 되셨다니 다행입니다!
  • 프로필사진 lj 2020.09.06 15:02 안녕하세요 추천 시스템을 이용한 프로젝트를 진행하고 있는 사람입니다.
    블로그에 있는 좋은 글들 잘 보고 있습니다.
    한 가지 질문이 있는데요 다루는 데이터가 0과 1로 이루어진 데이터인데 이 알고리즘을 그대로 적용해도 괜찮을까요?
    저와 비슷한 상황이신 윗분에게 쓰신 댓글처럼 점수를 분포시킬수는 없을 거같습니다.(꼭 데이터가 0과 1로 이루어져야 될 것 같습니다.)
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.06 16:58 신고 안녕하세요.

    일단 데이터가 정확히 어떻게 0과 1로 이루어져있는지 알아야 할 것 같습니다.
    item-user matrix에서 값이 0, 1로 이루어졌다는 말씀이실까요?

    그리고 일단 가지고 계신 dataset을 이용해서 '어떤 문제를 해결하고 싶은지'를 명확하게 해주시면 더 좋을 것 같습니다.

    RecSys도 다양한 방법이 있기 때문에 굳이 MF 모델로 풀 필요가 없으니까요!
  • 프로필사진 lj 2020.09.08 13:12 네 item-user matrix에서 값이 0과 1로 이루어져 있습니다.
    뉴스 추천 시스템을 구현중에 있는데(사용자 기반으로 사용자 개인에게 뉴스를 추천해주고 싶습니다!), 뉴스의 접근 기록을 기준으로 접근하였으면 데이터를 1, 접근하지 않았다면 0으로 설정하였습니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.08 22:04 신고 안녕하세요.

    음.. 애매하네요. 일단 lj님께서 가정은 '접근 하였으면 보았다' 라고 가정하시는걸까요?

    말씀하신 데이터는 MF 모델은 적합하지 않은 것 같습니다.

    News RecSys의 같은 경우에는 다음과 같은 feature가 필요할 것 같아요.

    1. 사용자가 뉴스를 본 날짜(뉴스는 최신 것, 즉 날짜 데이터가 중요합니다.)
    2. 사용자가 본 뉴스의 메타데이터(뉴스의 주제나 등등)

    그 외에도 다양하게 많이 있지만, 사실상 현업이 아닌이상 구하기 힘들 것 같은 데이터라서 적지 않겠습니다.

    위와 같은 데이터를 활용해서 사용자가 보았다, 보지 않았다의 classification 문제로 풀어보심이 어떠하신가요?

    아니면 Sequential based RecSys 모델도 있습니다.
  • 프로필사진 JY 2020.09.18 22:09 안녕하세요 ! 이해하기 쉽게 설명해주셔서 많은 도움이 되었습니다.

    한 가지 궁금한 점이 있습니다. 평점 이외에도 다른 변수들도 추천 시스템에 포함시킬 수 있을까요? 러닝타임과 같은 연속형 변수나 출연 배우와 같은 명목형 변수도 함께 고려하면 좋을 것 같은데, 데이터 셋을 어떻게 구성해야 할지 모르겠습니다.

    감사합니다 !
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.09.19 15:34 신고 안녕하세요.

    음 일반적인 MF 모델에서는 넣기가 쉽지 않습니다.
    평점 이외에도 다른 변수를 추가하려면 딥러닝 모델을 사용하거나 FM(Factorization Machine) 모델 방법이 있을 수 있겠네요.

    FM은 제가 잘 모르지만 deep learning에선 충분히 가능합니다.

    아니면 MF 모델을 여러개 만들어서 이들을 각각 잘 조합하는 방법도 사용한다고 들었습니다. 이거까지는 잘 모르겠어요 ㅠ
  • 프로필사진 JY 2020.09.20 20:21 아 그렇군요! 답변 감사드립니다^_^
  • 프로필사진 2020.10.06 11:10 비밀댓글입니다
  • 프로필사진 2020.10.06 20:47 비밀댓글입니다
  • 프로필사진 2020.10.07 14:53 비밀댓글입니다
  • 프로필사진 2020.10.07 20:00 비밀댓글입니다
  • 프로필사진 2020.10.08 01:32 비밀댓글입니다
  • 프로필사진 2020.10.08 10:03 비밀댓글입니다
댓글쓰기 폼