본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 28. 13:28

핀테크에서의 실전 추천 시스템: 협업 필터링 (Collaborative Filtering)을 넘어

요약

핀테크 환경에서 기존 협업 필터링 방식이 직면하는 데이터 희소성 및 설명 가능성 문제를 분석합니다. 금융 서비스의 특수한 제약 사항을 극복하기 위한 하이브리드 아키텍처 설계 방안을 제시합니다.

핵심 포인트

  • 핀테크 데이터의 극심한 희소성 문제 해결 필요
  • 금융 규제 준수를 위한 모델의 설명 가능성 확보
  • 신규 상품 출시 시 발생하는 콜드 스타트 문제 대응
  • 금융 도메인 특화 하이브리드 추천 아키텍처 제안


표준 머신러닝 (ML) 플레이북이 금융 서비스에서 실패하는 이유 — 그리고 실제 운영 환경에서 살아남는 추천 엔진을 위한 실질적인 아키텍처.

이전에 추천 시스템을 구축해 본 적이 있다면, 아마 협업 필터링 (Collaborative Filtering)으로 시작했을 것입니다. MovieLens 데이터셋에서는 아주 훌륭하게 작동했을 것입니다. Precision@K 수치도 멋졌을 것이고, 행렬 분해 (Matrix Factorization)도 깔끔하게 수렴했을 것입니다. 당신은 문제를 완전히 이해했다고 느꼈을 것입니다.

하지만 동일한 사고방식을 핀테크 제품에 적용하려 했을 때 — 시스템이 조용히 무너지는 것을 목격하게 됩니다.

상호작용 행렬 (Interaction Matrix)은 99.7%가 비어 있었습니다. 사용자 중 절반은 3년 동안 정확히 하나의 상품만 이용했습니다. 스프린트 중간에 새로운 저축 계좌가 출시되었지만, 모델은 이를 어떻게 처리해야 할지 전혀 알지 못했습니다. 그 후 컴플라이언스 (Compliance) 부서에서 찾아와, 왜 당신의 시스템이 은퇴자에게 고위험 투자 상품을 추천했는지 쉬운 언어로 설명하라고 요구했습니다. "유사한 임베딩 벡터 (Embedding Vectors)를 가진 사용자들도 해당 상품에 참여했기 때문입니다"라는 답변은 전혀 통하지 않았습니다.

대출, 뱅킹, 투자 플랫폼을 아우르는 금융 서비스 고객들을 위해 이러한 시스템을 구축하고 출시하며 우리가 배운 점은 다음과 같습니다. 실패 모드 (Failure Modes)는 항상 동일했으며, 이는 우연이 아닌 구조적인 문제였습니다. 풍부한 상호작용 데이터, 안정적인 아이템 카탈로그, 그리고 설명 의무가 없다는 협업 필터링 (Collaborative Filtering)의 핵심 가정들은 이 도메인에서는 전혀 성립하지 않습니다.

이 포스트에서는 세 가지 사항을 구체화합니다. 첫째, 표준적인 접근 방식이 왜 핀테크에서 실패하는지, 그리고 실제 데이터는 어떤 모습인지에 대해 다룹니다. 둘째, 스트리밍이나 이커머스에서 빌려온 것이 아니라 핀테크의 실제 제약 사항을 중심으로 설계된 하이브리드 아키텍처 (Hybrid Architecture)를 소개합니다. 셋째, 처음부터 다시 시작할 필요 없이 운영 시스템에 바로 적용할 수 있는 코드와 함께 실질적인 청사진을 제공합니다.

왜 금융 서비스에서 협업 필터링 (Collaborative Filtering)이 실패하는가

협업 필터링 (Collaborative filtering)은 단순하면서도 강력한 아이디어에 기반합니다. 즉, 과거에 유사한 행동을 보였던 사람들은 미래에도 유사한 행동을 할 것이라는 점입니다. 충분한 상호작용 데이터 (interaction data)가 주어진다면, 이 가정은 놀라울 정도로 잘 들어맞습니다. 핀테크 (fintech)에서의 문제는 "충분한 상호작용 데이터"를 위한 전제 조건이 거의 충족되지 않는다는 것입니다.

