Skip to main content
Summary

비슷한 사람을 묶었다면, 이제 무엇을 권할 수 있을까

이전 장에서 우리는 사용자를 비슷한 행동 패턴끼리 묶어 보았다. 자주 접속하지만 결제는 적은 사용자, 한 번에 많이 구매하지만 방문 주기가 긴 사용자, 무료 기능만 꾸준히 쓰는 사용자처럼 말이다. 군집화가 "이 사람들은 서로 닮았다"를 발견하는 일이라면, 추천 시스템은 그 다음 질문을 던진다.

"그렇다면 이 사람에게 무엇을 보여 주면 좋을까?"

추천 시스템은 머신러닝이 우리 일상에 가장 자연스럽게 스며든 방식 중 하나다. 쇼핑몰의 "이 상품을 본 고객이 함께 본 상품", 영상 서비스의 "당신을 위한 추천", 음악 앱의 "취향에 맞는 플레이리스트", 뉴스 앱의 "관심 있을 만한 기사"가 모두 추천 시스템의 결과다.

겉으로 보면 추천은 마치 사람의 취향을 읽는 마술처럼 보인다. 하지만 안으로 들어가 보면 원리는 의외로 단순한 질문에서 출발한다.

사용자가 과거에 무엇을 보았는가? 무엇을 클릭했는가? 무엇을 구매했는가? 비슷한 사용자는 무엇을 좋아했는가? 비슷한 아이템은 또 무엇인가?

추천 시스템은 이 흔적들을 모아 "다음에 관심을 가질 가능성이 높은 것"을 고르는 모델이다. 회귀처럼 숫자를 예측할 수도 있고, 분류처럼 클릭 여부를 예측할 수도 있으며, 군집화처럼 비슷한 사용자나 아이템을 찾을 수도 있다. 그래서 추천은 지금까지 배운 머신러닝의 여러 감각이 한곳에 모이는 흥미로운 문제다.

추천 시스템 맛보기

추천 문제의 세 가지 주인공

추천 시스템을 이해하려면 먼저 세 가지 기본 단위를 알아야 한다. 사용자, 아이템, 상호작용이다.

사용자는 추천을 받는 사람이다. 쇼핑몰 고객, 영상 서비스 회원, 음악 앱 사용자, 뉴스 앱 독자가 모두 사용자에 해당한다. 아이템은 추천의 대상이다. 상품, 영화, 노래, 강의, 글, 식당, 여행지처럼 사용자가 선택할 수 있는 모든 것이 아이템이 될 수 있다.

그리고 가장 중요한 것이 상호작용이다. 상호작용은 사용자와 아이템 사이에 남은 행동의 흔적이다.

사용자아이템상호작용
민지무선 이어폰클릭
민지블루투스 스피커장바구니 담기
준호무선 이어폰구매
서연러닝화구매
서연스포츠 양말클릭

이 표를 보면 아직 거창한 인공지능은 없다. 하지만 추천 시스템은 바로 이런 표에서 시작한다. 누가 무엇과 만났는지, 그 만남이 얼마나 강한 관심을 의미하는지 해석하는 것이다.

상호작용에는 두 종류가 있다. 하나는 사용자가 직접 취향을 표현한 명시적 피드백이다. 별점, 좋아요, 싫어요, 리뷰 점수처럼 사용자가 비교적 분명하게 평가를 남긴 경우다. 다른 하나는 행동으로 드러난 암묵적 피드백이다. 클릭, 조회, 검색, 장바구니, 구매, 재생 시간, 다시 보기 같은 것들이 여기에 해당한다.

명시적 피드백은 의미가 분명하지만 많이 모으기 어렵다. 별점을 꼬박꼬박 남기는 사용자는 생각보다 적다. 반대로 암묵적 피드백은 대량으로 모을 수 있지만 해석이 조심스럽다. 어떤 상품을 클릭했다고 해서 반드시 좋아했다는 뜻은 아니다. 실수로 눌렀을 수도 있고, 제목이 이상해서 확인만 했을 수도 있다. 영상을 오래 봤다고 해서 즐거웠다는 뜻도 항상은 아니다. 잠시 틀어 놓고 자리를 비웠을 수도 있다.

