728x90
last.fm 데이터셋
● last.fm: 온라인 음악 Database, 추천 서비스
● HetRec 2011 에서 데이터셋 공개
○ 92,800 artists, 1892 users
○ https://grouplens.org/datasets/hetrec-2011/
!wget https://files.grouplens.org/datasets/hetrec2011/hetrec2011-lastfm-2k.zip
!unzip hetrec2011-lastfm-2k.zip
데이터 준비
● artists 정보 불러오기
artists = {}
with open('artists.dat', 'r') as f:
print(f.readline())
for line in f:
id, name, _, _ = line.split('\t')
artists[int(id)] = name
user가 몇번 artist를 weight 만큼 들은 것이다.
● user_artists.dat: 유저가 아티스트의 곡을 들은 횟수 정보
import numpy as np
users = []
items = []
counts = []
with open('user_artists.dat', 'r') as f:
print(f.readline())
for line in f:
uid, mid, count = line.split('\t')
users.append(int(uid))
items.append(int(mid))
counts.append(np.log(1+float(count)))
users = np.array(users, dtype=np.int32)
items = np.array(items, dtype=np.int32)
counts = np.array(counts)
참고: ElasticNet
● L1, L2 규제를 포함하는 선형회귀 모델
● SLIM 모델의 각 item representation 학습에 활용
● sklearn.linear_model에 구현되어 있음
from sklearn.linear_model import ElasticNet
SLIM using ElasticNet
from scipy.sparse import csc_matrix
from tqdm import tqdm
n_items = max(items) + 1
train = csc_matrix((counts, (users, items)))
model = ElasticNet(alpha=0.1, l1_ratio=0.5, positive=True, fit_intercept=False, copy_X=False, selection='random', tol=1e-6, max_iter=100)
rows, cols, data = [], [], []
for current_item in tqdm(range(n_items)):
y = train[:,current_item].toarray()
if all(y==0): continue
s = train.indptr[current_item]
e = train.indptr[current_item+1]
backup = train.data[s:e].copy()
train.data[s:e] = 0.0
model.fit(train, y)
rows.extend(model.sparse_coef_.indices)
cols.extend([current_item] * model.sparse_coef_.getnnz())
data.extend(model.sparse_coef_.data)
train.data[s:e] = backup
W = csc_matrix((data, (rows, cols)), shape=(n_items, n_items))
csc_matrix를 만들 때 sparse하니까 만약 운나쁘게 가장자리가 0으로 다 채워져 있으면 그만큼 크기가 작다고 판단 할 수 있기 때문에 명시적으로 shape를 n_items * n_items로 정해준다.
유사한 artist 찾기
#1918 동방신기
#2117 시크릿
#2094 BoA
#1904 SHINee
#227 The Beatles
q = 1918
s = W.indptr[q]
e = W.indptr[q+1]
scores = W.data[s:e]
ids = W.indices[s:e]
ids_sorted = ids[scores.argsort()[::-1]]
print(f"[{artists[q]}]와 유사한 artists:")
for id in ids_sorted:
print(f"- {artists[id]}")
728x90
'AI > 추천 시스템 설계' 카테고리의 다른 글
L04.1 Implicit Feedback Practice (0) | 2024.04.12 |
---|---|
L03.2 Rating Prediction Practice (0) | 2024.04.11 |
L03.1 Rating Prediction Practice (1) | 2024.04.10 |
L02.1 Finding Similar Items Practice (0) | 2024.04.10 |