【发布时间】:2013-02-03 16:18:11
【问题描述】:
大多数机器学习分类器在遇到没有以前见过的特征的实例时,会将示例与训练数据中最常见的类进行分类。
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。这是为什么呢?
【问题讨论】:
-
这取决于分隔线的设置位置,您可以添加模型的学习参数吗?我相信它在 1/1 和 2/1 之间,因此 2/1 以上的所有内容都将归类为 1,所有内容都归类为 0。
-
只是猜测:是的,您的假设是正确的,它应该分配具有最高存在的类。问题是算法如何处理看不见的特征:a)代码中可能存在错误(看不见的分配给第一类),或b)求解器被定义为以这种方式进行(出于某种理论原因)。我会检查求解器应该如何工作,或者我会在其他一些软件(R、Weka、...)中尝试相同的 ML 算法
-
似乎未指定的特征值默认为零。因此,您的测试实例在分类器中显示为
(0,0)。如果不使用偏差,则分隔线穿过该点,因此两个输出同样可能(无论训练集如何)。毕竟,我看不出这样的测试有什么意义。如果您的数据中有缺失值,则在使用 SVM 时将它们设置为零(隐式)可能不是最佳策略。尝试找到一些可以解决缺失数据的学习算法。 -
您对分隔线的分析是正确的,但并不是我的数据中缺少值 - 只是我在训练期间看到的所有二进制特征的值都是 0。
标签: java machine-learning classification libsvm