그래서 추천 시스템은 상호작용을 그대로 믿기보다, 여러 행동을 함께 보며 관심의 강도를 추정한다. 클릭보다 장바구니가 더 강한 신호일 수 있고, 장바구니보다 구매가 더 강한 신호일 수 있다. 음악 앱에서는 한 곡을 끝까지 들었는지, 반복 재생했는지, 건너뛰었는지가 중요한 신호가 될 수 있다.

추천 데이터는 결국 다음과 같은 질문으로 정리된다.

"이 사용자가 이 아이템에 관심을 가질 가능성은 얼마나 될까?"

사용자-아이템 표: 추천은 빈칸 채우기다

추천 시스템을 가장 직관적으로 이해하는 방법은 사용자와 아이템을 표로 놓고 보는 것이다. 행에는 사용자를 놓고, 열에는 아이템을 놓는다. 칸에는 사용자의 반응을 적는다.

무선 이어폰러닝화블루투스 스피커커피 원두요가 매트
민지구매클릭
준호구매구매
서연구매클릭
도윤클릭구매

여기서 빈칸은 아직 모르는 관계다. 민지가 러닝화를 좋아할까? 준호가 커피 원두에 관심을 보일까? 서연에게 요가 매트를 추천하면 구매할까?

추천 시스템은 이 빈칸을 그럴듯하게 채우려 한다. 모든 사용자에게 모든 아이템을 직접 보여 줄 수는 없다. 아이템이 100개라면 어느 정도 가능해 보이지만, 10만 개라면 이야기가 달라진다. 사용자는 그중 극히 일부만 본다. 추천의 역할은 수많은 후보 중에서 "지금 이 사용자에게 보여 줄 만한 것"을 좁혀 주는 것이다.

이 관점에서 보면 추천은 아주 익숙한 머신러닝 문제로 바뀐다.

데이터를 준비한다. 사용자, 아이템, 상호작용 기록을 모은다.

특징을 만든다. 사용자의 최근 행동, 아이템의 카테고리, 가격대, 인기도, 사용자가 선호한 장르 등을 숫자로 표현한다.

모델이 예측한다. 이 사용자가 이 아이템을 클릭하거나 구매할 가능성을 계산한다.

실제값과 비교한다. 과거 데이터에서 실제로 클릭했는지, 구매했는지 확인한다.

오차를 줄인다. 더 그럴듯한 추천이 나오도록 모델을 조정한다.

새로운 데이터에 적용한다. 오늘 접속한 사용자에게 지금 보여 줄 아이템을 고른다.

우리가 책 전체에서 반복해 온 흐름이 추천에서도 그대로 나타난다. 다만 추천에서는 예측 대상이 "집값"이나 "스팸 여부"가 아니라 "사용자와 아이템 사이의 미래 반응"이라는 점이 다르다.

가장 단순한 추천: 모두에게 인기 있는 것을 보여 주기

추천 시스템을 처음 만들 때 가장 쉬운 방법은 인기 기반 추천이다. 전체 사용자에게 많이 클릭된 상품, 많이 팔린 상품, 평점이 높은 영화, 많이 재생된 음악을 추천하는 방식이다.

예를 들어 쇼핑몰에 새로 들어온 사용자에게 아직 아무 정보가 없다면, 다음과 같은 상품을 보여 줄 수 있다.

  • 최근 일주일 동안 가장 많이 팔린 상품

  • 같은 카테고리에서 장바구니에 가장 많이 담긴 상품

  • 평점이 높고 리뷰가 많은 상품

  • 계절이나 이벤트와 관련된 인기 상품

이 방식은 놀라울 정도로 강력하다. 데이터가 적어도 쓸 수 있고, 설명하기 쉽고, 구현도 간단하다. "요즘 가장 많이 팔리는 상품입니다"라는 설명은 사용자에게도 자연스럽다.

