Время прочтения: 5 мин.
Всем доброго времени суток!
Многие из нас так или иначе сталкиваются в работе с обращениями своих клиентов, будь это жалоба, заявка или просто отзыв. Во многих компаниях существуют определенные скрипты отработки таких обращений. Как правило, скрипты не могут в полной мере раскрыть потребность клиента и дать четкое определение характера обращения. Так же есть и человеческий фактор: оператор может просто неправильно классифицировать заявку клиента или неверно сформировать запрос.
Как вы думаете: возможно ли без участия оператора дать правильную оценку и установить характер запроса, основываясь только на текстовом обращении клиента? Это поможет исключить человеческий фактор, более точно понять потребность своего клиента, проанализировать места, требующие внимания и корректировки.
Для решения этой задачи мы применили метод машинного обучения, искусственный интеллект распознал текст и классифицировал информацию.
Например, мы знаем, что обращение «Не удается зарегистрироваться в личном кабинете» относится к категории «Личный кабинет клиента», так же, как и обращение «Не могу войти на сайт». Человек на основе своего опыта может явно отнести эти данные в одну категорию, и задача машинного обучения – предоставить роботу идентичный опыт, основываясь на котором он сможет определить категорию обращения.
Такой метод обучения называется обучение с учителем.
Попробуем применить этот метод на практике.
Воспользуемся для этого языком программирования c# и библиотекой машинного обучения ML.Net.
Библиотека ML.Net представляет алгоритмы машинного обучения для классификации, прогнозирования и анализа данных.
В нашем примере мы будем использовать алгоритм многоклассовой классификации, так как одно и то же обращение может принадлежать к разным продуктам.
Итак, мы имеем лог обращений клиентов:
Необходимо по этому логу определить, к какой категории относится обращение и проверить на корректность уже имеющуюся в логе категорию.
Для обучения и проверки модели, из этого списка набирается пул данных для обучения, и еще один пул для оценки точности модели.
Данные для этих пулов должны быть корректными, то есть категория обращения должна соответствовать самому обращению, например: «Уточнение расчетов процентов по кредитному договору» соответствует категории «Сопровождение по кредитным продуктам».
Сохраним эти данные в файлы TrainData.txt и TestData.txt и обьявим в программе пути до этих файлов:
var pathToTrainData = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data\\TrainData.txt");
var pathToTestData = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data\\TestData.txt");
Для обработки обращений и формирования на их основе прогнозов необходимо объявить классы для входных данных и прогнозов:
public class Appeal
{
[LoadColumn(0)]
public string ID { get; set; }
[LoadColumn(1)]
public string Category { get; set; }
[LoadColumn(2)]
public string Context { get; set; }
}
public class Prediction
{
[ColumnName(“PredictedLabel”)]
public string Category;
}
Теперь, когда у нас есть классы для входных данных, можно приступать к их загрузке и обработке.
ML.Net представляет инструмент для загрузки данных из разных источников, для простоты будем использовать текстовый файл:
trainData = _mlContext.Data.LoadFromTextFile<Appeal>(pathToTrainData, hasHeader: true);
var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Category", outputColumnName: "Label")
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Context", outputColumnName: "Features")) .AppendCacheCheckpoint(_mlContext);
Вышеприведенный код преобразует данные в столбцах Context и Description в формат, пригодный для использования в конвейере обработки. Колонка Category здесь является результатом, а колонка Context – признаками классификации.
Дальше можно перейти непосредственно к обучению робота по модели мульти-классовой классификации.
Соберем конвейер обучения с алгоритмом максимальной энтропии
var trainingPipeline = pipeline.Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
.Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
и обучим модель, передав в конвейер обучения данные:
model = trainingPipeline.Fit(trainData);
Следующим шагом необходимо оценить точность прогнозирования полученной модели.
Для оценки необходимо использовать еще один набор данных, отличный от обучающего набора. По этим данным автомат сделает прогноз, сверит его с реальными данными и определит точность прогнозирования:
var testData = _mlContext.Data.LoadFromTextFile<Appeal>(pathToTestData, hasHeader: true);
var testMetrics = _mlContext.MulticlassClassification.Evaluate(model.Transform(testData));
Если точность модели мала для корректной классификации обращений – необходимо увеличить количество тренировочных данных, если точность модели удовлетворительная – можно сохранять ее и использовать в задаче:
private static void SaveModelAsFile(MLContext mlContext, DataViewSchema trainingDataViewSchema, ITransformer model)
{
mlContext.Model.Save(model, trainingDataViewSchema, _modelPath);
}
public struct Result
{
public string Desc { get; set; }
public string Category { get; set; }
public string PredictedCategory { get; set; }
public bool isCorrect { get; set; }
}
public List<Result> CheckIssueCategory(string pathToData, string pathToSavedModel)
{
var data = _mlContext.Data.LoadFromTextFile<Appeal>(pathToData, hasHeader: true);
ITransformer loadedModel = _mlContext.Model.Load(pathToSavedModel, out var modelInputSchema);
_predEngine = _mlContext.Model.CreatePredictionEngine< Appeal, OutputPrediction>(loadedModel);
var result = new List<Result>();
foreach (var row in data)
{
var prediction = _predEngine.Predict(row.Description);
var foo = new Result { Desc = row.Description, Category = row.Category, PredictedCategory = prediction.Category, isCorrect = row.Category == prediction.Category ? true : false };
result.Add(foo);
}
return result;
}
В результате анализа, проведенного роботом, мы получили итоговую таблицу, содержащую описание и тип обращения, проставленный вручную и определенный искусственным интеллектом. Статистика показала, что из 10 000 проанализированных роботом обращений по 1 321 (14%) дана не корректная оценка, присвоена ошибочная категория и, как следствие, клиент не получил нужную услугу.
Кроме того, данный инструмент позволяет произвести более детальный анализ и классифицировать текстовые данные к более узкому направлению. Например, обращение клиента, связанное с «проглатыванием» пластиковой карты банкоматом и обращение, связанное с ошибочным начислением % по кредитной карте, оператор распределил в одну общую категорию «ПЛАСТИКОВЫЕ КАРТЫ», хотя по сути это абсолютно разная тематика. Наш робот помогает выявлять подобные случаи и производить более детальную классификацию, обрабатывая большое количество текстовых данных за очень короткий срок.
В данном случае мы применили метод машинного обучения для классификации обращений клиентов. Уверен, что данный метод может найти свое применение в разных сферах деятельности. Искусственный интеллект помогает нам исключать ошибки, которые может допустить человек, тем самым улучшить сервис, предоставляемый клиенту.
Спасибо за внимание!