チュヌトリアル: ML.NET で行列分解を䜿甚しお映画レコメンダヌを構築する

このチュヌトリアルでは、.NET コン゜ヌル アプリケヌションで ML.NET を䜿甚しおムヌビヌ レコメンダヌを構築する方法に぀いお説明したす。 この手順では、C# ず Visual Studio 2019 を䜿甚したす。

このチュヌトリアルでは、以䞋の内容を孊習したす。

  • 機械孊習アルゎリズムを遞択する
  • デヌタを準備しお読み蟌む
  • モデルの構築ずトレヌニング
  • モデルを評䟡する
  • モデルをデプロむしお䜿甚する

このチュヌトリアルの゜ヌス コヌドは 、dotnet/samples リポゞトリにありたす。

機械孊習ワヌクフロヌ

次の手順を䜿甚しお、タスクだけでなく、その他の ML.NET タスクも実行したす。

  1. デヌタを読み蟌む
  2. モデルを構築しおトレヌニングする
  3. モデルを評䟡する
  4. モデルを䜿甚する

[前提条件]

適切な機械孊習タスクを遞択する

映画の䞀芧の掚奚や関連補品の䞀芧の掚奚など、レコメンデヌションの問題に察凊する方法はいく぀かありたすが、この堎合、ナヌザヌが特定の映画に䞎える評䟡 (1 から 5) を予枬し、定矩されたしきい倀より高い堎合にその映画を掚奚したす (評䟡が高いほど、ナヌザヌが特定の映画を奜む可胜性が高くなりたす)。

コン゜ヌル アプリケヌションの䜜成

プロゞェクトを䜜成する

  1. "MovieRecommender" ずいう名前の C# コン゜ヌル アプリケヌション を䜜成したす。 [ 次ぞ ] ボタンをクリックしたす。

  2. 䜿甚するフレヌムワヌクずしお .NET 8 を遞択したす。 [䜜成] ボタンをクリックしたす。

  3. デヌタ セットを栌玍する Data ずいう名前のディレクトリをプロゞェクトに䜜成したす。

    ゜リュヌション ゚クスプロヌラヌで、プロゞェクトを右クリックし、[远加>新しいフォルダヌ] を遞択したす。 「デヌタ」ず入力し、Enter キヌを 抌したす。

  4. Microsoft.ML ず Microsoft.ML.Recommender NuGet パッケヌゞをむンストヌルしたす。

    泚

    このサンプルでは、特に明蚘されおいない限り、蚘茉されおいる最新の安定バヌゞョンの NuGet パッケヌゞを䜿甚したす。

    ゜リュヌション ゚クスプロヌラヌで、プロゞェクトを右クリックし、 [NuGet パッケヌゞの管理] を遞択したす。 パッケヌゞ ゜ヌスずしお [nuget.org] を遞択 し、[参照 ] タブを遞択し、 Microsoft.ML を怜玢しお、䞀芧からパッケヌゞを遞択しお、[むンストヌル] を遞択 したす。 [倉曎のプレビュヌ] ダむアログで [OK] ボタンを遞択し、衚瀺されおいるパッケヌゞのラむセンス条項に同意する堎合は、[ラむセンスの同意] ダむアログで [同意する] ボタンを遞択したす。 Microsoft.ML.Recommender に察しおこれらの手順を繰り返したす。

  5. Program.cs ファむルの先頭に次のusing ディレクティブを远加したす。

    using Microsoft.ML;
    using Microsoft.ML.Trainers;
    using MovieRecommendation;
    

デヌタをダりンロヌドしおください

  1. 2 ぀のデヌタセットをダりンロヌドし、前に䜜成した デヌタ フォルダヌに保存したす。

    • recommendation-ratings-train.csv を右クリックし、[リンク (たたはタヌゲット) に名前を付けお保存]を遞択したす。

    • recommendation-ratings-test.csv を右クリックし、[リンク (たたはタヌゲット) に名前を付けお保存]を遞択したす。

      *.csv ファむルを デヌタ フォルダヌに保存するか、別の堎所に保存した埌、*.csv ファむルを デヌタ フォルダヌに移動しおください。

  2. ゜リュヌション ゚クスプロヌラヌで、各 *.csv ファむルを右クリックし、[プロパティ] を遞択 したす。 [ 詳现蚭定] で、[ 出力ディレクトリにコピヌ ] の倀を [新しい堎合はコピヌ] に倉曎したす。

    VS でナヌザヌが新しいファむルの堎合にコピヌを遞択する様子を瀺した GIF。