하지만 인기 기반 추천에는 뚜렷한 한계가 있다. 모두에게 같은 것을 보여 준다는 점이다. 러닝화를 찾는 사람에게도, 커피 원두를 찾는 사람에게도, 아이 장난감을 찾는 사람에게도 같은 인기 상품을 보여 준다면 개인화라고 부르기는 어렵다.

또 하나의 문제는 인기의 쏠림이다. 이미 인기 있는 아이템은 더 많이 노출되고, 더 많이 노출되니 더 많이 클릭된다. 그러면 추천 시스템은 계속 같은 인기 아이템만 밀어 주게 된다. 숨은 좋은 아이템은 사용자를 만날 기회조차 얻기 어렵다.

그렇다고 인기 기반 추천이 나쁜 것은 아니다. 오히려 대부분의 추천 시스템은 인기 기반 추천을 기본 기준선으로 삼는다. 머신러닝 모델을 만들었는데 단순 인기 추천보다 성능이 낮다면, 아직 모델이 충분히 좋은 패턴을 찾지 못했다는 뜻일 수 있다. 좋은 프로젝트에서는 복잡한 모델을 바로 만들기보다, 먼저 간단한 기준선을 세운다.

추천에서도 마찬가지다. 처음에는 이렇게 물어야 한다.

"개인화를 하지 않아도 이 정도는 맞힐 수 있다. 그렇다면 개인화 모델은 이보다 얼마나 더 나아졌는가?"

개인화 추천: 모두가 아니라, 이 사람에게 맞추기

개인화 추천은 사용자마다 다른 추천 결과를 만드는 방식이다. 같은 쇼핑몰 첫 화면이라도 어떤 사람에게는 캠핑 장비가 보이고, 어떤 사람에게는 반려동물 용품이 보이며, 어떤 사람에게는 책과 문구가 보인다.

개인화 추천이 가능하려면 사용자마다 다른 신호가 있어야 한다. 과거 구매 이력, 클릭한 상품, 오래 머문 페이지, 검색어, 관심 카테고리, 찜한 아이템, 장바구니 기록 같은 것들이다. 이런 신호는 사용자의 취향을 직접 말해 주지는 않지만, 취향을 추정할 단서를 준다.

민지가 최근 무선 이어폰, 블루투스 스피커, 노이즈 캔슬링 헤드폰을 자주 봤다면 전자기기에 관심이 있을 가능성이 높다. 서연이 러닝화, 요가 매트, 스포츠 양말을 봤다면 운동용품에 관심이 있을 가능성이 높다. 도윤이 커피 원두, 핸드드립 주전자, 그라인더를 구매했다면 커피 관련 상품을 추천할 수 있다.

이때 추천 시스템은 단순히 "이 사람이 전에 본 것과 똑같은 것"만 보여 주면 안 된다. 이미 산 무선 이어폰을 또 추천하는 것은 별로 도움이 되지 않는다. 좋은 추천은 사용자의 관심을 이어 가되, 조금 더 넓혀 준다. 무선 이어폰을 산 사람에게 이어팁, 케이스, 충전기, 음악 스트리밍 이용권을 추천할 수 있다. 러닝화를 산 사람에게 스포츠 양말, 러닝 벨트, 마라톤 입문 책을 추천할 수도 있다.

개인화 추천의 핵심은 다음 문장으로 요약할 수 있다.

"모든 사용자에게 좋은 아이템"이 아니라 "이 사용자에게 지금 좋은 아이템"을 찾는 것이다.

이 차이는 작아 보이지만 매우 크다. 머신러닝이 제품 경험을 바꾸는 순간은 바로 여기서 나온다. 같은 서비스라도 사용자마다 다른 입구가 생기고, 다른 탐색 경로가 생기며, 다른 발견의 경험이 만들어진다.

협업 필터링: 취향은 사람들 사이에서 드러난다

추천 시스템에서 가장 유명한 아이디어 중 하나가 협업 필터링이다. 이름은 조금 딱딱하지만, 직관은 매우 인간적이다.

