我试图预测每当客户写支持票时哪个部门应该收到新票。支持票将始终包含:
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
属性是多行。我没有尝试支持此操作,而是从数据中更改了导出内容以删除换行符,而不是引用字符串。我也改为了制表符分隔符,而不是逗号分隔符。
该模型现在似乎可以正常工作,并且我得到了很好的预测。