我正在尝试预测当客户提交支持票时,哪个部门应该接收这个新票。一个支持票通常包括以下内容:
Message
:票的实际消息Subject
:票的主题Header
:用于进一步描述问题的可选头部
到目前为止,票的分配是手动进行的,但我正在尝试创建一个模型来预测这个票应该分配到哪个部门。我的训练数据包含这三个变量以及部门名称
Support
Development
...
我的训练数据包含16.9万行,训练模型没有任何问题。我得到了一些相当不错的指标。问题出现在我尝试从某种票中进行预测时。预测结果不是部门名称,而是一个小数(2.5xx
)。我不确定问题出在哪里。我从微软的以下指南中获得了灵感:https://learn.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}
能有人解释一下发生了什么事吗,为什么我没有得到一个字符串值,而是得到了一个小数?
回答:
我找到了我的问题所在。
这与我的pipeline或我训练模型的方式无关,也不是我pipeline中的MapKeyToValue
方法的问题。我只是在我的数据集上出了问题。
我的CSV文件是用逗号分隔的,并且对字符串使用了引号,因为我的Message
属性是多行的。我没有尝试支持这种格式,而是更改了我的数据导出方式,删除了换行符,并且不再对字符串加引号。我还将分隔符从逗号改为制表符。
现在模型似乎工作正常,我得到了相当好的预测结果。