Ml.NET-基于某些属性的起诉部门

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

我试图预测每当客户写支持票时哪个部门应该收到新票。支持票将始终包含:

  • Message:票证的实际信息
  • [Subject:票证的主题
  • [Header:和进一步说明问题的可选标头]

直到现在,故障单的分配都是手动的,但是我正在尝试创建一个模型来预测该故障单应分配到的部门。我的训练数据包含这三个变量以及部门名称

  • Support
  • Development
  • ...

我的训练数据包括16.9万行,根本没有训练模型的问题。我得到一些非常整洁的指标。问题出在我尝试从某种票证中进行预测时。我没有得到部门名称,而是得到了十进制(2.5xx)。我不确定这哪里出错了。我从Microsoft的以下指南中汲取了灵感:https://docs.microsoft.com/en-us/dotnet/machine-learning/tutorials/github-issue-classification

正在加载训练数据

var dataView = mlContext.Data.LoadFromTextFile<Message>(dataPath, hasHeader: true, allowQuoting: true);

建立和训练模型

var pipeline = mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Name", outputColumnName: "Label") // Department name
    .Append(mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Message", outputColumnName: "MessageFeaturized"))
    .Append(mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Subject", outputColumnName: "SubjectFeaturized"))
    .Append(mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Header", outputColumnName: "HeaderFeaturized"))
    .Append(mlContext.Transforms.Concatenate(
        "Features",
        "MessageFeaturized",
        "SubjectFeaturized",
        "HeaderFeaturized"))
    .AppendCacheCheckpoint(mlContext)
    .Append(mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
    .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

var model = pipeline.Fit(dataView);

预测部门名称

var predictionEngine = mlContext.Model.CreatePredictionEngine<Message, PredictedDepartment>(model);

var message = new Message()
{
       Message = @"...", // removed for brevity
       Subject = "Other questions",
       Header = "Internet connection"
};

var prediction = predictionEngine.Predict(message);
Console.WriteLine($"Prediction result: {prediction.Name}"); // Department name

结果

预测结果:2.581

使用的型号

class Message
{
    [LoadColumn(2)]
    public string Message { get; set; }

    [LoadColumn(0)]
    public string Subject { get; set; }

    [LoadColumn(1)]
    public string Header { get; set; }

    [LoadColumn(3)]
    public string Name { get; set; } // Department name
}

class PredictedDepartment
{
    [ColumnName("PredictedLabel")]
    public string Name { get; set; } // Department name
}

有人可以解释我发生了什么,为什么我没有得到一些字符串值,而是得到了一些小数?

machine-learning .net-core ml.net
1个回答
1
投票

我找到了我的问题。

与我的管道或模型训练的方式无关。我的管道中的MapKeyToValue方法也不是问题。我的数据集只是个问题。

我的CSV用逗号分隔,并用引号引起来,因为我的Message属性是多行。我没有尝试支持此操作,而是从数据中更改了导出内容以删除换行符,而不是引用字符串。我也改为了制表符分隔符,而不是逗号分隔符。

该模型现在似乎可以正常工作,并且我得到了很好的预测。

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