交互最小二乗法
date: 2022-03-10 excerpt: 交互最小二乗法(Alternating Least Square)について
交互最小二乗法(Alternating Least Square)について
概要
- matrix factorizationの一つ
- ALSと省略される
- 便利なライブラリとして
implicit
がある - 確率的勾配法などではなく、user matrixとitem matrixを交互に計算することで高速に求めることを目的としている
ユーザーファクターまたはアイテムファクターのいずれかが固定されている場合、コスト関数が2次関数になるため、そのグローバル最小値を簡単に計算できることに注意してください。これにより、最小二乗法の交互最適化プロセスが実行されます。このプロセスでは、ユーザーファクターとアイテムファクターの再計算を交互に行い、各ステップでコスト関数の値を下げることが保証されます。
インストール
$ python3 -m pip install implicit
具体的な例
データのロード
%pip install implicit
import pandas as pd
import numpy as np
import scipy.sparse as sparse
import random
from datetime import datetime
import implicit
from google.colab import drive
drive.mount('/content/drive')
IDのカテゴリ化と番号をつける
def create_data(datapath,start_date,end_date):
df=pd.read_csv(datapath)
df=df.assign(date=pd.Series(datetime.fromtimestamp(a/1000).date() for a in df.timestamp))
df=df.sort_values(by='date').reset_index(drop=True) # for some reasons RetailRocket did NOT sort data by date
df=df[(df.date>=datetime.strptime(start_date,'%Y-%m-%d').date())&(df.date<=datetime.strptime(end_date,'%Y-%m-%d').date())]
df=df[['visitorid','itemid','event']]
return df
datapath= '/content/drive/MyDrive/kaggle/retailrocket-ecommerce-dataset/events.csv'
data=create_data(datapath,'2015-5-3','2015-5-18')
data['user'] = data['visitorid'].astype("category")
data['artist'] = data['itemid'].astype("category")
data['user_id'] = data['user'].cat.codes
data['artist_id'] = data['artist'].cat.codes
学習
sparse_item_user = sparse.csr_matrix(([1]*len(data), (data['artist_id'], data['user_id'])))
sparse_user_item = sparse.csr_matrix(([1]*len(data), (data['user_id'], data['artist_id'])))
model = implicit.als.AlternatingLeastSquares(factors=20, regularization=0.1, iterations=5)
model.fit(sparse_item_user)
推論
# レコメンド
user_id=1
recommended = model.recommend(userid=user_id, user_items=sparse_user_item[user_id])
print(recommended)
# 似ているユーザを抽出
model.similar_users(userid=0)