【问题标题】:Batch Predictions in ML.NET with a MultiClass Classification Algorithm使用多类分类算法在 ML.NET 中进行批量预测
【发布时间】:2019-12-20 21:25:12
【问题描述】:

我正在尝试将Binary Classification 中所示的批量预测应用于Multi Class Classification 中的示例

在 google 和 Microsoft 工作中展示的许多示例都显示了一个预测,以展示经过训练的模型的能力。

但是,我希望通过批量预测 a) 多手动输入和 b) 使用没有标签的文件来证明训练模型的有效性。

我遵循Binary Classification 示例并尝试将其映射到Multi Class Classification 示例,但是没有显示预测。

以下是多类分类示例中所示的单个预测

// Single Prediction

ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);

GitHubIssue singleIssue = new GitHubIssue() { Title = "Entity Framework crashes", Description = "When connecting to the database, EF is crashing" }; // Our single issue
_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(loadedModel);
var singleprediction = _predEngine.Predict(singleIssue);
Console.WriteLine($"=============== Single Prediction - Result: {singleprediction.Area} ===============");

以下是二元分类示例中所示的批量预测,但在该场景中不起作用。

// Batch Predictions from Enumerable
ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);
IDataView batchIssues = _mlContext.Data.LoadFromEnumerable(issues);
IDataView predictions = loadedModel.Transform(batchIssues);

IEnumerable<GitHubIssue> predictedResults = _mlContext.Data.CreateEnumerable<GitHubIssue>(predictions, reuseRowObject: false);

foreach (GitHubIssue prediction in predictedResults)
{
Console.WriteLine($"Title: {prediction.Title} | Prediction: {prediction.Area}");
}

根据单一预测,我得到以下结果:

area-System.Data

虽然批处理不能预测输出,但我认为它不是预测的,但是阅读Microsofts ML.NET 网站上的材料,它说转换将使用模型对一批数据进行预测.

“使用模型使用Transform()方法预测评论数据情绪”

问题 1) 我不确定,我在批量预测中缺少什么,可枚举以获取 prediction.area 的预测,如单个值所示。

问题 2)我将如何调整可枚举以加载到未标记信息的文件中以进行预测。

【问题讨论】:

    标签: c# .net machine-learning ml.net


    【解决方案1】:

    请注意:其中的所有代码都放在 MultiClass Classification 示例的 PredictIssues 方法中。

    问题 1 的答案

    调整代码以利用 predEngine,然后在 foreach 中的单个预测上使用 predict 函数。 为此需要进行两项更改:

    var batchPrediction = _predEngine;
    
    Console.WriteLine($"Prediction: {batchPrediction.Predict(prediction).Area}"); 
    

    另外,我删除了以下行:

    IDataView predictions = loadedModel.Transform(batchIssues);
    

    删除此功能对预测结果没有影响。 似乎有效的完整代码如下:

    IEnumerable<GitHubIssue> issues = new[]
    {
        new GitHubIssue
        {
             Title = "Entity Framework crashes",
             Description = "When connecting to the database, EF is crashing"
        },
        new GitHubIssue
        {
             Title = "Github Down",
             Description = "When going to the website, github says it is down"
        }
    
    };
    
    var batchPrediction = _predEngine;
    
    // Batch Predictions from Enumerable
    IDataView batchIssues = _mlContext.Data.LoadFromEnumerable(issues);
    
    
    IEnumerable<GitHubIssue> predictedResults = _mlContext.Data.CreateEnumerable<GitHubIssue>(batchIssues, reuseRowObject: false);
    
    foreach (GitHubIssue prediction in predictedResults)
    {
            Console.WriteLine($"Title: {prediction.Title} | Prediction: {batchPrediction.Predict(prediction).Area}");
    }
    

    问题 2 的答案

    我创建了一个包含 ID、区域(留空)、标题和描述的新文件,并镜像了测试和训练数据文件。

    我在全局作用域(就在命名空间下面)添加了两个变量,如下所示:

    private static string _myTestDataPath => Path.Combine(_appPath, "..", "..", "..", "Data", "myTestData.tsv");
    private static IDataView _myTestDataView;
    

    我没有创建IEnumerable,而是直接将文件传入,如下:

    _myTestDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_myTestDataPath, hasHeader: true);
    

    以下是该方法的完整示例:

    ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);
    _predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(loadedModel);
    _myTestDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_myTestDataPath, hasHeader: true);
    IDataView predictions = loadedModel.Transform(_myTestDataView);
    var batchPrediction = _predEngine;
    IEnumerable<GitHubIssue> predictedResults =
        _mlContext.Data.CreateEnumerable<GitHubIssue>(predictions, reuseRowObject: false);
    
    foreach (GitHubIssue prediction in predictedResults)
    {
        Console.WriteLine($"Title: {prediction.Title} | Prediction: {batchPrediction.Predict(prediction).Area}");
    }
    

    附带说明,将 batchPredictions 与 singlePredictions 进行比较,您必须将 .Area 包含在输出末尾,如最后一行所示

    // Manual Batch Predictions
    Console.WriteLine($"Title: {prediction.Title} | Prediction: {batchPrediction.Predict(prediction).Area}");
    
    // File-based Batch Predictions
    Console.WriteLine($"Title: {prediction.Title} | Prediction: {batchPrediction.Predict(prediction).Area}");
    

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2023-03-18
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多