Многоступенчатые трубопроводы ML.NET - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь построить многоступенчатый конвейер классификации, используя ML.NET. Я использую версию 0.11.0. Примеры, приведенные в Поваренной книге ML.NET, отлично подходят для одноэтапных задач классификации / регрессии.

For eg: Input --> Transformations --> BinaryClassification

Я пытаюсь выполнить многоступенчатый конвейер классификации и сталкиваюсь с проблемами.

Мой сценарий:

Stage I pipeline: 
  Input --> Transformations --> PrimaryClassifier (BinaryClassification) --> PrimaryOutput

Stage II pipeline: 
  PrimaryOutput --> Transformations --> SecondaryClassifier (BinaryClassification) --> SecondaryOutput

Мои входные данные и первичные выходные классы определены как:

public class InputData
{
  [LoadColumn(0)]
  public string id;

  [LoadColumn(1) ColumnName("Label")]
  public bool Label;

  [LoadColumn(2,11), VectorType(10)]
  public float[] rawfeatures;
}

public class OutputData
{
  [ColumnName("PredictedLabel")]
  public bool PredictedLabel;
}

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

IDataView trainingDataView = Context.Data.LoadFromTextFile<InputData>(
                               path: Path + "\\" + fileName, 
                               hasHeader: true, 
                               separatorChar: ',');

Трубопровод I этапа определяется как:

var pipeline1 = Context.Transforms.Normalize(outputColumnName: "Features",
                      inputColumnName: "rawfeatures",
                      mode: NormalizingEstimator.NormalizerMode.MinMax)
                .AppendCacheCheckpoint(Context)
                .Append(Context.BinaryClassification.Trainers.FastTree(
                   labelColumnName: "Label", 
                   featureColumnName: "Features"))
                .Append(Context.Transforms.CopyColumns(
                   outputColumnName: "NormalizedFeatures", 
                   inputColumnName: "Features"));

Для конвейера Стадии II я бы хотел взять PredictedLabel из конвейера Стадии I и сравнить его с Меткой, чтобы вычислить столбец с именем «IsGood». Затем я хотел бы обучить вторичный классификатор «IsGood» в качестве метки и «Функции» в качестве столбца функций.

Q1: Каков наилучший способ вычисления столбца IsGood? CustomMapping - единственный способ или есть лучшая альтернатива?

Идея состоит в том, чтобы создать классификатор, который научится сегментировать входные данные на основе характеристик в «хороший» кластер и «плохой» кластер, а затем использовать отдельные пользовательские классификаторы для «хороших» и «плохих» кластеров.

Q2: Как мне это сделать с унифицированным конвейером I & II? Является ли мой единственный вариант копировать столбцы (метки и элементы для этапа II) в уникальные имена, а затем обучать их вторичным классификаторам?

...