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; }
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; }
public override float Predict(Feedback feedback) { return(Predict(FeatureBuilder.GetLibFmFeatureVector(feedback))); }
public override float Predict(string userId, string itemId) { return(Predict(FeatureBuilder.GetLibFmFeatureVector(userId, itemId))); }