데이터 희소성 문제 (The Data Sparsity Problem)

전형적인 Netflix 사용자는 일 년에 수백 개의 타이틀을 시청합니다. Spotify 리스너는 수천 개의 트랙을 스트리밍합니다. 그렇다면 핀테크 사용자는 어떨까요? 이들은 저축 계좌를 개설하고, 2년 후에 신용카드를 신청하며, 주택 담보 대출 계산기를 한 번 훑어볼 수도 있습니다. 상호작용 행렬 (interaction matrix)은 거의 비어 있는 상태입니다.

도메인 (Domain)사용자당 연평균 상호작용 수전형적인 행렬 밀도 (matrix density)
스트리밍 (예: Netflix)300–5001–5%
...

밀도가 0.1% 미만인 경우, "당신과 유사한 사용자"의 이웃 (neighbourhood)은 비어 있거나 오해를 불러일으킬 정도로 노이즈가 심합니다.

별점 평점 없음 - 오직 암묵적 신호 (Implicit Signals)만 존재

금융 상품에는 별점 평점이 매겨지지 않습니다. 페이지 조회, 계산기 상호작용, 신청 시작, 완료 등을 통해 선호도를 추론하며, 결정적으로 고객 지원 전화와 해지(cancellation)를 부정적 신호로 활용합니다. 위험한 점은 이 모든 것을 동일한 긍정적 피드백으로 취급하는 것입니다. 만약 사용자가 상품 페이지를 조회한 다음 날 계좌를 해지했다면, 그것은 약한 긍정 신호가 아닙니다. 그것은 위험 신호 (red flag)입니다. 모든 상호작용을 이진 형태의 "참여함 / 참여하지 않음" 행렬로 평탄화하는 표준 협업 필터링 (CF) 파이프라인은 고객 이탈 (churn)을 유도하는 상품을 자신 있게 추천하도록 학습될 것입니다.

핀테크 규모에서의 콜드 스타트 문제 (The Cold-Start Problem)

기록이 전혀 없는 신규 사용자가 끊임없이 유입됩니다. 수정된 저축 금리, 계절별 대출 상품, 업데이트된 보험 등급과 같은 신규 상품도 빈번하게 출시됩니다. 표준 협업 필터링 (CF)에는 이들을 추천 인터페이스에 부트스트랩 (bootstrap) 할 수 있는 메커니즘이 없습니다.

설명 가능성 (Explainability)은 선택 사항이 아니다

규제 대상인 금융 시장에서 "당신과 유사한 사용자들이 이 상품을 구매했습니다"라는 설명은 수용 가능한 제품 추천 근거가 아닙니다. MiFID II, 적합성 요건 (suitability requirements) 및 유사한 프레임워크 하에서, 금융 상품을 추천하는 것은 해당 고객에게 적절하다는 것을 입증해야 할 의무를 수반합니다. 순수한 협업 필터링 (CF) 모델은 그러한 귀속성 (attribution)을 생성할 수 없습니다.

아이템 이질성 (Item Heterogeneity)

다큐멘터리와 공포 영화가 모두 "영화"인 것처럼, 저축 계좌와 주택 담보 대출은 모두 "금융 상품"입니다. 유사성 공간 (similarity space)은 동일한 직관적인 방식으로 연속적이지 않습니다. 아이템 이질성을 사소한 전처리 문제로 취급하는 것은, 이제 막 첫 기본 당좌 예금 계좌 (checking account)를 개설한 사람에게 고수익 투자 계좌를 추천하게 되는 결과를 초래합니다.

무언가를 구축하기 전에 상호작용 행렬 (interaction matrix)이 얼마나 심각하게 작동하지 않고 있는지 정확히 측정할 수 있습니다:

import numpy as np
from scipy.sparse import csr_matrix

...

만약 밀도 (density)가 0.5% 미만이라면, 협업 필터링 (collaborative filtering)만으로는 해결책이 될 수 없습니다.

