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


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
}


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

最佳答案

我发现了我的问题。

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

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

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

关于machine-learning - Ml.NET-基于某些属性的起诉部门,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59642089/

10-12 21:17