SVDによる行列分解
ユーザー・アイテム行列、SVD分解、潜在因子、Surpriseライブラリによる実装について学習します。
「SVDによる行列分解」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
行列分解を使う理由
ユーザー・アイテム行列は巨大で、その大部分が空欄です。行列分解は、この行列をユーザー用とアイテム用の潜在因子を持つ2つの小さな行列に圧縮します。2つの行列の積によって評価値を再構成し、空欄も補完できます。この方法は、近傍ユーザーを使う手法よりもスパース性にうまく対処できます。
潜在因子の直感的な理解
各ユーザーとアイテムは、隠れた特徴を表す短いベクトルで表現されます。映画であれば、アクションらしさやコメディらしさなどが考えられます。予測評価値は、ユーザーベクトルとアイテムベクトルの内積として表され、データだけから学習されます。
推薦におけるSVD
SVD形式のモデルは、正則化を加えながら、既知の評価値に対する予測誤差を最小化することで、これらの因子を学習します。surpriseライブラリには、推薦用に最適化されたすぐに使えるSVDが用意されており、Netflix Prizeによって広く知られるようになりました。
Surpriseライブラリ
必要な部品をインポートします。アルゴリズム、データセットのラッパー、そしてデータ形式を指定するreaderです。
from surprise import SVD, Dataset, Reader
from surprise.model_selection import cross_validateReaderとrating_scale
Readerは、rating_scaleを通じて有効な評価値の範囲をSurpriseに伝えます。データに合わせて設定してください(たとえば星1~5)。合っていないと、予測値のスケールが適切でなくなります。
reader = Reader(rating_scale=(1, 5))DataFrameの読み込み
user、item、ratingの3列を、この順番で正確に持つDataFrameを読み込みます。
data = Dataset.load_from_df(
df[["user_id", "item_id", "rating"]],
reader
)交差検証
cross_validateは複数の分割にわたってモデルを評価し、誤差指標を報告します。これにより、検証用に取り分けたデータで精度を公平に判断できます。
results = cross_validate(
SVD(), data,
measures=["RMSE", "MAE"],
cv=5,
verbose=True
)RMSEとMAE
- RMSE(二乗平均平方根誤差)は、大きな誤差に強いペナルティを与えます。
- MAE(平均絶対誤差)は、予測の外れ幅の絶対値の平均であり、解釈しやすい指標です。
どちらも値が小さいほど優れています。評価値予測では、RMSEが代表的な指標として使われます。
全データでの学習
検証が終わったら、予測を提供する前にデータセット全体で学習します。
trainset = data.build_full_trainset()
algo = SVD()
algo.fit(trainset)予測の実行
algo.predict(uid, iid)は予測オブジェクトを返します。このオブジェクトの.estフィールドに、そのユーザーとアイテムの組み合わせに対する推定評価値が入ります。
pred = algo.predict(uid="user_42", iid="item_99")
print(pred.est) # estimated ratingハイパーパラメーターのチューニング
SVDで重要な設定値は、n_factors(潜在次元数)、n_epochs、lr_all(学習率)、reg_all(正則化)です。GridSearchCVを使い、RMSEに基づいて最適な組み合わせを探します。
from surprise.model_selection import GridSearchCV
grid = {"n_factors": [50, 100], "reg_all": [0.02, 0.1]}
gs = GridSearchCV(SVD, grid, measures=["rmse"], cv=3)
gs.fit(data)
print(gs.best_params["rmse"])確認テスト
行列分解の知識を確認しましょう。
まとめ
SVDによる行列分解を学びました。潜在的なユーザーベクトルとアイテムベクトルの内積によって評価値を予測します。surpriseを使い、rating_scaleを設定し、データを読み込み、cross_validateでRMSE/MAEを計算し、学習を実行して、algo.predict(uid, iid)を呼び出しました。次は、コンテンツベースフィルタリングです。
よくある質問
「SVDによる行列分解」レッスンは無料ですか?
はい。「SVDによる行列分解」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「SVDによる行列分解」で何を学びますか?
ユーザー・アイテム行列、SVD分解、潜在因子、Surpriseライブラリによる実装について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「SVDによる行列分解」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。