大多数机器学习分类器在遇到没有以前见过的特征的实例时,会将示例与训练数据中最常见的类进行分类。
liblinear-java似乎不是这种情况,我想知道为什么会这样。这是一些示例代码,我在其中构建了一个示例问题,其中有两个特征,并且训练数据的0
标签是1
标签的 4 倍:
Problem problem = new Problem();
problem.l = 5;
problem.n = 2;
problem.x = new FeatureNode[][] {
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(2, 1) },
};
problem.y = new int[] {0, 0, 0, 0, 1};
Parameter parameter = new Parameter(SolverType.L2R_L2LOSS_SVC, 1.0, 0.01);
Model model = Linear.train(problem, parameter);
3
现在让我们在一个不在训练数据中的新特征上进行测试。由于经过训练的模型对特征一无所知3
,我原以为预测的类将是0
训练数据中最常见的类。
FeatureNode[] instance = new FeatureNode[] { new FeatureNode(3, 1) };
int prediction = Linear.predict(model, instance);
System.err.println(prediction);
然而,最后一行打印出来1
。这是为什么?