"나와 취향이 비슷한 사람이 좋아한 것을 나도 좋아할 가능성이 있다."

우리는 일상에서도 이렇게 추천을 받는다. 영화 취향이 비슷한 친구가 어떤 영화를 강력히 추천하면, 전혀 모르는 사람이 추천했을 때보다 더 믿음이 간다. 커피 취향이 비슷한 동료가 새 원두를 추천하면 한 번 사 보고 싶어진다. 협업 필터링은 이런 감각을 데이터로 구현한 방법이다.

간단한 예를 보자.

사용자본 영화 A본 영화 B본 영화 C본 영화 D
민지좋음좋음
준호좋음좋음좋음
서연좋음좋음
도윤좋음좋음좋음

민지와 준호는 영화 A와 B를 모두 좋아했다. 그렇다면 준호가 좋아한 영화 C를 민지에게 추천해 볼 수 있다. 민지와 도윤도 A와 B를 함께 좋아했다. 도윤이 좋아한 영화 D 역시 후보가 될 수 있다.

이것이 사용자 기반 협업 필터링의 기본 생각이다. 먼저 사용자끼리 얼마나 비슷한지 본다. 그런 다음 나와 비슷한 사용자들이 좋아했지만 나는 아직 보지 않은 아이템을 추천한다.

반대로 아이템끼리 비슷하다고 볼 수도 있다. 이것을 아이템 기반 협업 필터링이라고 한다. "이 상품을 산 사람들이 함께 산 상품", "이 영화를 본 사람들이 함께 본 영화"가 대표적인 예다.

무선 이어폰과 블루투스 스피커를 함께 구매한 사용자가 많다면 두 아이템은 어느 정도 가까운 관계일 수 있다. 러닝화와 스포츠 양말을 함께 구매한 사용자가 많다면 두 아이템도 함께 추천할 만하다. 이 방식에서는 사용자가 어떤 아이템을 좋아했을 때, 그 아이템과 비슷하게 소비된 다른 아이템을 찾아 추천한다.

협업 필터링이 흥미로운 이유는 아이템의 내용을 몰라도 추천할 수 있다는 점이다. 영화의 줄거리, 상품 설명, 음악 장르를 깊이 이해하지 않아도 된다. 많은 사용자의 행동 패턴만 있으면 "함께 좋아한 것", "함께 구매한 것", "비슷한 사람들이 선택한 것"을 찾을 수 있다.

물론 단점도 있다. 새 사용자에게는 과거 행동이 없으므로 취향을 알기 어렵다. 새 아이템은 아직 아무도 클릭하거나 구매하지 않았으므로 누구와 비슷한지 알기 어렵다. 이것을 콜드 스타트 문제라고 한다. 추천 시스템에서 "차갑다"는 말은 데이터가 아직 충분히 쌓이지 않았다는 뜻에 가깝다.

그래서 실제 추천 시스템은 협업 필터링만 쓰지 않는다. 아이템의 카테고리, 제목, 설명, 가격, 브랜드 같은 내용 정보도 함께 사용한다. 사용자의 나이대, 지역, 가입 경로, 관심 설정처럼 조심스럽게 사용할 수 있는 사용자 정보도 참고할 수 있다. 중요한 것은 한 가지 방법이 모든 문제를 해결하지 않는다는 점이다. 추천은 여러 신호를 섞어 점점 더 나은 판단을 만드는 일에 가깝다.

비슷하다는 말은 어떻게 계산할까

협업 필터링에서는 "비슷한 사용자" 또는 "비슷한 아이템"을 찾아야 한다. 그렇다면 컴퓨터는 비슷함을 어떻게 계산할까?

여기서 이전에 배운 벡터 감각이 다시 등장한다. 사용자의 행동을 숫자 목록으로 표현할 수 있다. 예를 들어 다섯 개 상품에 대해 클릭하거나 구매했는지를 0과 1로 나타내면 사용자 한 명은 하나의 벡터가 된다.

사용자이어폰러닝화스피커원두요가 매트
민지10100
준호10100
서연01001
도윤00010

