Ml.NET - 根据某些属性预测部门
Ml.NET - Pedicting department based on certain properties
我正在尝试预测每当客户写支持票时哪个部门应该收到新票。支持票将始终包括:
Message
: 工单的实际消息
Subject
: 工单主题
Header
:和可选的 header 以进一步描述问题
到目前为止,工单的分配是手动的,但我正在尝试创建一个模型来预测该工单应分配给的部门。我的训练数据包含这三个变量以及部门名称
Support
Development
...
我的训练数据由 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
属性 是多行的。我没有尝试支持这一点,而是更改了我的数据导出以删除换行符,而不是引用字符串。我还更改为制表符分隔符而不是逗号分隔符。
该模型现在似乎有效,而且我得到了一个很好的预测。
我正在尝试预测每当客户写支持票时哪个部门应该收到新票。支持票将始终包括:
Message
: 工单的实际消息Subject
: 工单主题Header
:和可选的 header 以进一步描述问题
到目前为止,工单的分配是手动的,但我正在尝试创建一个模型来预测该工单应分配给的部门。我的训练数据包含这三个变量以及部门名称
Support
Development
...
我的训练数据由 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
属性 是多行的。我没有尝试支持这一点,而是更改了我的数据导出以删除换行符,而不是引用字符串。我还更改为制表符分隔符而不是逗号分隔符。
该模型现在似乎有效,而且我得到了一个很好的预测。