문제의 재정의 - 핀테크 추천 시스템을 위한 프레임워크

협업 필터링 (collaborative filtering)은 "당신과 유사한 사용자들이 무엇에 참여하는가?"라고 묻습니다. 올바른 핀테크 질문은 다음과 같습니다: "이 사용자에게, 이 생애 주기에서, 이 위험 프로필 (risk profile)을 가진 상태로, 지금 당장 적합한 제품은 무엇인가?"

이러한 재정의는 아키텍처를 완전히 변화시킵니다. 당신은 서로가 제공할 수 없는 신호 유형을 각각 담당하는 세 가지 별도의 계층 (layer)이 필요합니다.

계층 1 - 콘텐츠 기반 필터링 (Content-Based Filtering). 모든 금융 상품을 구조화된 메타데이터(metadata)를 사용하여 인코딩합니다: 상품 유형, 위험 등급, 수수료 구조, 유동성 창 (liquidity window), 최소 잔액, 규제 분류. 이러한 특징 (features)들로부터 조밀한 제품 임베딩 (product embeddings)을 구축합니다. 오늘 출시된 새로운 고정 금리 저축 계좌는 상호작용 이력이 전혀 없지만, 완전한 특징 벡터 (feature vector)를 가지고 있으므로 모델은 출시 첫날부터 제품 공간 내에서 의미 있게 배치할 수 있습니다. 이 계층은 신규 제품을 위한 콜드 스타트 (cold-start) 안전망 역할을 합니다.

계층 2 - 협업 신호 (Collaborative Signal). 행동 데이터가 충분히 풍부한 경우(높은 빈도의 앱 참여, 거래 패턴, 다중 제품 사용 이력 등)에는 대규모 확장을 위한 속도를 위해 ALS를 사용한 행렬 분해 (Matrix Factorization)를 적용하거나, 암묵적 피드백 (Implicit Feedback)을 더 정직하게 처리하기 위해 BPR을 적용합니다. 이 계층은 콘텐츠 특징 (Content Features)이 포착할 수 없는 패턴을 잡아냅니다. 예를 들어, 저축 계좌와 거래 계좌를 모두 보유한 사용자는 예측 가능한 보유 기간 임계값에서 연금 상품에 참여하는 경향이 있다는 점 등을 파악합니다. 이 계층은 잘 구축된 제품을 사용하는 활성 사용자 (Warm Users)를 처리하며, 전체 시스템이 아닌 더 큰 앙상블 (Ensemble) 내의 하나의 목소리 역할을 합니다.

계층 3 - 맥락적 증강 (Contextual Augmentation). 처음 두 계층이 사용자의 이력을 설명한다면, 세 번째 계층은 사용자의 현재를 설명합니다. 이번 주에 발생한 거액의 예금은 가능한 인생의 전환점을 시사합니다. 첫 자녀 연계 저축 상품은 가족 형성을 나타냅니다. 제품 간의 공백(예: 저축은 있지만 투자 상품은 없는 경우, 당좌 계좌는 있지만 보장성 보험은 없는 경우)은 과거 패턴만으로는 절대 드러나지 않을 명시적인 추천 기회를 생성합니다.

이 세 계층은 후보군에 점수를 매기고 추천이 제공되기 전에 충돌을 해결하는 통합 랭킹 모델 (Unified Ranking Model)로 전달됩니다. 동반 시각 자료의 아키텍처 다이어그램에 전체 흐름이 표시되어 있습니다.

핵심적인 설계 결정 사항은 다음과 같습니다: 랭킹 모델은 계층 간의 승자를 선택하는 것이 아니라, 각 계층을 특징 (Features)으로 취급합니다. 콘텐츠 유사도는 높지만 협업 신호는 낮은 제품은 세 계층 모두에서 중간 정도의 점수를 받은 제품과는 다르게 순위가 매겨져야 합니다. 각 계층이 명명된 해석 가능한 점수를 생성하기 때문에, 모든 추천은 사람이 읽을 수 있는 근거로 추적될 수 있으며, 이는 섹션 6에서 매우 중요하게 다뤄집니다.

