Encog查询分类

我正在尝试使用Encog处理这个数据集。为此,我将输出合并为一个(我似乎无法弄清楚如何使用多个预期输出,尽管我尝试过手动训练一个具有4个输出神经元的NN,但没有成功),使用的值为:“disease1”、“disease2”、“none”和“both”。

从那里开始,我在CSV中使用了分析师向导,自动过程训练了一个具有预期输出的NN。文件中的一个片段如下:

"field:1","field:2","field:3","field:4","field:5","field:6","field:7","Output:field:7"40.5,yes,yes,yes,yes,no,both,both41.2,no,yes,yes,no,yes,second,second

现在我的问题是:我该如何查询它?我尝试使用分类,但据我所知,结果只给我{0,1,2}的值,所以有两个类别我无法区分(两者都是0)。

这个问题同样适用于wiki中介绍的Iris示例。此外,Encog是如何从输出神经元值推断出0/1/2结果的?

编辑:我找到的解决方案是为disease 1和disease 2使用单独的网络,但我真的很想知道是否可以将它们合并为一个。


回答:

你说的对,你需要将输出列合并为一个值。Encog分析师只能对单个输出列进行分类。该输出列可以有许多不同的值。因此,将两个输出列标准化为none、first、second、both是可行的。如果你直接使用底层神经网络,你实际上可以训练两个输出,每个输出进行独立分类。但在本讨论中,我假设我们处理的是分析师。

你是使用工作台还是在代码中查询网络?默认情况下,Encog分析师使用等边编码对神经网络进行编码。这会导致输出神经元的数量等于n-1,其中n是类别的数量。如果你在分析师向导中选择了one-of-n编码,那么BasicNetwork上的常规分类方法将有效,因为它仅适用于one-of-n。

如果你想使用等边编码进行查询(在代码中),你可以使用类似于下面的方法。我将在Encog的下一个版本中添加这个功能。

/** * 用于对使用等边编码的神经网络进行分类。 * 这是Encog分析师的默认设置。等边编码使用输出数量等于类别数量减一。   * @param input 神经网络的输入。 * @param high 激活范围的高值,通常为1。 * @param low 归一化范围的低端,通常为-1或0。  * @return 输入所属的类别。 */public int classifyEquilateral(final MLData input,double high, double low) {    MLData result = this.compute(input);    Equilateral eq = new Equilateral(getOutputCount()+1,high,low);    return eq.decode(result.getData());}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注