#.net-core #ml.net
Вопрос:
В настоящее время я тестирую свою первую попытку машинного обучения, используя этот учебник по анализу настроений от Microsoft.
Однако эта строка является проблемой:
Evaluate(mlContext, model, splitDataView.TestSet);
Или более конкретно:
splitDataView
В котором есть следующая ошибка:
splitDataView не существует в текущем контексте
Это полный код… (так как Microsoft все равно велела мне написать)
static void Main(string[] args)
{
MLContext mlContext = new MLContext();
TrainTestData splitDataView = LoadData(mlContext);
ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
}
public static ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet)
{
var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText)).Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
return model;
}
public static TrainTestData LoadData(MLContext mlContext)
{
IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
return splitDataView;
}
public static void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet)
{
Evaluate(mlContext, model, splitDataView.TestSet);
Console.WriteLine("=============== Evaluating Model accuracy with Test data===============");
IDataView predictions = model.Transform(splitTestSet);
CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Console.WriteLine();
Console.WriteLine("Model quality metrics evaluation");
Console.WriteLine("--------------------------------");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
Console.WriteLine($"F1Score: {metrics.F1Score:P2}");
Console.WriteLine("=============== End of model evaluation ===============");
}
private static void UseModelWithSingleItem(MLContext mlContext, ITransformer model)
{
UseModelWithSingleItem(mlContext, model);
PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
SentimentData sampleStatement = new SentimentData
{
SentimentText = "This was a very bad steak"
};
var resultPrediction = predictionFunction.Predict(sampleStatement);
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of model with a single sample and test dataset ===============");
Console.WriteLine();
Console.WriteLine($"Sentiment: {resultPrediction.SentimentText} | Prediction: {(Convert.ToBoolean(resultPrediction.Prediction) ? "Positive" : "Negative")} | Probability: {resultPrediction.Probability} ");
Console.WriteLine("=============== End of Predictions ===============");
Console.WriteLine();
}
public static void UseModelWithBatchItems(MLContext mlContext, ITransformer model)
{
UseModelWithBatchItems(mlContext, model);
IEnumerable<SentimentData> sentiments = new[]
{
new SentimentData
{
SentimentText = "This was a horrible meal"
},
new SentimentData
{
SentimentText = "I love this spaghetti."
}
};
IDataView batchComments = mlContext.Data.LoadFromEnumerable(sentiments);
IDataView predictions = model.Transform(batchComments);
// Use model to predict whether comment data is Positive (1) or Negative (0).
IEnumerable<SentimentPrediction> predictedResults = mlContext.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false);
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
foreach (SentimentPrediction prediction in predictedResults)
{
Console.WriteLine($"Sentiment: {prediction.SentimentText} | Prediction: {(Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative")} | Probability: {prediction.Probability} ");
}
Console.WriteLine("=============== End of predictions ===============");
}
Поскольку это напрямую от Microsoft, я не думаю, что это их вина. Я что-то здесь делаю не так? Я прочитал инструкции более десяти раз, и для меня я идеально копирую их пример?
Комментарии:
1. Используйте правильный параметр из вашего ввода, это
splitTestSet
😉2. @DaMachk, да… проанализировав код, как если бы он был моим собственным, в отличие от микрософтов, я зафиксировал это. Для кого — то с нулевым опытом работы на C#, кто увлекается своей системой машинного обучения, это в значительной степени убило бы их амбиции мгновенно. Разве они не проверяют свой код перед публикацией? Даже сейчас он не будет работать. Кстати, спасибо.