机器学习 - Microsoft 情感分析教程代码不起作用

问题描述 投票:0回答:1

我目前正在使用 Microsoft 的这个情绪分析教程来测试我在机器学习方面的第一次尝试。

但这行是一个问题:

Evaluate(mlContext, model, splitDataView.TestSet);

或更具体地说:

splitDataView

有以下错误:

splitDataView 在当前上下文中不存在

这是完整的代码...(微软告诉我无论如何都要写)

    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 ===============");
    } 

由于它是直接来自微软的,我不认为这是他们的错。我在这里做错了什么吗?我已经阅读了十多次说明,对我来说,我完美地复制了他们的示例?

.net-core ml.net
1个回答
0
投票

我刚刚完成本教程:它对我有用,您是否使用此行定义了 splitDataView -> TrainTestData splitDataView = LoadData(mlContext);

© www.soinside.com 2019 - 2024. All rights reserved.