Ml. NET - отдел педикторинга на основе определенных свойств - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь предсказать, какой отдел должен получить новый тикет, когда клиент пишет тикет в службу поддержки. Билет поддержки всегда будет состоять из:

  • Message: фактическое сообщение билета
  • Subject: тема билета
  • Header: и необязательный заголовок для дальнейшего описания проблемы

До сих пор назначение заявки выполнялось вручную, но я пытаюсь создать модель, которая может предсказать отдел, которому должна быть назначена заявка. , Мои данные обучения содержат эти три переменных, а также название отдела

  • Support
  • Development
  • ...

Мои тренировочные данные состоят из 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
}

Может кто-нибудь объяснить мне, что происходит, и почему я не получаю некоторое строковое значение обратно, а вместо этого получить десятичную дробь?

1 Ответ

1 голос
/ 09 января 2020

Я нашел свою проблему.

Это не имеет ничего общего с моим конвейером или способом обучения модели. Также это не проблема с методом MapKeyToValue в моем конвейере. У меня просто была проблема с моим набором данных.

Мой CSV был разделен запятой и использовал кавычки для строк, так как мое свойство Message было многострочным. Вместо того чтобы поддерживать это, я изменил свой экспорт из моих данных, чтобы удалить разрывы строк, а не заключать в кавычки строки. Я также перешел на разделитель табуляции вместо разделителя запятых.

Модель теперь работает, и я получаю довольно хороший прогноз.

...