Как вернуть преобразованные данные из конвейера ML.Net до применения предиктора - PullRequest
0 голосов
/ 21 сентября 2018

Вот создание объекта конвейера ML.Net, скопированного из примера TaxiFarePrediction.

        LearningPipeline pipeline = new LearningPipeline
        {
            new TextLoader(TrainDataPath).CreateFrom<TaxiTrip>(separator:','),
            new ColumnCopier(("FareAmount", "Label")),
            new CategoricalOneHotVectorizer("VendorId","RateCode","PaymentType"),
            new ColumnConcatenator("Features","VendorId","RateCode","PassengerCount","TripDistance","PaymentType"),
            new FastTreeRegressor()
        };

По сути, я хотел бы вернуть данные после того, как ColumnCopier, CategoryoricalOneHotVectorizer и ColumnConcatenator былиприменяется.

1 Ответ

0 голосов
/ 25 сентября 2018

Для визуализации в отладчике запрограммированный Microsoft класс

LearningPipelineDebugProxy

Этот класс имеет два весьма информативных поля: строки и столбцы.И, конечно, класс, предназначенный для отладки, создать не очень просто, поскольку он внутренне запечатан:

namespace Microsoft.ML
{
  /// <summary>
  /// The debug proxy class for a LearningPipeline.
  /// Displays the current columns and values in the debugger Watch window.
  /// </summary>
  internal sealed class LearningPipelineDebugProxy
  {

в соответствии с исходным кодом.В таких случаях, если визуализации отладчика недостаточно, я использую рефлексию.Чтобы создать экземпляр LearningPipelineDebugProxy в экземпляре TaxiTrip, я использовал следующие приемы:

  1. Создание экземпляра LearningPipelineDebugProxy с помощью метода CreateInstance
  2. Добавлен метод, который посредством отражения получает необходимое поле.

В коде этот фрагмент выглядел следующим образом:

    public static PredictionModel<TaxiTrip, TaxiTripFarePrediction> Train()
    {
        var pipeline = new LearningPipeline();
        pipeline.Add(new TextLoader(_datapath).CreateFrom<TaxiTrip>(useHeader: true, separator: ','));


        Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).
            Where(t => String.Equals(t.Name, "LearningPipelineDebugProxy", StringComparison.Ordinal)).First();


        var instObject = Activator.CreateInstance(obj, new []{pipeline});

        pipeline.Add(new ColumnCopier(("FareAmount", "Label")));
        pipeline.Add(new CategoricalOneHotVectorizer("VendorId", "RateCode", "PaymentType"));
        pipeline.Add(new ColumnConcatenator("Features", "VendorId", "RateCode", "PassengerCount", "TripDistance", "PaymentType"));

        var rws = GetPropValue(instObject, "Rows");
        var clms = GetPropValue(instObject, "Columns");

        pipeline.Add(new FastTreeRegressor());

        PredictionModel<TaxiTrip, TaxiTripFarePrediction> model = pipeline.Train<TaxiTrip, TaxiTripFarePrediction>();
        return model;
    }

    public static object GetPropValue(object src, string propName)
    {
        return src.GetType().GetProperty(propName).GetValue(src, null);
    }

В окне отладчика, а не только в отладчике Строки становятся доступными:

rows in ML Net

...