Укажите столбцы как функцию и метку в нескольких моделях комбинированной регрессии (ML.NET) - PullRequest
0 голосов
/ 14 октября 2019

Я использую ML.NET для прогнозирования серии значений с использованием регрессионной модели. Меня интересует только один прогнозируемый столбец (столбец оценки). Однако значения некоторых других столбцов недоступны для класса прогнозирования. Я не могу оставить их в 0, так как это нарушило бы прогноз, поэтому я предполагаю, что их также нужно будет прогнозировать.

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

Вот пример кода, который можно попытаться объяснить в коде:

public class FooInput
{
    public float Feature1 { get; set; }
    public float Feature2 { get; set; }
    public float Bar {get; set; }
    public float Baz {get; set; }
}

public class FooPrediction : FooInput
{
    public float BarPrediction { get; set; }
    public float BazPrediction { get; set; }
}

public ITransformer Train(IEnumerable<FooInput> data)
{
    var mlContext = new MLContext(0);
    var trainTestData = mlContext.Data.TrainTestSplit(mlContext.Data.LoadFromEnumerable(data));

    var pipelineBar = mlContext.Transforms.CopyColumns("Label", "Bar")
        .Append(mlContext.Transforms.CopyColumns("Score", "BarPrediction"))
        .Append(mlContext.Transforms.Concatenate("Features", "Feature1", "Feature2", "Baz"))
        .Append(mlContext.Regression.Trainers.FastTree());

    var pipelineBaz = mlContext.Transforms.CopyColumns("Label", "Baz")
        .Append(mlContext.Transforms.CopyColumns("Score", "BazPrediction"))
        .Append(mlContext.Transforms.Concatenate("Features", "Feature1", "Feature2", "Bar"))
        .Append(mlContext.Regression.Trainers.FastTree());

    return pipelineBar.Append(pipelineBaz).Fit(trainTestData.TestSet);
}

По сути, это то же самое, что и вышеупомянутый ответ, но с добавлением Baz в качестве признака для модели, где прогнозируется Bar, и наоборот, с добавлением Bar в качестве признака для модели, где Baz должно быть предсказано.

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

1 Ответ

1 голос
/ 24 октября 2019

Одна техника, которую вы можете использовать, называется «Импутация», которая заменяет эти неизвестные значения на некоторые «угаданные» значения. Импутация - это просто процесс подстановки пропущенных значений нашего набора данных.

В ML.NET вам нужно преобразование ReplaceMissingValues. Вы можете найти samples на docs.microsoft.com.

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

...