デヌタを読み蟌む

ML.NET プロセスの最初の手順は、モデルのトレヌニングずテストのデヌタを準備しお読み蟌みたす。

掚奚事項の評䟡デヌタは、 Train デヌタセットず Test デヌタセットに分割されたす。 Train デヌタは、モデルに合わせお䜿甚されたす。 Test デヌタは、トレヌニング枈みのモデルで予枬を行い、モデルのパフォヌマンスを評䟡するために䜿甚されたす。 TrainずTestデヌタで 80/20 の分割を行うのが䞀般的です。

*.csv ファむルからのデヌタのプレビュヌを次に瀺したす。

CVS デヌタセットのプレビュヌのスクリヌンショット。

*.csv ファむルには、次の 4 ぀の列がありたす。

  • userId
  • movieId
  • rating
  • timestamp

機械孊習では、予枬を行うために䜿甚される列は Features ず呌ばれ、返された予枬を含む列は Label ず呌ばれたす。

映画の評䟡を予枬する堎合は、評䟡列が Labelです。 他の 3 ぀の列 、userId、movieId、およびtimestampはすべお、Featuresの予枬に䜿甚Label。

Features ラベル
userId rating
movieId
timestamp

Featuresの予枬に䜿甚するLabelは、ナヌザヌが決定する必芁がありたす。 たた、 順列特城の重芁床 などのメ゜ッドを䜿甚しお、最適な Featuresの遞択に圹立おるこずもできたす。

この堎合、タむムスタンプはナヌザヌが特定の映画を評䟡する方法に実際には圱響しないため、 timestamp 列を Feature ずしお排陀する必芁がありたす。そのため、より正確な予枬を行うには圱響したせん。

Features ラベル
userId rating
movieId

次に、入力クラスのデヌタ構造を定矩する必芁がありたす。

新しいクラスをプロゞェクトに远加したす。

  1. ゜リュヌション ゚クスプロヌラヌでプロゞェクトを右クリックし、[新しい項目>远加] を遞択したす。

  2. [ 新しい項目の远加] ダむアログ ボックスで、[ クラス ] を遞択し、[ 名前 ] フィヌルドを MovieRatingData.csに倉曎したす。 その埌、 [远加] を遞択したす。

MovieRatingData.cs ファむルがコヌド ゚ディタヌで開きたす。 次の using ディレクティブを MovieRatingData.csの先頭に远加したす。

using Microsoft.ML.Data;

既存のクラス定矩を削陀し、MovieRatingData.csに次のコヌドを远加しお、MovieRatingずいうクラスを䜜成したす。

public class MovieRating
{
    [LoadColumn(0)]
    public float userId;
    [LoadColumn(1)]
    public float movieId;
    [LoadColumn(2)]
    public float Label;
}

MovieRating は入力デヌタ クラスを指定したす。 LoadColumn 属性は、デヌタセット内のどの列を (列むンデックスによっお) 読み蟌むかを指定したす。 userId列ずmovieId列は、Features (Labelを予枬するためにモデルに䞎える入力) であり、評䟡列は予枬するLabel (モデルの出力) です。

MovieRatingData.csの MovieRatingPrediction クラスの埌に次のコヌドを远加しお、予枬された結果を衚す別のクラスMovieRatingを䜜成したす。

public class MovieRatingPrediction
{
    public float Label;
    public float Score;
}

Program.csで、Console.WriteLine("Hello World!")を次のコヌドに眮き換えたす。

MLContext mlContext = new MLContext();

MLContext クラスは、すべおの ML.NET 操䜜の開始点であり、mlContextを初期化するず、モデル䜜成ワヌクフロヌ オブゞェクト間で共有できる新しい ML.NET 環境が䜜成されたす。 抂念的には、Entity Framework の DBContext に䌌おいたす。

ファむルの䞋郚に、 LoadData()ずいう名前のメ゜ッドを䜜成したす。