민지와 준호는 숫자 배열이 같다. 둘은 매우 비슷하다. 민지와 서연은 겹치는 관심이 없다. 둘은 상대적으로 멀다. 이렇게 사용자를 숫자 공간의 점으로 놓으면, 가까운 점끼리 비슷하다고 볼 수 있다.

아이템도 마찬가지다. 어떤 사용자들이 그 아이템을 클릭했는지, 구매했는지를 기준으로 아이템을 숫자 벡터로 표현할 수 있다. 두 아이템을 선택한 사용자 집합이 비슷하면, 두 아이템도 비슷하다고 볼 수 있다.

여기서 중요한 것은 정확한 수식이 아니다. 추천 시스템이 사람이나 상품을 그냥 이름으로 보는 것이 아니라, 행동 패턴으로 만들어진 숫자 표현으로 본다는 감각이다. 앞에서 임베딩을 이야기할 때 "의미를 숫자 공간에 놓는다"고 했다. 추천에서도 비슷한 일이 일어난다. 사용자와 아이템을 숫자 공간에 놓고, 가까운 것끼리 연결한다.

이렇게 생각하면 추천 시스템은 갑자기 친숙해진다. 군집화에서는 가까운 사용자를 묶었다. 추천에서는 가까운 사용자나 아이템을 이용해 다음 선택을 추측한다. 즉, 추천은 군집화의 감각을 한 걸음 더 실용적인 방향으로 밀고 간 문제라고 볼 수 있다.

간단한 추천 시스템을 설계해 보자

이제 작은 쇼핑몰 추천 시스템을 만든다고 상상해 보자. 목표는 사용자가 상품 상세 페이지를 보고 있을 때, 아래에 "함께 보면 좋은 상품"을 보여 주는 것이다.

가장 먼저 필요한 것은 상호작용 데이터다. 사용자가 어떤 상품을 조회했는지, 장바구니에 담았는지, 구매했는지를 모은다. 여기서 구매는 클릭보다 강한 신호로 볼 수 있다. 장바구니는 그 중간쯤일 수 있다. 모든 행동을 똑같이 취급하기보다, 행동의 의미에 따라 가중치를 다르게 줄 수 있다.

예를 들어 이렇게 점수를 줄 수 있다.

행동관심 점수 예시
상품 조회1점
찜하기2점
장바구니 담기3점
구매5점

이 점수는 절대적인 정답이 아니다. 서비스의 성격에 따라 달라질 수 있다. 뉴스 앱에서는 클릭보다 체류 시간이 중요할 수 있고, 음악 앱에서는 끝까지 들었는지와 반복 재생했는지가 중요할 수 있다. 온라인 강의 서비스에서는 수강 신청보다 실제 학습 완료율이 더 중요한 신호일 수도 있다.

다음으로 아이템끼리 함께 등장한 기록을 센다. 같은 사용자가 이어폰과 케이스를 함께 보거나 구매한 경우가 많다면 두 상품은 관련이 높다. 러닝화와 스포츠 양말이 자주 함께 장바구니에 담긴다면 두 상품도 연결할 수 있다.

그다음 현재 사용자가 보고 있는 상품과 비슷한 아이템을 후보로 뽑는다. 이미 구매한 상품이나 품절 상품은 제외한다. 너무 오래된 상품이나 평점이 낮은 상품도 제외할 수 있다. 마지막으로 후보를 점수순으로 정렬해 상위 몇 개를 보여 준다.

흐름을 간단히 쓰면 다음과 같다.

  1. 사용자-아이템 상호작용 기록을 모은다.

  2. 행동의 강도에 따라 점수를 부여한다.

  3. 함께 소비된 아이템 쌍을 찾는다.

  4. 현재 아이템과 비슷한 아이템을 후보로 만든다.

  5. 이미 본 상품, 구매한 상품, 추천하면 안 되는 상품을 제외한다.

  6. 점수가 높은 후보를 추천 영역에 보여 준다.

