A A
[ML] Recommender System (μΆ”μ²œμ‹œμŠ€ν…œ)
μ΄λ²ˆμ—λŠ” Recommend System (μΆ”μ²œμ‹œμŠ€ν…œ)에 λ°ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μΆ”μ²œ μ‹œμŠ€ν…œμ€ μ‚¬μš©μžμ™€ μ•„μ΄ν…œ κ°„μ˜ 관계λ₯Ό λΆ„μ„ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ μ ν•©ν•œ μ•„μ΄ν…œμ„ μΆ”μ²œν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ‹œμŠ€ν…œμ€ λ‹€μ–‘ν•œ 데이터λ₯Ό ν™œμš©ν•΄ μ‚¬μš©μžμ—κ²Œ λ§žμΆ€ν˜• μΆ”μ²œμ„ μ œκ³΅ν•˜λ©°, λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ 널리 μ‚¬μš©λ©λ‹ˆλ‹€.

μΆ”μ²œ μ‹œμŠ€ν…œμ˜ λͺ©μ 

https://www.nvidia.com/en-us/glossary/recommendation-system/

 

  • μ‚¬μš©μž λ§Œμ‘±λ„ ν–₯상: μ‚¬μš©μžκ°€ μ„ ν˜Έν•  λ§Œν•œ μ•„μ΄ν…œμ„ μΆ”μ²œν•˜μ—¬ λ§Œμ‘±λ„λ₯Ό 높이고 μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•©λ‹ˆλ‹€.
  • 판맀 μ¦λŒ€: μ μ ˆν•œ μ œν’ˆ μΆ”μ²œμ„ 톡해 ꡬ맀λ₯Ό μ΄‰μ§„ν•˜κ³ , λ§€μΆœμ„ μ¦λŒ€μ‹œν‚΅λ‹ˆλ‹€.
  • μ‚¬μš©μž μ°Έμ—¬ μ¦λŒ€: λ§žμΆ€ν˜• μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜μ—¬ μ‚¬μš©μžκ°€ 더 자주, 더 였래 μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ„λ‘ μœ λ„ν•©λ‹ˆλ‹€.

μΆ”μ²œ μ‹œμŠ€ν…œμ˜ μ’…λ₯˜

μΆ”μ²œ μ‹œμŠ€ν…œμ˜ μ’…λ₯˜λŠ” μ–΄λ– ν•œ μ’…λ₯˜λ“€μ΄ μžˆμ„κΉŒμš”? ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 3가지 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. μžμ„Ένžˆ ν•œλ²ˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

  • ν˜‘μ—… 필터링 (Collaborative Filtering)
  • μ½˜ν…μΈ  기반 필터링 (Content-Based Filtering)
  • ν•˜μ΄λΈŒλ¦¬λ“œ 방법 (Hybrid Methods)

ν˜‘μ—… 필터링 (Collaborative Filtering)

ν˜‘μ—… 필터링은 μ‚¬μš©μž κ°„μ˜ μœ μ‚¬μ„± λ˜λŠ” μ•„μ΄ν…œ κ°„μ˜ μœ μ‚¬μ„±μ„ μ΄μš©ν•˜μ—¬ μΆ”μ²œμ„ μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

ν˜‘μ—… 필터링은 크게 μ‚¬μš©μž 기반 ν˜‘μ—… 필터링과 μ•„μ΄ν…œ 기반 ν˜‘μ—… ν•„ν„°λ§μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

https://medium.com/@ashmi_banerjee/understanding-collaborative-filtering-f1f496c673fd

ν˜‘μ—… ν•„ν„°λ§μ˜ 원리

  1. μ‚¬μš©μž 기반 ν˜‘μ—… 필터링 (User-Based Collaborative Filtering)
    • λΉ„μŠ·ν•œ μ·¨ν–₯을 가진 μ‚¬μš©μžλ“€μ΄ μ„ ν˜Έν•˜λŠ” μ•„μ΄ν…œμ„ μΆ”μ²œν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, A와 Bκ°€ λΉ„μŠ·ν•œ μ˜ν™”λ₯Ό μ’‹μ•„ν•œλ‹€λ©΄, Aκ°€ μ’‹μ•„ν•˜λŠ” μ˜ν™”λ₯Ό Bμ—κ²Œ μΆ”μ²œν•©λ‹ˆλ‹€.
  2. μ•„μ΄ν…œ 기반 ν˜‘μ—… 필터링 (Item-Based Collaborative Filtering)
    • μœ μ‚¬ν•œ μ•„μ΄ν…œμ„ μ„ ν˜Έν•˜λŠ” μ‚¬μš©μžλ“€μ—κ²Œ κ·Έ μ•„μ΄ν…œμ„ μΆ”μ²œν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Aκ°€ μ’‹μ•„ν•˜λŠ” μ˜ν™”μ™€ λΉ„μŠ·ν•œ μ˜ν™”λ₯Ό Aμ—κ²Œ μΆ”μ²œν•©λ‹ˆλ‹€.