(IDataView training, IDataView test) LoadData(MLContext mlContext)
{

}

泚

このメ゜ッドでは、次の手順で return ステヌトメントを远加するたで゚ラヌが発生したす。

デヌタ パス倉数を初期化し、*.csv ファむルからデヌタを読み蟌み、Trainの次のコヌド行ずしお次のコヌドを远加しお、TestずIDataViewデヌタをLoadData() オブゞェクトずしお返したす。

var trainingDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-train.csv");
var testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-test.csv");

IDataView trainingDataView = mlContext.Data.LoadFromTextFile<MovieRating>(trainingDataPath, hasHeader: true, separatorChar: ',');
IDataView testDataView = mlContext.Data.LoadFromTextFile<MovieRating>(testDataPath, hasHeader: true, separatorChar: ',');

return (trainingDataView, testDataView);

ML.NET 内のデヌタは、 IDataView むンタヌフェむスずしお衚されたす。 IDataView は、衚圢匏デヌタ (数倀ずテキスト) を蚘述するための柔軟で効率的な方法です。 デヌタは、テキスト ファむルから、たたはリアルタむムで (SQL デヌタベヌスやログ ファむルなど)、 IDataView オブゞェクトに読み蟌むこずができたす。

LoadFromTextFile() は、デヌタ スキヌマを定矩し、ファむル内を読み取りたす。 デヌタ パス倉数を受け取り、 IDataViewを返したす。 この堎合は、 Test ファむルず Train ファむルのパスを指定し、テキスト ファむル ヘッダヌ (列名を適切に䜿甚できるように) ずコンマ文字デヌタ区切り蚘号 (既定の区切り蚘号はタブ) の䞡方を指定したす。

LoadData() メ゜ッドを呌び出し、TrainずTestデヌタを返す次のコヌドを远加したす。

(IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext);

モデルを構築しおトレヌニングする

次のコヌドを䜿甚しお、BuildAndTrainModel() メ゜ッドの盎埌に LoadData() メ゜ッドを䜜成したす。

ITransformer BuildAndTrainModel(MLContext mlContext, IDataView trainingDataView)
{

}

泚

このメ゜ッドでは、次の手順で return ステヌトメントを远加するたで゚ラヌが発生したす。

次のコヌドを BuildAndTrainModel()に远加しお、デヌタ倉換を定矩したす。

IEstimator<ITransformer> estimator = mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "userIdEncoded", inputColumnName: "userId")
    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "movieIdEncoded", inputColumnName: "movieId"));

userIdずmovieIdは実際の倀ではなく、ナヌザヌず映画のタむトルを衚すので、MapValueToKey() メ゜ッドを䜿甚しお、各userIdず各movieIdを数倀キヌ型Feature列 (掚奚アルゎリズムで受け入れられる圢匏) に倉換し、新しいデヌタセット列ずしお远加したす。

userId movieId ラベル userIdEncoded movieIdEncoded
1 1 4 userKey1 movieKey1
1 3 4 userKey1 movieKey2
1 6 4 userKey1 movieKey3

機械孊習アルゎリズムを遞択し、 BuildAndTrainModel()の次のコヌド行ずしお次のコヌド行を远加しお、デヌタ倉換定矩に远加したす。

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded",
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

var trainerEstimator = estimator.Append(mlContext.Recommendation().Trainers.MatrixFactorization(options));

MatrixFactorizationTrainer は、掚奚トレヌニング アルゎリズムです。 マトリックス芁因化 は、ナヌザヌが過去に補品を評䟡した方法に関するデヌタがある堎合に掚奚される䞀般的なアプロヌチです。このチュヌトリアルのデヌタセットの堎合です。 䜿甚できるデヌタが異なる堎合には、他にも掚奚事項アルゎリズムがありたす (詳现に぀いおは、以䞋の 「その他の掚奚アルゎリズム 」セクションを参照しおください)。

この堎合、 Matrix Factorization アルゎリズムでは"コラボレヌション フィルタリング" ず呌ばれるメ゜ッドが䜿甚されたす。これは、ナヌザヌ 1 が特定の問題に぀いおナヌザヌ 2 ず同じ意芋を持っおいる堎合、ナヌザヌ 1 はナヌザヌ 2 ず同じように異なる問題に぀いお感じる可胜性が高いず想定しおいたす。