탐색 전략 (Exploration Strategies)을 통한 콜드 스타트 (Cold-Start) 해결

콜드 스타트는 단일한 문제가 아닙니다. 이는 이름만 공유할 뿐 서로 다른 두 가지 실패 모드 (Failure Modes)입니다.

사용자 콜드 스타트 (User Cold-Start): 이력이 없는 신규 고객

사용자가 가입할 때, 협업 계층 (Collaborative Layer)은 활용할 수 있는 데이터가 아무것도 없습니다. 온보딩 (Onboarding) 과정에서 공유된 정보—연령대, 소득 범위, 명시된 저축 목표 등—가 전부입니다. 이때 적절한 프레임워크는 **탐색 (Exploration)**입니다. 즉, 단순히 지금 당장 사용자에게 최적의 상품을 보여주는 것이 아니라, 나중에 좋은 추천을 할 수 있도록 충분한 상호작용 이력 (Interaction History)을 쌓아가는 과정입니다. 이러한 목표들은 본질적으로 서로 충돌합니다.

**컨텍스트 밴딧 (Contextual Bandit)**은 각 추천 슬롯을 멀티 암드 밴딧 (Multi-armed Bandit) 문제의 하나의 팔 (Arm)로 취급합니다. UCB (Upper Confidence Bound, 상한 신뢰 구간)는 자주 노출되지 않은 상품에 점수 보너스를 부여함으로써 이를 처리합니다. 특정 사용자에 대해 특정 상품에 대한 데이터가 적을수록 신뢰 구간 (Confidence Interval)은 넓어지며, 밴딧은 해당 상품을 시도하려는 경향이 강해집니다. 충분한 상호작용이 축적되면 신뢰 보너스는 줄어들고 활용 (Exploitation) 단계로 넘어갑니다.

import numpy as np

def ucb_score(n_total, n_item, reward_sum, c=1.0):
...

탐색 상수 $c$는 조절 가능합니다. 값이 높을수록 탐색을 더 강하게 유도하며, 이는 신제품 출시 시기나 새로운 인구 통계 집단의 사용자를 온보딩할 때 유용합니다. 밴딧이 본격적으로 작동하기 전에, 신규 사용자를 기존 사용자 기반에서 도출된 **행동 아키타입 (Behavioral Archetypes)**으로 클러스터링 (Clustering)하십시오. 예를 들어, 목표가 "첫 내 집 마련"이라고 명시한 28세 사용자는 이미 알려진 아키타입에 매핑될 수 있으며, 이 아키타입의 보상 패턴은 첫 번째 상호작용부터 밴딧의 사전 확률 (Priors)을 형성하는 씨앗이 됩니다.

아이템 콜드 스타트 (Item Cold-Start): 상호작용이 없는 신규 상품

신규 상품을 특징 벡터 (Feature Vector)를 사용하여 인코딩하고, 기존 상품들과의 코사인 유사도 (Cosine Similarity)를 계산합니다. 해당 상품을 내부적으로 scoring_mode = "content_only"로 표시하여 콘텐츠 기반 점수 (Content-based Score)만으로 카탈로그에 부트스트랩 (Bootstrap) 합니다. 이후 졸업 임계값 (Graduation Threshold)을 설정하십시오. 상품이 통계적으로 유의미한 수의 상호작용을 수집하면—50~100회 정도가 적절한 시작점입니다—자동으로 협업 점수 (Collaborative Scoring) 방식으로 승격시킵니다. 이때 임계값은 단순히 양적인 수치가 아니라 통계적 신뢰도 (Statistical Confidence)와 연계되어야 합니다. 전환율이 40%인 50회의 상호작용을 가진 상품은 전환율이 2%인 상품보다 더 빠르게 협업 점수 방식으로 전환될 자격을 얻습니다.

암묵적 피드백 모델링 (Implicit Feedback Modelling)을 통한 희소성 (Sparsity) 해결