이 정도만으로도 꽤 쓸 만한 추천 시스템의 첫 버전을 만들 수 있다. 복잡한 딥러닝 모델이 없어도 된다. 추천 문제에서는 단순한 규칙과 기본 통계만으로도 사용자 경험을 크게 개선할 때가 많다.

머신러닝 프로젝트에서 중요한 것은 처음부터 거대한 모델을 만드는 것이 아니다. 작고 단단한 기준선을 만들고, 실제 사용자 반응을 보며 개선하는 것이다. 추천 시스템은 특히 그렇다. 모델이 아무리 멋져도 사용자가 클릭하지 않고, 구매하지 않고, 만족하지 않으면 좋은 추천이라고 말하기 어렵다.

추천을 평가하는 일은 생각보다 어렵다

집값 예측에서는 실제 가격과 예측 가격의 차이를 볼 수 있었다. 스팸 분류에서는 스팸을 스팸으로 맞혔는지 확인할 수 있었다. 추천도 평가할 수 있다. 과거 데이터를 일부 가려 두고, 모델이 사용자가 실제로 클릭하거나 구매한 아이템을 추천 목록에 올렸는지 볼 수 있다.

예를 들어 사용자의 마지막 구매 기록을 숨겨 두고, 그 직전까지의 행동만으로 추천을 만든다. 모델이 추천한 10개 상품 안에 실제 마지막 구매 상품이 들어 있다면 좋은 신호로 볼 수 있다. 이런 방식으로 추천의 정확도를 측정할 수 있다.

하지만 추천 평가는 단순한 정확도만으로 끝나지 않는다. 추천은 사람의 경험을 다루기 때문이다.

정확도만 높이려 하면 이미 인기 있는 아이템만 계속 추천하기 쉽다. 많은 사람이 산 상품은 앞으로도 클릭될 가능성이 높다. 그래서 정확도 지표는 좋아질 수 있다. 하지만 사용자는 "맨날 보던 것만 나오네"라고 느낄 수 있다.

반대로 너무 낯선 것만 추천하면 다양성은 높아질 수 있지만, 사용자가 관심을 갖지 않을 수 있다. 추천은 익숙함과 새로움 사이의 균형을 잡아야 한다. 내가 좋아할 만한 범위 안에 있으면서도, 스스로는 발견하지 못했을 무언가를 보여 줄 때 좋은 추천이 된다.

추천 시스템을 볼 때는 적어도 다음 관점을 함께 생각해야 한다.

  • 정확도: 사용자가 실제로 관심을 보일 만한 아이템을 추천했는가?

  • 다양성: 추천 목록이 너무 비슷한 아이템으로만 채워지지는 않았는가?

  • 신선도: 사용자가 이미 알고 있거나 너무 오래된 것만 보여 주지는 않는가?

  • 설명 가능성: 사용자가 왜 이 추천을 받았는지 이해할 수 있는가?

  • 공정성: 특정 아이템이나 판매자에게만 노출이 과도하게 쏠리지는 않는가?

설명 가능성은 추천에서 특히 중요하다. "추천합니다"라는 말보다 "최근에 러닝화를 보셔서 함께 많이 구매한 스포츠 양말을 추천합니다"가 더 설득력 있다. "이 영화를 좋아한 사람들이 많이 본 작품입니다"라는 설명도 사용자가 추천을 받아들이는 데 도움을 준다.

좋은 추천은 단지 맞히는 것이 아니라 납득시킨다. 사용자가 추천 이유를 이해하면, 추천 결과를 더 신뢰하게 된다. 물론 모든 추천이 긴 설명을 가져야 하는 것은 아니다. 하지만 추천이 사용자의 행동과 어떤 관련이 있는지 보여 주는 것은 경험을 훨씬 부드럽게 만든다.

추천 시스템의 함정: 많이 보여 주면 더 많이 선택된다

추천 시스템에는 조심해야 할 함정이 있다. 추천이 사용자의 행동을 관찰하는 동시에, 사용자의 행동을 바꾼다는 점이다.

