Пример #1
0
        public void Train(IEnumerable <ItemRanking> trainSet)
        {
            Console.WriteLine("Training...");

            _itemRecommender.Feedback = trainSet.ToPosOnlyFeedback(_usersMap, _itemsMap);
            _itemRecommender.Train();

            _isTrained = true;
        }
        public void SetUp()
        {
            training_data = new PosOnlyFeedback <SparseBooleanMatrix>();
            training_data.Add(1, 1);
            training_data.Add(1, 2);
            training_data.Add(2, 2);
            training_data.Add(2, 3);
            training_data.Add(3, 1);
            training_data.Add(3, 2);

            recommender = new MostPopular()
            {
                Feedback = training_data
            };
            recommender.Train();

            test_data = new PosOnlyFeedback <SparseBooleanMatrix>();
            test_data.Add(2, 3);
            test_data.Add(2, 4);
            test_data.Add(4, 4);

            all_users       = Enumerable.Range(1, 4).ToList();
            candidate_items = Enumerable.Range(1, 5).ToList();
        }
Пример #3
0
    static void DoTrack2()
    {
        TimeSpan seconds;

        if (find_iter != 0)
        {
            if (!(recommender_validate is IIterativeModel))
            {
                Usage("Only iterative recommenders support find_iter.");
            }

            IIterativeModel iterative_recommender_validate = (IIterativeModel)recommender_validate;
            IIterativeModel iterative_recommender_final    = (IIterativeModel)recommender_final;
            Console.WriteLine();

            if (load_model_file == string.Empty)
            {
                recommender_validate.Train();                 // TODO parallelize
                if (prediction_file != string.Empty)
                {
                    recommender_final.Train();
                }
            }

            // evaluate and display results
            double error = KDDCup.EvaluateTrack2(recommender_validate, validation_candidates, validation_hits);
            Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "ERR {0:0.######} {1}", error, iterative_recommender_validate.NumIter));

            for (int i = (int)iterative_recommender_validate.NumIter + 1; i <= max_iter; i++)
            {
                TimeSpan time = Utils.MeasureTime(delegate() {
                    iterative_recommender_validate.Iterate();                     // TODO parallelize
                    if (prediction_file != string.Empty)
                    {
                        iterative_recommender_final.Iterate();
                    }
                });
                training_time_stats.Add(time.TotalSeconds);

                if (i % find_iter == 0)
                {
                    time = Utils.MeasureTime(delegate() {                     // TODO parallelize
                        // evaluate
                        error = KDDCup.EvaluateTrack2(recommender_validate, validation_candidates, validation_hits);
                        err_eval_stats.Add(error);
                        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "ERR {0:0.######} {1}", error, i));

                        if (prediction_file != string.Empty)
                        {
                            if (predict_score)
                            {
                                Console.Error.WriteLine("Predicting validation scores ...");
                                KDDCup.PredictScoresTrack2(recommender_validate, validation_candidates, prediction_file + "-validate-it-" + i);
                                Console.Error.WriteLine("Predicting real scores ...");
                                KDDCup.PredictScoresTrack2(recommender_final, test_candidates, prediction_file + "-it-" + i);
                            }
                            else
                            {
                                KDDCup.PredictTrack2(recommender_validate, validation_candidates, prediction_file + "-validate-it-" + i);
                                KDDCup.PredictTrack2(recommender_final, test_candidates, prediction_file + "-it-" + i);
                            }
                        }
                    });
                    eval_time_stats.Add(time.TotalSeconds);

                    if (save_model_file != string.Empty)
                    {
                        Recommender.SaveModel(recommender_validate, save_model_file + "-validate", i);
                        if (prediction_file != string.Empty)
                        {
                            Recommender.SaveModel(recommender_final, save_model_file, i);
                        }
                    }

                    if (err_eval_stats.Last() > err_cutoff)
                    {
                        Console.Error.WriteLine("Reached cutoff after {0} iterations.", i);
                        break;
                    }

                    if (err_eval_stats.Last() > err_eval_stats.Min() + epsilon)
                    {
                        Console.Error.WriteLine(string.Format(CultureInfo.InvariantCulture, "Reached convergence (eps={0:0.######}) on training/validation data after {1} iterations.", epsilon, i));
                        break;
                    }

                    DisplayStats();
                }
            }             // for

            DisplayStats();
        }
        else
        {
            if (load_model_file == string.Empty)
            {
                seconds = Utils.MeasureTime(delegate() {                 // TODO parallelize
                    recommender_validate.Train();
                    if (prediction_file != string.Empty)
                    {
                        recommender_final.Train();
                    }
                });
                Console.Write(" training_time " + seconds + " ");
            }

            seconds = Utils.MeasureTime(delegate() {
                // evaluate
                double error = KDDCup.EvaluateTrack2(recommender_validate, validation_candidates, validation_hits);
                Console.Write(string.Format(CultureInfo.InvariantCulture, "ERR {0:0.######}", error));

                if (prediction_file != string.Empty)
                {
                    if (predict_score)
                    {
                        KDDCup.PredictScoresTrack2(recommender_validate, validation_candidates, prediction_file + "-validate");
                        KDDCup.PredictScoresTrack2(recommender_final, test_candidates, prediction_file);
                    }
                    else
                    {
                        KDDCup.PredictTrack2(recommender_validate, validation_candidates, prediction_file + "-validate");
                        KDDCup.PredictTrack2(recommender_final, test_candidates, prediction_file);
                    }
                }
            });
            Console.Write(" evaluation_time " + seconds + " ");

            if (save_model_file != string.Empty)
            {
                Recommender.SaveModel(recommender_validate, save_model_file + "-validate");
                if (prediction_file != string.Empty)
                {
                    Recommender.SaveModel(recommender_final, save_model_file);
                }
            }
        }

        Console.WriteLine();
    }