簡體   English   中英

將自定義列添加到 ML.NET 中的 IDataView

[英]Add custom column to IDataView in ML.NET

從文件加載IDataView后,我想添加一個自定義列。 在每一行中,列值應該是前 2 個值的總和。 一種斐波那契數列。

我想創建一個自定義轉換器,但我找不到可以幫助我理解如何進行的東西。 我還嘗試克隆 ML.Net Git 存儲庫以查看其他轉換器是如何實現的,但我看到許多類被標記為內部類,因此我無法在我的項目中重新使用它們。

有一種方法可以使用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}");
}

容易的事。 我假設您知道如何使用管道。

這是我項目的一部分,我將兩列合並在一起:

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 ,這些Features將被創建並可用作IDataView任何其他列。 Features列不需要在單獨的類中聲明。

因此,在您的情況下,您應該先將列轉換為它們的數據類型,如果字符串可以執行我所做的操作,並且在數字值的情況下使用自定義 Transformer/customMapping

Concatenate函數的文檔也可能有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM