Я новичок в машинном обучении, но у меня есть опыт в 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; }
}
}