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