将自定义列添加到ML.NET中的IDataView

时间:2019-06-25 20:41:43

标签: c# ml.net

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

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

2 个答案:

答案 0 :(得分:0)

有一种方法可以使用CustomMapping

创建自定义转换

这是我用于this answer的示例。

输入和输出类:

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}");
}

答案 1 :(得分:0)

简单的事情。我假设您知道如何使用管道。

这是我的项目的一部分,在这里我将两列合并在一起:

IEstimator<ITransformer> pipeline = mlContext.Transforms.CustomMapping(mapping, contractName: null)
                            .Append(mlContext.Transforms.Text.FeaturizeText(inputColumnName: "question1", outputColumnName: "question1Featurized"))
                            .Append(mlContext.Transforms.Text.FeaturizeText(inputColumnName: "question2", outputColumnName: "question2Featurized"))
                            .Append(mlContext.Transforms.Concatenate("Features", "question1Featurized", "question2Featurized"))
                            //.Append(mlContext.Transforms.NormalizeMinMax("Features"))
                            //.AppendCacheCheckpoint(mlContext)
                            .Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: nameof(customTransform.Label), featureColumnName: "Features"));

如您所见,两列question1Featurizedquestion2Featurized被合并到Features中,这将被创建并可用作IDataView的任何其他列。 Features列不需要在单独的类中声明。

因此,在您的情况下,应将列fir转换为其数据类型,如果字符串可以执行我的操作,并且在使用数值的情况下,请使用custom Transformer/customMapping

Concatenate函数的文档可能也有帮助!