Машинное обучение — учебник по анализу настроений Microsoft код не работает

#.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#, кто увлекается своей системой машинного обучения, это в значительной степени убило бы их амбиции мгновенно. Разве они не проверяют свой код перед публикацией? Даже сейчас он не будет работать. Кстати, спасибо.