ν˜‘μ—… ν•„ν„°λ§μ˜ μž₯점

  • κ°œμΈν™”λœ μΆ”μ²œ: μ‚¬μš©μžμ˜ κ³Όκ±° 행동을 기반으둜 μΆ”μ²œν•˜μ—¬ κ°œμΈν™”λœ κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 데이터 ν™œμš©: λŒ€κ·œλͺ¨ μ‚¬μš©μž 데이터λ₯Ό ν™œμš©ν•˜μ—¬ μΆ”μ²œ 정확도λ₯Ό ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜‘μ—… ν•„ν„°λ§μ˜ 단점

  • μ½œλ“œ μŠ€νƒ€νŠΈ 문제: μ‹ κ·œ μ‚¬μš©μžλ‚˜ μ‹ κ·œ μ•„μ΄ν…œμ— λŒ€ν•œ 정보가 λΆ€μ‘±ν•  λ•Œ μΆ”μ²œμ΄ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
  • 데이터 ν¬μ†Œμ„± 문제: μ‚¬μš©μž-μ•„μ΄ν…œ λ§€νŠΈλ¦­μŠ€κ°€ ν¬μ†Œν•  λ•Œ μΆ”μ²œμ˜ 정확도가 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½˜ν…μΈ  기반 필터링 (Content-Based Filtering)

μ½˜ν…μΈ  기반 필터링은 μ•„μ΄ν…œμ˜ νŠΉμ§•μ„ λΆ„μ„ν•˜μ—¬ μ‚¬μš©μžκ°€ μ„ ν˜Έν•  λ§Œν•œ μœ μ‚¬ν•œ μ•„μ΄ν…œμ„ μΆ”μ²œν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

https://www.stratascratch.com/blog/step-by-step-guide-to-building-content-based-filtering/

μ½˜ν…μΈ  기반 ν•„ν„°λ§μ˜ 원리

  1. μ•„μ΄ν…œ νŠΉμ§• μΆ”μΆœ
    • 각 μ•„μ΄ν…œμ˜ νŠΉμ§•(예: μ˜ν™”μ˜ μž₯λ₯΄, μΆœμ—° 배우, 감독 λ“±)을 μΆ”μΆœν•©λ‹ˆλ‹€.
  2. μ‚¬μš©μž ν”„λ‘œν•„ 생성
    • μ‚¬μš©μžκ°€ μ„ ν˜Έν•˜λŠ” μ•„μ΄ν…œμ˜ νŠΉμ§•μ„ 기반으둜 μ‚¬μš©μž ν”„λ‘œν•„μ„ μƒμ„±ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ μ’‹μ•„ν•˜λŠ” μ˜ν™”μ˜ μž₯λ₯΄μ™€ μΆœμ—° 배우λ₯Ό λΆ„μ„ν•˜μ—¬ μ‚¬μš©μž ν”„λ‘œν•„μ„ λ§Œλ“­λ‹ˆλ‹€.
  3. μœ μ‚¬ν•œ μ•„μ΄ν…œ μΆ”μ²œ
    • μ‚¬μš©μž ν”„λ‘œν•„κ³Ό μœ μ‚¬ν•œ νŠΉμ§•μ„ 가진 μ•„μ΄ν…œμ„ μΆ”μ²œν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ μ’‹μ•„ν•˜λŠ” μž₯λ₯΄μ˜ μ˜ν™”λ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€.

μ½˜ν…μΈ  기반 ν•„ν„°λ§μ˜ μž₯점

  • μ½œλ“œ μŠ€νƒ€νŠΈ 문제 ν•΄κ²°: μ‚¬μš©μž λ˜λŠ” μ•„μ΄ν…œμ˜ νŠΉμ§•λ§ŒμœΌλ‘œ μΆ”μ²œμ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 투λͺ…μ„±: μ™œ νŠΉμ • μ•„μ΄ν…œμ΄ μΆ”μ²œλ˜μ—ˆλŠ”μ§€ μ„€λͺ…ν•˜κΈ° μš©μ΄ν•©λ‹ˆλ‹€.

