Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã.NET ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ã§ ML.NET ã䜿çšããŠã ãŒã㌠ã¬ã³ã¡ã³ããŒãæ§ç¯ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ãã®æé ã§ã¯ãC# ãš Visual Studio 2019 ã䜿çšããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã以äžã®å 容ãåŠç¿ããŸãã
- æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ãéžæãã
- ããŒã¿ãæºåããŠèªã¿èŸŒã
- ã¢ãã«ã®æ§ç¯ãšãã¬ãŒãã³ã°
- ã¢ãã«ãè©äŸ¡ãã
- ã¢ãã«ããããã€ããŠäœ¿çšãã
ãã®ãã¥ãŒããªã¢ã«ã®ãœãŒã¹ ã³ãŒã㯠ãdotnet/samples ãªããžããªã«ãããŸãã
æ©æ¢°åŠç¿ã¯ãŒã¯ãããŒ
æ¬¡ã®æé ã䜿çšããŠãã¿ã¹ã¯ã ãã§ãªãããã®ä»ã® ML.NET ã¿ã¹ã¯ãå®è¡ããŸãã
- ããŒã¿ãèªã¿èŸŒã
- ã¢ãã«ãæ§ç¯ããŠãã¬ãŒãã³ã°ãã
- ã¢ãã«ãè©äŸ¡ãã
- ã¢ãã«ã䜿çšãã
[åææ¡ä»¶]
é©åãªæ©æ¢°åŠç¿ã¿ã¹ã¯ãéžæãã
æ ç»ã®äžèŠ§ã®æšå¥šãé¢é£è£œåã®äžèŠ§ã®æšå¥šãªã©ãã¬ã³ã¡ã³ããŒã·ã§ã³ã®åé¡ã«å¯ŸåŠããæ¹æ³ã¯ããã€ããããŸããããã®å ŽåããŠãŒã¶ãŒãç¹å®ã®æ ç»ã«äžããè©äŸ¡ (1 ãã 5) ãäºæž¬ããå®çŸ©ããããããå€ããé«ãå Žåã«ãã®æ ç»ãæšå¥šããŸã (è©äŸ¡ãé«ãã»ã©ããŠãŒã¶ãŒãç¹å®ã®æ ç»ã奜ãå¯èœæ§ãé«ããªããŸã)ã
ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ã®äœæ
ãããžã§ã¯ããäœæãã
"MovieRecommender" ãšããååã® C# ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ ãäœæããŸãã [ 次㞠] ãã¿ã³ãã¯ãªãã¯ããŸãã
䜿çšãããã¬ãŒã ã¯ãŒã¯ãšã㊠.NET 8 ãéžæããŸãã [äœæ] ãã¿ã³ãã¯ãªãã¯ããŸãã
ããŒã¿ ã»ãããæ ŒçŽãã Data ãšããååã®ãã£ã¬ã¯ããªããããžã§ã¯ãã«äœæããŸãã
ãœãªã¥ãŒã·ã§ã³ ãšã¯ã¹ãããŒã©ãŒã§ããããžã§ã¯ããå³ã¯ãªãã¯ãã[远å >æ°ãããã©ã«ããŒ] ãéžæããŸãã ãããŒã¿ããšå ¥åããEnter ããŒã æŒããŸãã
Microsoft.ML ãš Microsoft.ML.Recommender NuGet ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
泚
ãã®ãµã³ãã«ã§ã¯ãç¹ã«æèšãããŠããªãéããèšèŒãããŠããææ°ã®å®å®ããŒãžã§ã³ã® NuGet ããã±ãŒãžã䜿çšããŸãã
ãœãªã¥ãŒã·ã§ã³ ãšã¯ã¹ãããŒã©ãŒã§ããããžã§ã¯ããå³ã¯ãªãã¯ãã [NuGet ããã±ãŒãžã®ç®¡ç] ãéžæããŸãã ããã±ãŒãž ãœãŒã¹ãšã㊠[nuget.org] ãéžæ ãã[åç § ] ã¿ããéžæãã Microsoft.ML ãæ€çŽ¢ããŠãäžèЧããããã±ãŒãžãéžæããŠã[ã€ã³ã¹ããŒã«] ãéžæ ããŸãã [倿Žã®ãã¬ãã¥ãŒ] ãã€ã¢ãã°ã§ [OK] ãã¿ã³ãéžæãã衚瀺ãããŠããããã±ãŒãžã®ã©ã€ã»ã³ã¹æ¡é ã«åæããå Žåã¯ã[ã©ã€ã»ã³ã¹ã®åæ] ãã€ã¢ãã°ã§ [åæãã] ãã¿ã³ãéžæããŸãã Microsoft.ML.Recommender ã«å¯ŸããŠãããã®æé ãç¹°ãè¿ããŸãã
Program.cs ãã¡ã€ã«ã®å é ã«æ¬¡ã®
usingãã£ã¬ã¯ãã£ãã远å ããŸããusing Microsoft.ML; using Microsoft.ML.Trainers; using MovieRecommendation;
ããŒã¿ãããŠã³ããŒãããŠãã ãã
2 ã€ã®ããŒã¿ã»ãããããŠã³ããŒãããåã«äœæãã ããŒã¿ ãã©ã«ããŒã«ä¿åããŸãã
recommendation-ratings-train.csv ãå³ã¯ãªãã¯ãã[ãªã³ã¯ (ãŸãã¯ã¿ãŒã²ãã) ã«ååãä»ããŠä¿å]ãéžæããŸãã
recommendation-ratings-test.csv ãå³ã¯ãªãã¯ãã[ãªã³ã¯ (ãŸãã¯ã¿ãŒã²ãã) ã«ååãä»ããŠä¿å]ãéžæããŸãã
*.csv ãã¡ã€ã«ã ããŒã¿ ãã©ã«ããŒã«ä¿åããããå¥ã®å Žæã«ä¿åããåŸã*.csv ãã¡ã€ã«ã ããŒã¿ ãã©ã«ããŒã«ç§»åããŠãã ããã
ãœãªã¥ãŒã·ã§ã³ ãšã¯ã¹ãããŒã©ãŒã§ãå *.csv ãã¡ã€ã«ãå³ã¯ãªãã¯ãã[ããããã£] ãéžæ ããŸãã [ 詳现èšå®] ã§ã[ åºåãã£ã¬ã¯ããªã«ã³ã㌠] ã®å€ã [æ°ããå Žåã¯ã³ããŒ] ã«å€æŽããŸãã
ããŒã¿ãèªã¿èŸŒã
ML.NET ããã»ã¹ã®æåã®æé ã¯ãã¢ãã«ã®ãã¬ãŒãã³ã°ãšãã¹ãã®ããŒã¿ãæºåããŠèªã¿èŸŒã¿ãŸãã
æšå¥šäºé
ã®è©äŸ¡ããŒã¿ã¯ã Train ããŒã¿ã»ãããš Test ããŒã¿ã»ããã«åå²ãããŸãã
Train ããŒã¿ã¯ãã¢ãã«ã«åãããŠäœ¿çšãããŸãã
Test ããŒã¿ã¯ããã¬ãŒãã³ã°æžã¿ã®ã¢ãã«ã§äºæž¬ãè¡ããã¢ãã«ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããããã«äœ¿çšãããŸãã
TrainãšTestããŒã¿ã§ 80/20 ã®åå²ãè¡ãã®ãäžè¬çã§ãã
*.csv ãã¡ã€ã«ããã®ããŒã¿ã®ãã¬ãã¥ãŒã次ã«ç€ºããŸãã
*.csv ãã¡ã€ã«ã«ã¯ã次㮠4 ã€ã®åããããŸãã
userIdmovieIdratingtimestamp
æ©æ¢°åŠç¿ã§ã¯ãäºæž¬ãè¡ãããã«äœ¿çšãããå㯠Features ãšåŒã°ããè¿ãããäºæž¬ãå«ãå㯠Label ãšåŒã°ããŸãã
æ ç»ã®è©äŸ¡ãäºæž¬ããå Žåã¯ãè©äŸ¡åã Labelã§ãã ä»ã® 3 ã€ã®å ãuserIdãmovieIdãããã³timestampã¯ãã¹ãŠãFeaturesã®äºæž¬ã«äœ¿çšLabelã
| Features | ã©ãã« |
|---|---|
userId |
rating |
movieId |
|
timestamp |
Featuresã®äºæž¬ã«äœ¿çšããLabelã¯ããŠãŒã¶ãŒã決å®ããå¿
èŠããããŸãã ãŸãã é åç¹åŸŽã®éèŠåºŠ ãªã©ã®ã¡ãœããã䜿çšããŠãæé©ãª Featuresã®éžæã«åœ¹ç«ãŠãããšãã§ããŸãã
ãã®å Žåãã¿ã€ã ã¹ã¿ã³ãã¯ãŠãŒã¶ãŒãç¹å®ã®æ ç»ãè©äŸ¡ããæ¹æ³ã«å®éã«ã¯åœ±é¿ããªãããã timestamp åã Feature ãšããŠæé€ããå¿
èŠããããŸãããã®ãããããæ£ç¢ºãªäºæž¬ãè¡ãã«ã¯åœ±é¿ããŸããã
| Features | ã©ãã« |
|---|---|
userId |
rating |
movieId |
次ã«ãå ¥åã¯ã©ã¹ã®ããŒã¿æ§é ãå®çŸ©ããå¿ èŠããããŸãã
æ°ããã¯ã©ã¹ããããžã§ã¯ãã«è¿œå ããŸãã
ãœãªã¥ãŒã·ã§ã³ ãšã¯ã¹ãããŒã©ãŒã§ãããžã§ã¯ããå³ã¯ãªãã¯ãã[æ°ããé ç®>远å ] ãéžæããŸãã
[ æ°ããé ç®ã®è¿œå ] ãã€ã¢ãã° ããã¯ã¹ã§ã[ ã¯ã©ã¹ ] ãéžæãã[ åå ] ãã£ãŒã«ãã 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 ããŒã¿ã»ããããæŽŸçããŸãã
次ã®ã¹ããã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãæ¬¡ã®æ¹æ³ãåŠç¿ããŸããã
- æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ãéžæãã
- ããŒã¿ãæºåããŠèªã¿èŸŒã
- ã¢ãã«ã®æ§ç¯ãšãã¬ãŒãã³ã°
- ã¢ãã«ãè©äŸ¡ãã
- ã¢ãã«ããããã€ããŠäœ¿çšãã
詳现ã«ã€ããŠã¯ã次ã®ãã¥ãŒããªã¢ã«ã«é²ãã§ãã ãã