Ml.NET – 根据特定属性预测部门

我正在尝试预测当客户提交支持票时,哪个部门应该接收这个新票。一个支持票通常包括以下内容:

  • 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属性是多行的。我没有尝试支持这种格式,而是更改了我的数据导出方式,删除了换行符,并且不再对字符串加引号。我还将分隔符从逗号改为制表符。

现在模型似乎工作正常,我得到了相当好的预测结果。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注