我试图预测每当客户写支持票时哪个部门应该收到新票。支持票将始终包括: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/