ML.NET CategoricalOneHotVectorizer是否也编码测试数据?

时间:2018-10-11 23:21:41

标签: c# machine-learning ml.net

根据他们的示例代码,我不确定ML.NET CategoricalOneHotVectorizer的工作方式

var pipeline = new LearningPipeline
{
    // ... extra code ...
    new CategoricalOneHotVectorizer("VendorId", "RateCode", "PaymentType"),
    // ... extra code ...
    new FastTreeRegressor()
};

在我看来,一旦我们调用model = pipeline.Train()来训练模型,它只会对分类输入数据进行编码。因此,如果我的测试数据中包含一些未包含在输入中的值,会不会破坏预测结果?

通常在Python上,我会先使用训练和测试数据来训练OneHotEncoder,然后再使用它来编码分类变量。不确定如何使用ML.NET

1 个答案:

答案 0 :(得分:3)

您不应使用测试数据来训练模型。那是一个错误。默认情况下,所有一个热门编码机器学习框架都将一个看不见的类别编码为所有null。 ML.NET v0.7将执行以下操作:

public static void TryOneHot()
{
  var data = Enumerable.Range(1, 4).Select(i => new { A = $"{i}", B = $"{i}" });
  var trainData = data.Take(3).ToArray();
  var testData = data.Skip(3).ToArray();
  using (var env = new ConsoleEnvironment(seed: 1, conc: 1))
  {
    var dataView = env.CreateDataView(trainData).AssertStatic(env, c => (A: c.Text.Scalar, B: c.Text.Scalar));
    var encoderPipe = dataView.MakeNewEstimator()
      .Append(row => (
        A_OH: row.A.OneHotEncoding(),
        B_OH: row.B.OneHotEncoding()
      ));
    var encoder = encoderPipe.Fit(dataView);

    var encodedTrainingData = encoder.AsDynamic.Transform(env.CreateDataView(trainData));
    var raw = encodedTrainingData.GetColumn<float[]>(env, "A_OH").ToArray();

    var encodedTestData = encoder.AsDynamic.Transform(env.CreateDataView(testData));
    var rawUnseen = encodedTestData.GetColumn<float[]>(env, "A_OH").ToArray();
  }
}

如果您检查rawUnseen,您会发现它将被[0, 0, 0]编码,因为从未见过该类别。