μ½˜ν…μΈ  기반 ν•„ν„°λ§μ˜ 단점

  • νŠΉμ§• μ„ νƒμ˜ 어렀움: μ μ ˆν•œ νŠΉμ§•μ„ μ„ νƒν•˜λŠ” 것이 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μ–‘μ„± λΆ€μ‘±: μ‚¬μš©μžκ°€ 이미 μ•Œκ³  μžˆλŠ” μœ μ‚¬ν•œ μ•„μ΄ν…œλ§Œ μΆ”μ²œν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ΄λΈŒλ¦¬λ“œ 방법 (Hybrid Methods)

ν•˜μ΄λΈŒλ¦¬λ“œ 방법은 ν˜‘μ—… 필터링과 μ½˜ν…μΈ  기반 필터링을 κ²°ν•©ν•˜μ—¬ μΆ”μ²œ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

https://www.analyticsvidhya.com/blog/2022/03/a-comprehensive-guide-on-recommendation-engines-and-implementation/

ν•˜μ΄λΈŒλ¦¬λ“œ λ°©λ²•μ˜ 원리

  1. κ²°ν•© 방법
    • ν˜‘μ—… 필터링과 μ½˜ν…μΈ  기반 ν•„ν„°λ§μ˜ κ²°κ³Όλ₯Ό κ²°ν•©ν•˜μ—¬ μ΅œμ’… μΆ”μ²œμ„ μƒμ„±ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 두 λ°©λ²•μ˜ μΆ”μ²œ κ²°κ³Όλ₯Ό 가쀑 ν‰κ· ν•˜μ—¬ κ²°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 단계적 방법
    • 첫 번째 λ‹¨κ³„μ—μ„œ ν˜‘μ—… 필터링을 μ‚¬μš©ν•˜κ³ , 두 번째 λ‹¨κ³„μ—μ„œ μ½˜ν…μΈ  기반 필터링을 μ‚¬μš©ν•˜μ—¬ μΆ”μ²œμ„ κ°œμ„ ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν˜‘μ—… ν•„ν„°λ§μœΌλ‘œ 초기 후보λ₯Ό μ„ μ •ν•œ ν›„, μ½˜ν…μΈ  기반 ν•„ν„°λ§μœΌλ‘œ μ΅œμ’… μΆ”μ²œμ„ ν•©λ‹ˆλ‹€.

ν•˜μ΄λΈŒλ¦¬λ“œ λ°©λ²•μ˜ μž₯점

  • μ„±λŠ₯ ν–₯상: 두 λ°©λ²•μ˜ μž₯점을 κ²°ν•©ν•˜μ—¬ μΆ”μ²œ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μœ μ—°μ„±: λ‹€μ–‘ν•œ 방법을 μ‘°ν•©ν•˜μ—¬ 졜적의 μΆ”μ²œ μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ΄λΈŒλ¦¬λ“œ λ°©λ²•μ˜ 단점

  • λ³΅μž‘μ„± 증가: μ—¬λŸ¬ 방법을 κ²°ν•©ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ λ³΅μž‘μ„±μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ΅¬ν˜„ 어렀움: λ‹€μ–‘ν•œ 방법을 효과적으둜 κ²°ν•©ν•˜κΈ° μœ„ν•œ κ΅¬ν˜„μ΄ μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”μ²œ μ‹œμŠ€ν…œμ˜ μ£Όμš” ꡬ성 μš”μ†Œ

  1. μ‚¬μš©μž-μ•„μ΄ν…œ 맀트릭슀
    • μ‚¬μš©μžμ™€ μ•„μ΄ν…œ κ°„μ˜ μƒν˜Έμž‘μš©(예: 평점, 클릭 λ“±)을 κΈ°λ‘ν•œ λ§€νŠΈλ¦­μŠ€μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ˜ν™” 평점 λ§€νŠΈλ¦­μŠ€κ°€ 이에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. νŠΉμ§• 벑터
    • μ‚¬μš©μžμ™€ μ•„μ΄ν…œμ˜ νŠΉμ§•μ„ λ‚˜νƒ€λ‚΄λŠ” λ²‘ν„°μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ˜ν™”μ˜ μž₯λ₯΄, 감독, μΆœμ—° 배우 등이 νŠΉμ§• λ²‘ν„°λ‘œ ν‘œν˜„λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. μœ μ‚¬λ„ 계산
    • μ‚¬μš©μž κ°„ λ˜λŠ” μ•„μ΄ν…œ κ°„μ˜ μœ μ‚¬λ„λ₯Ό κ³„μ‚°ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 코사인 μœ μ‚¬λ„(Cosine Similarity), ν”Όμ–΄μŠ¨ μƒκ΄€κ³„μˆ˜(Pearson Correlation) 등이 μ‚¬μš©λ©λ‹ˆλ‹€.
  4. λͺ¨λΈ ν•™μŠ΅ 및 평가
    • μΆ”μ²œ λͺ¨λΈμ„ ν•™μŠ΅μ‹œν‚€κ³  μ„±λŠ₯을 ν‰κ°€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. RMSE(Root Mean Squared Error), MAE(Mean Absolute Error), Precision, Recall λ“± λ‹€μ–‘ν•œ 평가 방법이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

