Мой алгоритм рекомендации ML. Net возвращает 0 как для RSquared, так и для Root средних значений - PullRequest
1 голос
/ 05 апреля 2020

Я новичок в машинном обучении, но у меня есть опыт в C#, поэтому я хочу использовать Ml. net как способ знакомства с топи c.

Поскольку я понимаю концепцию, я решил создать модель рекомендаций по пиву, которая будет использовать предыдущие обзоры и рекомендовать новое пиво.

В любом случае, когда я запускаю программу, значения, возвращаемые в EvaluateModel ниже, возвращают 0 каждый. Я хотел бы еще пару глаз на это. Спасибо!

Это модель обучения

public static ITransformer BuildAndTrainModel(MLContext mlContext, IDataView trainingDataView)
        {
            IEstimator<ITransformer> estimator = mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "abvEncoded", inputColumnName: "abv")
                                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "ibuEncoded", inputColumnName: "ibu"))
                                .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "beerIDEncoded", inputColumnName: "beerID"))
                                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "nameEncoded", inputColumnName: "name"))
                                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "styleEncoded", inputColumnName: "style"))
                                .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "breweryIDEncoded", inputColumnName: "breweryID"))
                                .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "userIDEncoded", inputColumnName: "userID"))
                                .Append(mlContext.Transforms.Concatenate("Features", "abvEncoded", "ibuEncoded", "styleEncoded"));

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

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

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

            return model;

Это модель оценки

public static void EvaluateModel(MLContext mlContext, IDataView testDataView, ITransformer model)
        {
            Console.WriteLine("=============== Evaluating the model ===============");
            var prediction = model.Transform(testDataView);

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

            Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError.ToString());
            Console.WriteLine("RSquared: " + metrics.RSquared.ToString());
        }
        public static void UseModelForSinglePrediction(MLContext mlContext, ITransformer model)
        {
            Console.WriteLine("=============== Making a prediction ===============");
            var predictionEngine = mlContext.Model.CreatePredictionEngine<Beers, BeerPrediction>(model);

            //Predict
            var beerSample = new Beers()
            {
                userID = 1,
                abv = ".08",
                ibu = "120",
                beerID = 379,
                name = "Heady Topper",
                style = "American",
                breweryID = 272,
                ounces = 16
             };
            var beerRatingPrediction = predictionEngine.Predict(beerSample);

            if (Math.Round(beerRatingPrediction.Score, 1) > 3.5)
            {
                Console.WriteLine("Beer " + beerSample.beerID + " is recommended for user " + beerSample.userID);
            }
            else
            {
                Console.WriteLine("Beer " + beerSample.beerID + " is not recommended for user " + beerSample.userID);
            }
        }

Основной

 static void Main(string[] args)
        {
            MLContext mLContext = new MLContext();

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

            ITransformer model = BuildAndTrainModel(mLContext, trainingDataView);

            EvaluateModel(mLContext, testDataView, model);

            UseModelForSinglePrediction(mLContext, model);

            SaveModel(mLContext, trainingDataView.Schema, model);

            Console.Read();

Класс объекта для Пиво

    class Beers
    {
        [LoadColumn(0)]
        public float userID { get; set; }

        [LoadColumn(1)]
        public string abv { get; set; }

        [LoadColumn(2)]
        public string ibu { get; set; }

        [LoadColumn(3)]
        public float beerID { get; set; }

        [LoadColumn(4)]
        public string name { get; set; }

        [LoadColumn(5)]
        public string style { get; set; }

        [LoadColumn(6)]
        public float breweryID { get; set; }

        [LoadColumn(7)]
        public float ounces { get; set; }

        [LoadColumn(8), ColumnName("Label")]
        public float rating { get; set; }




    }
}
...