Как добавить вычисляемый столбец в IDataView, а затем включить в качестве функции - PullRequest
0 голосов
/ 15 июня 2019

У меня есть некоторые данные в CSV-файле:

Survived    Pclass  Sex Age
0           3   male    22
1           1   female  38
1           3   male    26
1           1   female  35
...

Я загрузил данные, используя:

context.Data.LoadFromTextFile(path: dataPath,...);

После загрузки данных мне нужночтобы добавить вычисляемый столбец, скажем, AgeName, чтобы:

if (Age < 18)
    AgeName ="Child"
else if(Age < 55)
    AgeNAme = "Man"
else
    AgeNAme = "Grandpa"

Есть ли встроенный метод в ML.NET для добавления столбца, или мне нужно реализовать его вручную?

1 Ответ

0 голосов
/ 15 июня 2019

Думаю, вы захотите использовать преобразование 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}");
}
...