Я пытаюсь построить многоступенчатый конвейер классификации, используя 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) в уникальные имена, а затем обучать их вторичным классификаторам?