어떤 상품이 추천 영역에 자주 노출되면 클릭될 기회가 많아진다. 클릭이 많아지면 모델은 그 상품이 인기가 높다고 판단한다. 그러면 다시 더 많이 추천한다. 이렇게 추천과 행동이 서로를 강화하는 순환이 생긴다.

이 현상은 서비스 성장에 도움이 될 수도 있지만, 추천의 다양성을 해칠 수도 있다. 이미 인기 있는 아이템은 더 인기 있어지고, 덜 알려진 아이템은 계속 묻힌다. 사용자는 점점 비슷한 것만 보게 되고, 새로운 취향을 발견할 기회를 잃을 수 있다.

또 다른 문제는 필터 버블이다. 사용자가 과거에 관심을 보인 것과 비슷한 것만 계속 추천하면, 사용자의 세계가 좁아질 수 있다. 음악 앱에서 늘 듣던 장르만 나오고, 뉴스 앱에서 늘 비슷한 관점의 기사만 보이고, 쇼핑몰에서 늘 같은 스타일만 보이는 식이다.

그래서 추천 시스템은 단순히 "클릭할 확률이 가장 높은 것"만 고르면 안 된다. 때로는 새로운 후보를 조금 섞어야 한다. 아직 데이터가 적은 아이템에도 작은 기회를 줘야 한다. 사용자가 원래 좋아하던 범위 근처에서 낯선 선택지를 조심스럽게 보여 줄 필요도 있다.

추천은 예측이면서 동시에 편집이다. 무엇을 앞에 보여 줄지, 무엇을 뒤로 보낼지, 무엇을 아예 보여 주지 않을지 결정한다. 그러므로 추천 시스템을 만들 때는 성능뿐 아니라 사용자의 경험과 선택의 폭도 함께 생각해야 한다.

추천 시스템은 여러 모델의 작은 오케스트라다

실제 서비스의 추천 시스템은 하나의 모델만으로 움직이지 않는 경우가 많다. 보통은 여러 단계를 거친다.

먼저 후보 생성 단계가 있다. 수많은 아이템 중에서 추천할 만한 후보 몇백 개나 몇천 개를 빠르게 뽑는다. 이때 협업 필터링, 인기 기반 추천, 최근 본 아이템과 비슷한 상품, 같은 카테고리의 인기 상품 등을 활용할 수 있다.

그다음 순위화 단계가 있다. 후보 중에서 어떤 것을 위에 놓을지 정한다. 이 단계에서는 사용자의 최근 행동, 아이템의 가격, 할인 여부, 평점, 재고, 클릭 가능성, 구매 가능성 같은 더 많은 특징을 고려할 수 있다. 여기에는 분류 모델이나 회귀 모델이 들어갈 수 있다. 예를 들어 "클릭할 확률"이나 "구매할 확률"을 예측해 점수로 사용할 수 있다.

마지막으로 재정렬 단계가 있을 수 있다. 점수만 보면 비슷한 상품 10개가 한 줄로 나올 수도 있다. 사용자는 그런 추천을 지루하게 느낄 수 있다. 그래서 최종 목록에서는 카테고리를 조금 섞고, 이미 본 상품을 제외하고, 너무 비슷한 아이템이 반복되지 않도록 조정한다.

이 흐름을 보면 추천 시스템은 머신러닝 모델 하나라기보다 여러 판단 장치가 합쳐진 작은 오케스트라에 가깝다. 어떤 악기는 빠르게 후보를 찾고, 어떤 악기는 정교하게 점수를 매기며, 어떤 악기는 전체 목록의 균형을 맞춘다. 모두가 함께 움직일 때 사용자는 자연스러운 추천 경험을 얻게 된다.

작은 실습 시나리오: 고객에게 다음 상품 추천하기

이 장의 내용을 바탕으로 간단한 추천 프로젝트를 설계해 보자. 데이터는 쇼핑몰의 구매 기록이라고 하자. 각 기록에는 사용자 ID, 상품 ID, 구매 시간이 들어 있다. 목표는 각 사용자에게 아직 구매하지 않은 상품 중 관심 있을 만한 상품 5개를 추천하는 것이다.

