Проблема классификации элементов с использованием ML.net с Наивным Байесом

avatar
Qiang Liu
9 августа 2021 в 01:09
121
0
1

Я новичок в машинном обучении и ML.NET. Я хочу решить задачу по идентификации столбцов Excel.

Столбцы в Excel, такие как 序号, 编号, 编码, 名称, 项目名称, и для каждого столбца есть соответствующее имя поля, как показано ниже: <414602>>229688

Column_Field.csv

Столбец ИмяПоля
序号 КодЗаказа
编号 КодЗаказа
编码 КодЗаказа
名称 Имя
项目名称 Имя

Каждое поле может иметь одно или несколько имен столбцов, например 序号, 编号, 编码 для OrdCode. И задача состоит в том, чтобы попытаться идентифицировать или найти соответствующее имя поля для входящего столбца.

Основываясь на приведенном выше наборе данных, я использую ML.NET и хочу предсказать правильное поле для столбцов, считываемых из файла Excel.

Я использую алгоритм наивного Байеса. Код:

public class Program
{
    private static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "Column_Field.csv");

    private static void Main(string[] args)
    {
        MLContext mlContext = new MLContext();

        IDataView dataView = mlContext.Data.LoadFromTextFile<ColumnInfo>(_dataPath, hasHeader: true, separatorChar: '\t');

        var pipeline = mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Label", outputColumnName: "Label")
            .Append(mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: "Column"))
            .Append(mlContext.MulticlassClassification.Trainers.NaiveBayes())
            .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

        var model = pipeline.Fit(dataView);

        // evaluate
        //List<ColumnInfo> dataForEvaluation = new List<ColumnInfo>()
        //{
        //    new ColumnInfo{ Column="名称", FieldName="Name" },
        //    new ColumnInfo{ Column="<名称>", FieldName="Name" },
        //    new ColumnInfo{ Column="序号", FieldName="OrdName" },
        //};

        //IDataView testDataSet = mlContext.Data.LoadFromEnumerable(dataForEvaluation);
        //var metrics = mlContext.MulticlassClassification.Evaluate(testDataSet);

        //Console.WriteLine($"MicroAccuracy: {metrics.MicroAccuracy:P2}");
        //Console.WriteLine($"MicroAccuracy: {metrics.MicroAccuracy:P2}");

        // predict
        var dataForPredictation = new List<ColumnInfo>();

        dataForPredictation.Add(new ColumnInfo { Column = "名称" });
        dataForPredictation.Add(new ColumnInfo { Column = "ABC" });
        dataForPredictation.Add(new ColumnInfo { Column = "名" });

        var engine = mlContext.Model.CreatePredictionEngine<ColumnInfo, Predication>(model);

        foreach (var data in dataForPredictation)
        {
            var result = engine.Predict(data);
            Console.WriteLine($"{data.Column}: \t{result.FieldName}");
        }

        Console.ReadLine();
    }
}

public class ColumnInfo
{
    [LoadColumn(0)]
    public string Column { get; set; }

    [LoadColumn(1), ColumnName("Label")]
    public string FieldName { get; set; }
}

public class Predication
{
    [ColumnName("PredictedLabel")]
    public string FieldName { get; set; }
}

Однако результат не такой, как ожидалось.

Результат:

名称:   OrdCode
ABC:    OrdCode
名:     OrdCode

Так что не так с кодом? Я предполагаю, что проблема может заключаться в отсутствии правильной обработки данных в pipeline перед тренировкой.

Спасибо.

Источник

Ответы (0)