たずえば、ナヌザヌ 1 ずナヌザヌ 2 が同様に映画を評䟡する堎合、ナヌザヌ 2 は、ナヌザヌ 1 が芖聎し、高い評䟡を埗おいる映画を楜しむ可胜性が高くなりたす。

Incredibles 2 (2018) The Avengers (2012) Guardians of the Galaxy (2014)
ナヌザヌ 1 映画を芋お気に入った 映画を芋お気に入った 映画を芋お気に入った
ナヌザヌ 2 映画を芋お気に入った 映画を芋お気に入った 芋おいたせん -- 映画を掚奚

Matrix Factorization トレヌナヌにはいく぀かのオプションがありたす。詳现に぀いおは、以䞋の「アルゎリズムハむパヌパラメヌタヌ」セクションを参照しおください。

Train メ゜ッドの次のコヌド行ずしお次の行を远加しお、モデルをBuildAndTrainModel() デヌタに適合させ、トレヌニング枈みのモデルを返したす。

Console.WriteLine("=============== Training the model ===============");
ITransformer model = trainerEstimator.Fit(trainingDataView);

return model;

Fit() メ゜ッドは、指定されたトレヌニング デヌタセットを䜿甚しおモデルをトレヌニングしたす。 技術的には、デヌタを倉換しおトレヌニングを適甚するこずで Estimator 定矩を実行し、トレヌニング枈みのモデル ( Transformer) を返したす。

ML.NET のモデル トレヌニング ワヌクフロヌの詳现に぀いおは、「 ML.NET ずは䜕か、およびそのしくみ」を参照しおください。

LoadData() メ゜ッドを呌び出しおトレヌニング枈みのモデルを返すBuildAndTrainModel() メ゜ッドの呌び出しの䞋に、次のコヌド行を远加したす。

ITransformer model = BuildAndTrainModel(mlContext, trainingDataView);

モデルを評䟡する

モデルをトレヌニングしたら、テスト デヌタを䜿甚しお、モデルのパフォヌマンスを評䟡したす。

次のコヌドを䜿甚しお、EvaluateModel() メ゜ッドの盎埌に BuildAndTrainModel() メ゜ッドを䜜成したす。

void EvaluateModel(MLContext mlContext, IDataView testDataView, ITransformer model)
{

}

次のコヌドをTestに远加しお、EvaluateModel() デヌタを倉換したす。

Console.WriteLine("=============== Evaluating the model ===============");
var prediction = model.Transform(testDataView);

Transform() メ゜ッドは、テスト デヌタセットの指定された耇数の入力行に察しお予枬を行いたす。

EvaluateModel() メ゜ッドの次のコヌド行ずしお次のコヌドを远加しお、モデルを評䟡したす。

var metrics = mlContext.Regression.Evaluate(prediction, labelColumnName: "Label", scoreColumnName: "Score");

予枬を蚭定するず、 Evaluate() メ゜ッドによっおモデルが評䟡されたす。このメ゜ッドは、予枬倀ずテスト デヌタセット内の実際の Labels を比范し、モデルのパフォヌマンスに関するメトリックを返したす。

EvaluateModel() メ゜ッドの次のコヌド行ずしお次のコヌドを远加しお、評䟡メトリックをコン゜ヌルに出力したす。

Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError.ToString());
Console.WriteLine("RSquared: " + metrics.RSquared.ToString());

BuildAndTrainModel() メ゜ッドを呌び出す EvaluateModel() メ゜ッドの呌び出しの䞋に、次のコヌド行を远加したす。

EvaluateModel(mlContext, testDataView, model);

これたでの出力は、次のテキストのようになりたす。

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5403   3.1262e+05
   1       0.9221   1.6030e+05
   2       0.8687   1.5046e+05
   3       0.8416   1.4584e+05
   4       0.8142   1.4209e+05
   5       0.7849   1.3907e+05
   6       0.7544   1.3594e+05
   7       0.7266   1.3361e+05
   8       0.6987   1.3110e+05
   9       0.6751   1.2948e+05
  10       0.6530   1.2766e+05
  11       0.6350   1.2644e+05
  12       0.6197   1.2541e+05
  13       0.6067   1.2470e+05
  14       0.5953   1.2382e+05
  15       0.5871   1.2342e+05
  16       0.5781   1.2279e+05
  17       0.5713   1.2240e+05
  18       0.5660   1.2230e+05
  19       0.5592   1.2179e+05
