HuggingFace/실습

User-Based Collaborative Filtering: 영화추천

qoeka 2025. 2. 10. 14:30

User-Based Collaborative Filtering 

 

User-Based Collaborative Filtering은

 

사용자의 과거 평가나 행동을 기반으로 유사한 취향을 가진 다른 사용자를 찾아 추천하는 방식이다.

 

특정 사용자의 취향과 비슷한 사용자 그룹을 형성한 후,

해당 그룹이 높게 평가한 아이템을 추천하는 방식으로 동작한다.

 

 

 

corr은 컬럼과 컬럼 간의 관계를 나타낸다.

 

영화별 상관계수를 구하기 위해서는 피벗 테이블을 생성해야 한다.

이때, 영화 이름을 컬럼으로, 유저 아이디를 인덱스로, 별점 평균을 값으로 설정한다.

 

 

 

 

 

타이타닉 영화에 대해 유저가 준 점수를 확인한 후,

타이타닉 영화와 관계가 높은 영화를 찾아보겠다.  어떻게 찾을까?

 

상관계수를 이용하면 된다.

 

위 사진처럼 상관계수가 1인 영화부터 추천하는 방식으로 진행할 수 있다.

하지만 이렇게 추천해도 될까?

 

상관계수가 1이면 가장 높은 상관관계를 의미하지만, 데이터에 모순이 발생할 수 있다.

어떤 모순일까?


리뷰 개수가 적은 영화도 상관계수 계산에 영향을 받기 때문이다.

 

이를 해결하기 위해 두 번째 사진처럼 리뷰 개수를 확인하는 코드를 작성하면, 일부 영화의 리뷰 개수가 적다는 점을 확인할 수 있다.

 

 

 

이미 본 영화를 다시 추천하면 이상하다. 따라서 영화를 추천할 때는 다음과 같은 기준을 적용해야 한다.

비슷한 영화를 추천하되,

 

사용자가 이미 본 영화는 제외해야 한다. 또한, 상관계수가 0보다 큰 영화만 추천해야 한다. 왜냐하면, 상관계수가 음수인 경우 두 영화가 반대되는 경향을 보이기 때문이다.

 

또한, 실제 서비스에서는 사용자가 별점을 준 기록이 없으면 개인화된 추천이 불가능하다. 이럴 경우, 가장 인기 있는 영화를 보여주는 방식으로 대체할 수 있다.

 

 

적어도 리뷰갯수가 50개 이상인 영화에 대해서 상관계수를 구한다.

 

 

 

별점을 몇점 줬는지 알 수 있게 해야한다

 

웨이트 가중치만들어야한다 그래서 to_frame()을 통해 데이터프레임으로 만들어준다 그리고 보기 편하게 컬럼이름도 변경해준다

 

이웨이트값이 중요하다

 

내가 본 영화 마이레이팅 하나 보니깐 미믹 만봤을때 3점일때 다른영화도 별점을 줬을거다

 

그니깐 방금했던 과정을 다른 것들에도 적용해야한다 

 

그래서 비어있는데 이터를 추가해서 넣어주며 반복문을 사용해서 이 괸계를 계속하는 것이다

 

 

 

 

이제 본영화와 중복된영화를 제거해야한다

 

일단 중복을 하나로 만들어주는게 더 낫기에 중복제거부터해준다

 

 

 

 

 

본영화를 이제 제거할거다 본영화는 레이팅에 제목 들어있으니깐 인덱스에 있으면 삭제하면된다 드롭하면된다 행삭제해야지 중복제거 했으니깐 하나 밖에 없을테니깐

 

본영화는 마이 레이팅에 있다 본영화에 또 있으면 삭제 있으면 삭제 반복하면되겠네

타이틀하나식가져오면 되겠네 

 

 

 

 

이렇게 반복문으로 해도 되지만 

아래와 같은 방법도 있다

 

 

 

이러한 방법을 통하여  추천을 해주면된다