첫 번째 버전은 인기 기반 추천으로 만든다. 전체 구매 횟수가 많은 상품을 순서대로 정렬하고, 사용자가 이미 구매한 상품은 제외한 뒤 상위 5개를 추천한다. 이 모델은 단순하지만 기준선으로 훌륭하다.

두 번째 버전은 아이템 기반 협업 필터링으로 만든다. 상품마다 "함께 구매된 상품"을 찾는다. 사용자가 최근 구매한 상품과 자주 함께 구매된 다른 상품을 후보로 모은다. 여러 후보가 나오면 함께 구매된 횟수나 최근성에 따라 점수를 매긴다.

세 번째 버전에서는 개인화 요소를 조금 더 넣는다. 사용자가 자주 구매한 카테고리의 상품에 가산점을 주고, 너무 오래된 상품은 점수를 낮춘다. 최근에 본 상품과 관련된 아이템도 후보에 추가할 수 있다.

이 세 버전을 비교할 때는 단순히 "어느 것이 더 복잡한가"가 아니라 "어느 것이 실제 사용자 행동을 더 잘 예측하는가"를 봐야 한다. 과거 데이터를 시간 순서로 나누어, 과거 행동으로 미래 구매를 얼마나 잘 맞히는지 평가한다. 여기서도 데이터 누수를 조심해야 한다. 미래 구매 정보를 사용해 과거 시점의 추천을 만들면 안 된다.

추천 프로젝트의 핵심은 멋진 알고리즘 이름을 외우는 것이 아니다. 사용자와 아이템의 관계를 데이터로 만들고, 그 관계에서 다음 연결을 예측하는 것이다.

추천은 개인화된 예측이다

이제 추천 시스템을 한 문장으로 정리해 보자.

추천 시스템은 사용자와 아이템 사이의 과거 상호작용을 바탕으로, 앞으로 관심을 가질 만한 아이템을 고르는 개인화 예측 시스템이다.

이 문장 안에는 우리가 이 책에서 배운 거의 모든 요소가 들어 있다. 데이터가 필요하다. 특징이 필요하다. 모델이 예측한다. 실제 반응과 비교한다. 더 좋은 추천을 위해 모델과 규칙을 조정한다. 그리고 새로운 사용자 행동이 들어오면 추천도 계속 바뀐다.

추천 시스템이 특별한 이유는 결과가 매우 눈에 잘 보인다는 점이다. 집값 예측 모델은 숫자를 출력하고, 스팸 분류기는 메일을 걸러 낸다. 추천 시스템은 사용자의 화면을 바꾼다. 어떤 상품이 첫 줄에 놓일지, 어떤 영상이 자동 재생 후보가 될지, 어떤 글이 눈앞에 나타날지를 결정한다. 그래서 추천은 기술이면서 동시에 경험 설계다.

좋은 추천은 사용자를 대신해 선택하지 않는다. 사용자가 선택할 만한 좋은 후보를 앞에 놓아 준다. 너무 뻔하지도 않고, 너무 엉뚱하지도 않으며, 사용자가 "어, 이건 좀 궁금한데?"라고 느끼게 만든다.

이제 우리는 집값을 예측하고, 스팸을 분류하고, 고객 이탈을 예측하고, 사용자를 군집으로 나누고, 추천 시스템의 기본 원리까지 살펴보았다. 전통적인 머신러닝이 얼마나 많은 문제를 해결할 수 있는지 충분히 맛보았다.

그렇다면 다음 질문이 자연스럽게 떠오른다.

만약 데이터가 더 복잡해진다면 어떨까? 이미지, 음성, 긴 문장, 대화처럼 사람이 직접 특징을 만들기 어려운 데이터에서는 어떻게 해야 할까? 전통적인 머신러닝은 어디까지 잘할 수 있고, 어디에서 한계를 드러낼까?

다음 장부터는 이 질문을 따라 딥러닝으로 넘어가는 길목에 들어선다.

책 목록

처음 만나는 머신러닝: 데이터가 스스로 규칙을 배우는 법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기