協調フィルタリング

協調フィルタリング(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

この記事が気に入ったらサポートをしてみませんか?