我正在尝试使用ML.NET建立多阶段分类管道。我正在使用版本0.11.0。 ML.NET Cookbook中给出的示例可以很好地用于单阶段分类/回归任务。
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: ',');
第一阶段的管道定义为:
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"));
对于Stage II管道,我想从Stage I管道中获取PredictedLabel并将其与Label进行比较,以计算出名为“ IsGood”的列。然后,我想在“ IsGood”作为标签,在“ Features”作为功能列上训练辅助分类器。
Q1:计算“ IsGood”列的最佳方法是什么?是CustomMapping唯一的方法还是有更好的选择?
这个想法是建立一个分类器,该分类器学习将基于特征的输入划分为“好”集群和“坏”集群,然后对“好”和“坏”集群使用单独的自定义分类器。
Q2:如何使用统一的I&II阶段管道做到这一点?我唯一的选择是将列(阶段II的标签和功能)复制为唯一的名称,然后在其上训练二级分类器吗?