μΆ”μ²œ μ‹œμŠ€ν…œμ˜ 평가 방법

https://towardsdatascience.com/recommendation-systems-models-and-evaluation-84944a84fb8e

  1. 정확도 (Accuracy)
    • μΆ”μ²œ μ‹œμŠ€ν…œμ΄ μ–Όλ§ˆλ‚˜ μ •ν™•ν•˜κ²Œ μ•„μ΄ν…œμ„ μΆ”μ²œν•˜λŠ”μ§€λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Precision, Recall, F1 Scoreκ°€ 이에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. λ‹€μ–‘μ„± (Diversity)
    • μΆ”μ²œλœ μ•„μ΄ν…œμ΄ μ–Όλ§ˆλ‚˜ λ‹€μ–‘ν•œμ§€λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ μƒˆλ‘œμš΄ μ•„μ΄ν…œμ„ μΆ”μ²œλ°›μ„ 수 μžˆλŠ” λŠ₯λ ₯이 이에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  3. μ‹ λ’°μ„± (Trustworthiness)
    • μΆ”μ²œλœ μ•„μ΄ν…œμ΄ μ‚¬μš©μžμ—κ²Œ μ–Όλ§ˆλ‚˜ 신뒰성을 κ°€μ§€λŠ”μ§€λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€. μΆ”μ²œλœ μ•„μ΄ν…œμ˜ μ„€λͺ… κ°€λŠ₯성이 이에 ν¬ν•¨λ©λ‹ˆλ‹€.
  4. μ‚¬μš©μž λ§Œμ‘±λ„ (User Satisfaction)
    • μΆ”μ²œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•œ ν›„ μ‚¬μš©μžμ˜ λ§Œμ‘±λ„λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€. μ‚¬μš©μž ν”Όλ“œλ°±μ΄λ‚˜ μ„€λ¬Έ 쑰사가 이에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

Recommender System Example Code (ν˜‘μ—… 필터링)

# ν•„μš”ν•œ 라이브러리 μž„ν¬νŠΈ
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
# 예제 μ‚¬μš©μž-μ•„μ΄ν…œ 맀트릭슀 생성
data = {
    'user_id': [1, 1, 1, 2, 2, 3, 3, 3, 4],
    'item_id': [1, 2, 3, 1, 3, 2, 3, 4, 4],
    'rating': [5, 4, 1, 4, 5, 2, 4, 5, 4]
}
df = pd.DataFrame(data)
# μ‚¬μš©μž-μ•„μ΄ν…œ 맀트릭슀 생성
user_item_matrix = df.pivot_table(index='user_id', columns='item_id', values='rating').fillna(0)

# 코사인 μœ μ‚¬λ„λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μœ μ‚¬λ„ 계산
user_similarity = cosine_similarity(user_item_matrix)
user_similarity_df = pd.DataFrame(user_similarity, index=user_item_matrix.index, columns=user_item_matrix.index)
# μœ μ‚¬λ„ 맀트릭슀 μ‹œκ°ν™”
plt.figure(figsize=(10, 7))
sns.heatmap(user_similarity_df, annot=True, cmap='coolwarm')
plt.title('User Similarity Matrix')
plt.show()
# μΆ”μ²œ ν•¨μˆ˜ μ •μ˜
def recommend(user_id, user_item_matrix, user_similarity, k=2):
    # μœ μ‚¬ν•œ μ‚¬μš©μž 선택
    similar_users = user_similarity[user_id - 1]
    similar_users_indices = similar_users.argsort()[-k-1:-1]

    # μœ μ‚¬ν•œ μ‚¬μš©μžλ“€μ˜ μ•„μ΄ν…œ 평균 평점 계산
    similar_users_ratings = user_item_matrix.iloc[similar_users_indices]
    recommendations = similar_users_ratings.mean(axis=0)

    # 이미 ν‰κ°€ν•œ μ•„μ΄ν…œ μ œμ™Έ
    user_rated_items = user_item_matrix.loc[user_id]
    recommendations = recommendations[user_rated_items == 0]

    return recommendations.sort_values(ascending=False)

# μ‚¬μš©μž 1μ—κ²Œ μ•„μ΄ν…œ μΆ”μ²œ
recommendations = recommend(1, user_item_matrix, user_similarity)
print("Recommendations for user 1:")
print(recommendations)

Recommendations for user 1:
item_id
4    2.5
dtype: float64