協調フィルタリング
協調フィルタリング(collaborative filtering)とは,推奨システム(recommender system)の一種で,ユーザーとアイテムの両方の潜在因子を考慮して,レーティングを決める手法だ.
推奨システムでよく見かけるのは,「この商品を買った人はこの商品も買っています」とか「最も良く売れているのはこの商品です」などの猿でもできるタイプのものだ.このような単純なものではなく,あなたに似た潜在因子をもつ人が,高いレーティングをつけている(もしくは良く購入する)商品に近い潜在因子をもった商品を紹介するのが,協調フィルタリングである.
機械学習の中で(Andrew Ngが実務家から聞いた話だが)実務で最も役に立つ,もしくは期待されているのがこれだ.
Pythonで書かれた良いモジュールはあまりないので,自分で書かないといけないと思っていたら,fast.ai (1.x) にはPyTorchベースのものがついていたようだ.
まずは,モジュール collab をインポートしておく.
from fastai.collab import *
有名な例題(映画の評価値を当てる)であるMovieLensのデータを読み込む.
path = untar_data(URLs.ML_SAMPLE)
ratings = pd.read_csv(path/'ratings.csv')
ratings.head()
データはこんな形式になっており,timestampがついているが,とりあえずこれは無視してレーティング(rating)を予測してみる.
userId movieId rating timestamp
0 73 1097 4.0 1255504951
1 561 924 3.5 1172695223
2 157 260 3.5 1291598691
3 358 1210 5.0 957481884
4 130 316 2.0 1138999234
CollabDataBunchクラスのfrom_dfメソッドにデータフレームを入れるとデータオブジェクトを作成してくれる.
data = CollabDataBunch.from_df(ratings)
中身はこんな感じで,引数はデータフレーム(ratings),検証データの比率(pct_val),ユーザー,アイテム,レーティングを表す列名だ.
from_df(ratings:DataFrame, pct_val:float=0.2,
user_name:Optional[str]=None, item_name:Optional[str]=None,
rating_name:Optional[str]=None, test:DataFrame=None, seed=None, kwargs)
作成したデータオブジェクトをcollab_learner関数に入れると学習器(誤差を最小にする潜在因子行列の重みの最適化が目的)を作ってくれる.予測したいレーティングは,星5つまでなので,y_rangeで指定する.
learn = collab_learner(data, n_factors=50, y_range=(0.,5.))
上では,データオブジェクト(data),潜在因子の数(n_factors)を指定しているが,他にもmetricsは評価尺度,wdはweight decayで正規化のためのパラメータの減衰値などを指定できる.
def collab_learner(data, n_factors:int=None, use_nn:bool=False, metrics=None,
emb_szs:Dict[str,int]=None, wd:float=0.01, **kwargs)->Learner:
最適化は fit_one_cycleメソッドでできる.
learn.fit_one_cycle(5, 5e-3, wd=0.1)
Total time: 00:09
epoch train_loss valid_loss
1 2.427430 1.999472
2 1.116335 0.663345
3 0.736155 0.636640
4 0.612827 0.626773
5 0.565003 0.626336
この記事が気に入ったらサポートをしてみませんか?