0Pricing
Learn AI with Python · レッスン

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_validate

Readerと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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 協調フィルタリング:ユーザーベースとアイテムベース
  2. SVDによる行列分解
  3. コンテンツベースフィルタリング
  4. ハイブリッドシステムと評価指標
← Learn AI with Pythonに戻る