Кодирует ли ML.NET CategoryOneHotVectorizer данные тестирования? - PullRequest
0 голосов
/ 12 октября 2018

Я не уверен, как работает ML.NET CategoryorOneHotVectorizer, из их примера кода,

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

смотрит на меня, как только мы вызываем model = pipeline.Train () для обучения модели, это делаеткодирование только по категориальным входным данным.Так что, если мои тестовые данные имеют некоторые значения, которых нет во входных данных, это испортит результат предсказания?

Обычно на Python я обучил бы OneHotEncoder как для обучения, так и для тестирования данных, прежде чем использовать его для кодирования категориальных переменных.,Не уверен, как это сделать с ML.NET

1 Ответ

0 голосов
/ 12 октября 2018

Вы не должны использовать свои данные тестирования для обучения вашей модели.Это ошибкаВсе интегрированные среды машинного обучения с горячим кодированием по умолчанию закодируют невидимую категорию как все нули.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], поскольку категория никогда не была замечена.

...