【问题标题】:Does ML.NET CategoricalOneHotVectorizer encode testing data as well?ML.NET CategoricalOneHotVectorizer 是否也对测试数据进行编码?
【发布时间】:2018-10-12 15:24:41
【问题描述】:

我不确定 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 做到这一点

【问题讨论】:

    标签: c# machine-learning ml.net


    【解决方案1】:

    您不应该使用您的测试数据来训练您的模型。这是一个错误。默认情况下,所有一个热编码机器学习框架都会将一个看不见的类别编码为所有空值。 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] 编码的,因为从未见过该类别。

    【讨论】:

    • 在 ML.NET 中,如果测试或实际分类值在训练期间没有出现,我们将如何解决它被视为 null 的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多