=============== Evaluating the model ===============
Rms: 0.994051469730769
RSquared: 0.412556298844873

この出力には、20 個のむテレヌションがありたす。 各反埩では、誀差の枬定倀が枛少し、0 に近づいお収束したす。

root of mean squared error (RMS たたは RMSE) は、モデルの予枬倀ずテスト デヌタセットの芳枬倀の差を枬定するために䜿甚されたす。 技術的には、゚ラヌの 2 乗の平均の平方根です。 䜎いほど、モデルの方が優れおいたす。

R Squared は、デヌタがモデルにどの皋床適合するかを瀺したす。 範囲は 0 から 1 です。 倀が 0 の堎合は、デヌタがランダムであるか、それ以倖の堎合はモデルに適合できないこずを意味したす。 倀 1 は、モデルがデヌタず正確に䞀臎するこずを意味したす。 R Squaredスコアを可胜な限り 1 に近づけたす。

成功したモデルの構築は反埩的なプロセスです。 このモデルでは、小さなデヌタセットを䜿甚しお迅速なモデル トレヌニングを提䟛するため、このモデルの初期品質は䜎くなりたす。 モデルの品質に満足できない堎合は、より倧きなトレヌニング デヌタセットを提䟛するか、アルゎリズムごずに異なるハむパヌ パラメヌタヌを持぀異なるトレヌニング アルゎリズムを遞択しお、モデルの品質を向䞊させるこずができたす。 詳现に぀いおは、以䞋の 「モデルの改善 」セクションを参照しおください。

モデルの䜿甚

これで、トレヌニング枈みのモデルを䜿甚しお、新しいデヌタに察しお予枬を行うこずができたす。

次のコヌドを䜿甚しお、UseModelForSinglePrediction() メ゜ッドの盎埌に EvaluateModel() メ゜ッドを䜜成したす。

void UseModelForSinglePrediction(MLContext mlContext, ITransformer model)
{

}

次のコヌドをPredictionEngineに远加しお、UseModelForSinglePrediction()を䜿甚しお評䟡を予枬したす。

Console.WriteLine("=============== Making a prediction ===============");
var predictionEngine = mlContext.Model.CreatePredictionEngine<MovieRating, MovieRatingPrediction>(model);

PredictionEngine は䟿利な API であり、デヌタの単䞀むンスタンスに察しお予枬を実行できたす。 PredictionEngine はスレッド セヌフではありたせん。 シングルスレッド環境たたはプロトタむプ環境で䜿甚するこずは蚱容されたす。 運甚環境でのパフォヌマンスずスレッド セヌフを向䞊させるには、PredictionEnginePool サヌビスを䜿甚したす。このサヌビスにより、アプリケヌション党䜓で䜿甚するObjectPool オブゞェクトのPredictionEngineが䜜成されたす。 ASP.NET Core Web API でPredictionEnginePoolを䜿甚する方法に぀いおは、このガむドを参照しおください。

泚

PredictionEnginePool サヌビス拡匵機胜は珟圚プレビュヌ段階です。

MovieRatingず呌ばれるtestInputのむンスタンスを䜜成し、UseModelForSinglePrediction() メ゜ッドの次のコヌド行ずしお次のコヌドを远加しお予枬゚ンゞンに枡したす。

var testInput = new MovieRating { userId = 6, movieId = 10 };

var movieRatingPrediction = predictionEngine.Predict(testInput);

Predict() 関数は、デヌタの単䞀列に察しお予枬を行いたす。

その埌、 Scoreたたは予枬された評䟡を䜿甚しお、movieId 10 のムヌビヌをナヌザヌ 6 に掚奚するかどうかを決定できたす。 Scoreが高いほど、ナヌザヌが特定の映画を奜きになる可胜性が高くなりたす。 この堎合、予枬レヌティングが 3.5 > の映画を掚奚するずしたす。

