Ml.NET - 根据某些属性预测部门

Ml.NET - Pedicting department based on certain properties

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

到目前为止,工单的分配是手动的,但我正在尝试创建一个模型来预测该工单应分配给的部门。我的训练数据包含这三个变量以及部门名称

我的训练数据由 169k 行组成,训练模型完全没有问题。我得到了一些非常简洁的指标。当我尝试从某种票据中进行预测时,问题就来了。我得到的不是部门名称,而是小数点 (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

结果

Prediction result: 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 属性 是多行的。我没有尝试支持这一点,而是更改了我的数据导出以删除换行符,而不是引用字符串。我还更改为制表符分隔符而不是逗号分隔符。

该模型现在似乎有效,而且我得到了一个很好的预测。