首页 > 解决方案 > 在 ML.NET 中向 IDataView 添加自定义列

问题描述

我想在加载我IDataView的文件后添加一个自定义列。在每一行中,列值应该是前 2 个值的总和。一种斐波那契数列。

我想创建一个自定义转换器,但我找不到可以帮助我理解如何进行的东西。我还尝试克隆 ML.Net Git 存储库,以查看其他转换器是如何实现的,但我看到许多类被标记为内部,因此我无法在我的项目中重复使用它们。

标签: c#ml.net

解决方案


有一种方法可以使用CustomMapping创建自定义转换

这是我用于此答案的示例。

输入和输出类:

class InputData
{
    public int Age { get; set; }
}

class CustomMappingOutput
{
    public string AgeName { get; set; }
}

class TransformedData
{
    public int Age { get; set; }

    public string AgeName { get; set; }
}

然后,在 ML.NET 程序中:

MLContext mlContext = new MLContext();

var samples = new List<InputData>
{
    new InputData { Age = 16 },
    new InputData { Age = 35 },
    new InputData { Age = 60 },
    new InputData { Age = 28 },
};

var data = mlContext.Data.LoadFromEnumerable(samples);

Action<InputData, CustomMappingOutput> mapping =
    (input, output) =>
    {
        if (input.Age < 18)
        {
            output.AgeName = "Child";
        }
        else if (input.Age < 55)
        {
            output.AgeName = "Man";
        }
        else
        {
            output.AgeName = "Grandpa";
        }
    };

var pipeline = mlContext.Transforms.CustomMapping(mapping, contractName: null);

var transformer = pipeline.Fit(data);
var transformedData = transformer.Transform(data);

var dataEnumerable = mlContext.Data.CreateEnumerable<TransformedData>(transformedData, reuseRowObject: true);

foreach (var row in dataEnumerable)
{
    Console.WriteLine($"{row.Age}\t {row.AgeName}");
}

推荐阅读