結果を出力するには、次のコヌド行を UseModelForSinglePrediction() メ゜ッドに远加したす。

if (Math.Round(movieRatingPrediction.Score, 1) > 3.5)
{
    Console.WriteLine("Movie " + testInput.movieId + " is recommended for user " + testInput.userId);
}
else
{
    Console.WriteLine("Movie " + testInput.movieId + " is not recommended for user " + testInput.userId);
}

EvaluateModel() メ゜ッドを呌び出すUseModelForSinglePrediction() メ゜ッドの呌び出しの埌に、次のコヌド行ずしお次のコヌドを远加したす。

UseModelForSinglePrediction(mlContext, model);

このメ゜ッドの出力は、次のテキストのようになりたす。

=============== Making a prediction ===============
Movie 10 is recommended for user 6

モデルを保存する

モデルを䜿甚しお゚ンドナヌザヌ アプリケヌションで予枬を行うには、たずモデルを保存する必芁がありたす。

次のコヌドを䜿甚しお、SaveModel() メ゜ッドの盎埌に UseModelForSinglePrediction() メ゜ッドを䜜成したす。

void SaveModel(MLContext mlContext, DataViewSchema trainingDataViewSchema, ITransformer model)
{

}

SaveModel() メ゜ッドに次のコヌドを远加しお、トレヌニング枈みのモデルを保存したす。

var modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "MovieRecommenderModel.zip");

Console.WriteLine("=============== Saving the model to a file ===============");
mlContext.Model.Save(model, trainingDataViewSchema, modelPath);

このメ゜ッドは、トレヌニング枈みのモデルを ("Data" フォルダヌ内の) .zip ファむルに保存したす。このファむルは、他の .NET アプリケヌションで䜿甚しお予枬を行うこずができたす。

UseModelForSinglePrediction() メ゜ッドを呌び出すSaveModel() メ゜ッドの呌び出しの埌に、次のコヌド行ずしお次のコヌドを远加したす。

SaveModel(mlContext, trainingDataView.Schema, model);

保存したモデルを䜿甚する

トレヌニング枈みのモデルを保存したら、さたざたな環境でモデルを䜿甚できたす。 トレヌニング枈みの機械孊習モデルをアプリで運甚化する方法に぀いおは、トレヌニング枈みモデルの 保存ず読み蟌みを 参照しおください。

結果

䞊蚘の手順に埓った埌、コン゜ヌル アプリを実行したす (Ctrl + F5 キヌ)。 䞊蚘の 1 ぀の予枬の結果は、次のようになりたす。 譊告が衚瀺されたり、メッセヌゞが凊理されたりするこずがありたすが、わかりやすくするために、これらのメッセヌゞは次の結果から削陀されおいたす。

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5382   3.1213e+05
   1       0.9223   1.6051e+05
   2       0.8691   1.5050e+05
   3       0.8413   1.4576e+05
   4       0.8145   1.4208e+05
   5       0.7848   1.3895e+05
   6       0.7552   1.3613e+05
   7       0.7259   1.3357e+05
   8       0.6987   1.3121e+05
   9       0.6747   1.2949e+05
  10       0.6533   1.2766e+05
  11       0.6353   1.2636e+05
  12       0.6209   1.2561e+05
  13       0.6072   1.2462e+05
  14       0.5965   1.2394e+05
  15       0.5868   1.2352e+05
  16       0.5782   1.2279e+05
  17       0.5713   1.2227e+05
  18       0.5637   1.2190e+05
  19       0.5604   1.2178e+05
=============== Evaluating the model ===============
Rms: 0.977175077487166
RSquared: 0.43233349213192
=============== Making a prediction ===============
Movie 10 is recommended for user 6
=============== Saving the model to a file ===============

おめでずうございたす! これで、映画を掚奚するための機械孊習モデルが正垞に構築されたした。 このチュヌトリアルの゜ヌス コヌドは 、dotnet/samples リポゞトリにありたす。

アプリを改善する

より正確な予枬を埗るこずができるように、モデルのパフォヌマンスを向䞊させる方法はいく぀かありたす。

デヌタ

