/// <summary>Evaluate on the folds of a dataset split</summary>
/// <param name="recommender">a rating predictor</param>
/// <param name="split">a rating dataset split</param>
/// <param name="show_results">set to true to print results to STDERR</param>
/// <returns>a dictionary containing the average results over the different folds of the split</returns>
public static Dictionary<string, double> EvaluateOnSplit(RatingPredictor recommender, ISplit<IRatings> split, bool show_results)
{
var avg_results = new Dictionary<string, double>();
foreach (var key in Measures)
avg_results[key] = 0;
for (int i = 0; i < split.NumberOfFolds; i++)
{
var split_recommender = (RatingPredictor) recommender.Clone(); // to avoid changes in recommender
split_recommender.Ratings = split.Train[i];
split_recommender.Train();
var fold_results = Evaluate(split_recommender, split.Test[i]);
foreach (var key in fold_results.Keys)
avg_results[key] += fold_results[key];
if (show_results)
Console.Error.WriteLine("fold {0}, RMSE {1,0:0.#####}, MAE {2,0:0.#####}", i, fold_results["RMSE"].ToString(CultureInfo.InvariantCulture), fold_results["MAE"].ToString(CultureInfo.InvariantCulture));
}
foreach (var key in avg_results.Keys.ToList())
avg_results[key] /= split.NumberOfFolds;
return avg_results;
}