Я пытаюсь предсказать, какой отдел должен получить новый тикет, когда клиент пишет тикет в службу поддержки. Билет поддержки всегда будет состоять из:
Message
: фактическое сообщение билета Subject
: тема билета Header
: и необязательный заголовок для дальнейшего описания проблемы
До сих пор назначение заявки выполнялось вручную, но я пытаюсь создать модель, которая может предсказать отдел, которому должна быть назначена заявка. , Мои данные обучения содержат эти три переменных, а также название отдела
Мои тренировочные данные состоят из 169 тыс. Строк, и нет проблем с обучением модели вообще. Я получаю довольно аккуратные метрики. Проблема возникает, когда я пытаюсь предсказать какой-то билет. Вместо того, чтобы получить название отдела, я получаю десятичное число (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
}
Может кто-нибудь объяснить мне, что происходит, и почему я не получаю некоторое строковое значение обратно, а вместо этого получить десятичную дробь?