示例#1
0
        public override void Train(Split split)
        {
            UpdateFeatureBuilder(split);

            Logger.Current.Info("Creating LibFm train and test files...");


            // infer dataType and add negative samples in case of posFeedback data
            IEnumerable <Feedback> negFeedback = Enumerable.Empty <Feedback>();

            if (split.Container.DataReaders.Select(dr => dr.DataType).Contains(IO.DataType.PosFeedback))
            {
                this.DataType = IO.DataType.PosFeedback;
                negFeedback   = split.SampleNegativeFeedback((int)(split.Train.Count()));
            }

            var train = split.Train.Concat(negFeedback).Shuffle().Select(f => FeatureBuilder.GetLibFmFeatureVector(f));
            var test  = split.Test.Select(f => FeatureBuilder.GetLibFmFeatureVector(f));

            string trainPath = "train.libfm";
            string testPath  = "test.libfm";

            File.WriteAllLines(trainPath, train);
            File.WriteAllLines(testPath, test);

            string args = LibFmArguments.Union(new string[] { "-train", trainPath, "-test", testPath, "-out", _outputPath })
                          .Aggregate((a, b) => a + " " + b);

            var libFm = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName               = SetupParameters["libFmPath"],
                    Arguments              = args,
                    UseShellExecute        = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError  = true,
                    CreateNoWindow         = true
                }
            };

            libFm.OutputDataReceived += OnLibFmOutput;

            Logger.Current.Info("Training and testing with LibFm...");
            Logger.Current.Info("Running process:\n {0} {1}", SetupParameters["libFmPath"], libFm.StartInfo.Arguments);

            PureTrainTime = (int)Wrap.MeasureTime(delegate()
            {
                libFm.Start();
                libFm.BeginOutputReadLine();
                libFm.WaitForExit();
            }).TotalMilliseconds;

            LoadFmModel();
            _minTarget = split.Container.MinTarget;
            _maxTarget = split.Container.MaxTarget;
        }
示例#2
0
        public override void Train(Split split)
        {
            UpdateFeatureBuilder(split);

            List <string> train = split.Train.Select(f => FeatureBuilder.GetLibFmFeatureVector(f)).ToList();

            _libFm.CreateTrainSet(train, split.Container.MinTarget, split.Container.MaxTarget,
                                  FeatureBuilder.GetNumMappedValues(), FeatureBuilder.Mapper.NumberOfEntities);

            Logger.Current.Trace("Training with LibFm recommender...");
            PureTrainTime = (int)Wrap.MeasureTime(delegate()
            {
                _libFm.Train();
            }).TotalMilliseconds;
        }
示例#3
0
 public override float Predict(Feedback feedback)
 {
     return(Predict(FeatureBuilder.GetLibFmFeatureVector(feedback)));
 }
示例#4
0
 public override float Predict(string userId, string itemId)
 {
     return(Predict(FeatureBuilder.GetLibFmFeatureVector(userId, itemId)));
 }