핀테크 상호작용 행렬 (interaction matrix)을 표준 행렬 분해 (matrix factorization) 방식에 입력할 때, 여러분은 데이터가 뒷받침하지 않는 주장을 하게 됩니다. 바로 누락된 항목이 중립적인 평점을 의미한다는 주장입니다. 하지만 그렇지 않습니다. 누락된 항목은 사용자가 해당 상품을 본 적이 없거나, 보았지만 무시했거나, 혹은 아직 도달하지 않았음을 의미합니다. 근본적인 문제는 이것을 실제로는 랭킹 (ranking) 문제임에도 불구하고 포인트와이즈 예측 (pointwise prediction) 문제로 취급한다는 점입니다. 사용자가 연금 상품을 얼마나 좋아할지 알 필요는 없습니다. 지금 당장 사용자가 여행 보험 부가 서비스보다 연금 상품에 참여할 가능성이 더 높은지 여부를 아는 것이 중요합니다.

BPR: 암묵적 신호를 위한 페어와이즈 랭킹 (Pairwise Ranking)

베이지안 개인화 랭킹 (Bayesian Personalised Ranking, BPR)은 이러한 프레임워크를 중심으로 구축되었습니다. 개별 점수에 대한 예측 오차를 최소화하는 대신, 페어와이즈 목적 함수 (pairwise objective)를 최적화합니다. 즉, 특정 사용자에 대해 상호작용한 아이템이 상호작용하지 않은 아이템보다 일관되게 높은 순위를 차지하도록 합니다. 학습 신호는 점수가 아니라 '이 상품이 저 상품보다 낫다'는 비교 방식입니다. 별점 평점이 필요하지 않습니다.

암묵적 신호의 가중치 부여 (Weighting Implicit Signals)

모든 상호작용이 동일한 정보를 담고 있는 것은 아닙니다. 페이지 조회와 신청 완료는 기술적으로 모두 "상호작용"이지만, 이를 동일한 이진 신호 (binary signal)로 통합하는 것은 가장 유용한 데이터를 버리는 행위입니다.

상호작용 유형권장 가중치
상품 페이지 조회1.0
...

네거티브 샘플링 전략 (Negative Sampling Strategy)

BPR은 페어와이즈 비교를 형성하기 위해 사용자가 상호작용하지 않은 아이템인 네거티브 샘플 (negative samples)을 필요로 합니다. 기본값인 무작위 샘플링 (random sampling)은 가장 정보 가치가 높은 신호를 낭비합니다. 가장 유용한 네거티브 샘플은 사용자가 능동적으로 선택하지 않은 인기 상품입니다. 사용자가 노출조차 되지 않았던 아이템은 제외하는 인기 가중치 네거티브 샘플러 (popularity-weighted negative sampler)를 구현하십시오. 이를 통해 학습을 카탈로그의 공백이 아닌 실제 선택에 집중시킬 수 있습니다.

import numpy as np
from lightfm import LightFM
from scipy.sparse import coo_matrix
...

WARP는 프로덕션(Production)의 기본값이며, BPR은 개념적인 베이스라인(Baseline)으로 취급하십시오. 오프라인 지표(NDCG, MAP)와 비즈니스 지표(전환율(Conversion), 슬롯당 수익(Revenue per slot))를 모두 추적하십시오. 이 두 지표는 항상 일치하지는 않으며, 두 지표가 서로 다를 때는 후자(비즈니스 지표)를 신뢰하십시오.

배포 아키텍처 - 노트북에서 프로덕션까지

대부분의 추천 시스템 튜토리얼은 모델 학습 단계에서 끝납니다. 하지만 흥미로운 엔지니어링은 바로 그 지점부터 시작됩니다.

온라인 vs. 오프라인 스코어링 (Online vs. Offline Scoring)

모든 사용자에게 실시간 스코어링(Real-time scoring)이 필요한 것은 아닙니다. 실무적인 해답은 두 개의 병렬 경로를 운영하는 것입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0