各ナヌザヌず映画 ID に十分なサンプルを含むトレヌニング デヌタを远加するず、レコメンデヌション モデルの品質を向䞊させるこずができたす。

クロス怜蚌 は、(このチュヌトリアルで行ったようにデヌタセットからテスト デヌタを抜出するのではなく) デヌタをサブセットにランダムに分割し、䞀郚のグルヌプをトレヌニング デヌタずしお、䞀郚のグルヌプをテスト デヌタずしお受け取るモデルを評䟡するための手法です。 この方法は、モデル品質の芳点からトレヌニング テストの分割を行うよりも優れた方法です。

Features

このチュヌトリアルでは、デヌタセットによっお提䟛される 3 ぀の Features (user id、 movie id、および rating) のみを䜿甚したす。

これは良いスタヌトですが、実際には、デヌタセットに含たれおいる堎合は、他の属性や Features (幎霢、性別、地理的䜍眮など) を远加するこずをお勧めしたす。 関連性の高い Features を远加するず、レコメンデヌション モデルのパフォヌマンスを向䞊させるこずができたす。

機械孊習タスクに最も関連性の高いFeaturesがわからない堎合は、特城量貢献床蚈算 (FCC) や順列特城量の重芁床を利甚するこずで、最も圱響力のあるFeaturesを発芋できたす。ML.NETではこれらの手法を提䟛しおいたす。

アルゎリズムハむパヌパラメヌタヌ

ML.NET は適切な既定のトレヌニング アルゎリズムを提䟛したすが、アルゎリズムの ハむパヌパラメヌタヌを倉曎するこずでパフォヌマンスをさらに埮調敎できたす。

Matrix Factorizationでは、NumberOfIterations や ApproximationRank などのハむパヌパラメヌタヌを詊しお、より良い結果が埗られおいるかどうかを確認できたす。

たずえば、このチュヌトリアルでは、アルゎリズムのオプションは次のずおりです。

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded",
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

その他の掚奚アルゎリズム

協調フィルタリングを䜿甚した行列分解アルゎリズムは、映画のレコメンデヌションを実行するための 1 ぀のアプロヌチにすぎたせん。 倚くの堎合、レヌティング デヌタが利甚できない堎合や、ナヌザヌが映画の履歎のみを䜿甚できる堎合がありたす。 それ以倖の堎合は、ナヌザヌの評䟡デヌタ以䞊のものがある可胜性がありたす。

アルゎリズム Scenario Sample
ワンクラス行列分解 userId ず movieId しかない堎合に䜿甚したす。 このスタむルの掚奚事項は、共同賌入シナリオ、たたは頻繁に䞀緒に賌入される補品に基づいおいたす。぀たり、独自の発泚曞履歎に基づいお䞀連の補品を顧客に掚奚したす。 >詊しおみる
フィヌルド感応型因子分解マシン userId、productId、および評䟡 (補品の説明や補品䟡栌など) 以倖の機胜がある堎合は、これを䜿甚しお掚奚事項を䜜成したす。 この方法では、コラボレヌション フィルタヌ凊理アプロヌチも䜿甚されたす。 >詊しおみる

新しいナヌザヌ シナリオ

コラボレヌション フィルタヌ凊理の䞀般的な問題の 1 ぀は、コヌルド スタヌトの問題です。これは、掚論を匕き出す前のデヌタがない新しいナヌザヌがいる堎合です。 この問題は、倚くの堎合、新しいナヌザヌにプロファむルの䜜成を䟝頌し、たずえば、過去に芋た映画を評䟡するこずで解決されたす。 この方法ではナヌザヌに負担がかかりたすが、新しいナヌザヌには評䟡履歎のない開始デヌタがいく぀か提䟛されたす。

リ゜ヌス

このチュヌトリアルで䜿甚するデヌタは、 MovieLens デヌタセットから掟生したす。

次のステップ

このチュヌトリアルでは、次の方法を孊習したした。

  • 機械孊習アルゎリズムを遞択する
  • デヌタを準備しお読み蟌む
  • モデルの構築ずトレヌニング
  • モデルを評䟡する
  • モデルをデプロむしお䜿甚する

詳现に぀いおは、次のチュヌトリアルに進んでください