Accord.net 编纂无法处理非字符串



我正在尝试使用 Accord.net 库来构建库支持的几种机器学习算法的测试方法。

我遇到的问题之一是,当我尝试编纂字符串数据时,Cobification 类似乎无法处理任何不是字符串的数据表列,尽管文档另有说明。

Codification codebook = new Codification(fulldata, AllAttributeNames);

我调用该行,其中 fulldata 是一个数据表,并且我尝试包含 Int32 类型和 Double 类型的列,并且 Cobification 类抛出了一个错误,指出它无法将它们转换为 String 类型。

"System.InvalidCastException: '无法将类型'System.Double'的对象强制转换为类型'System.String'。

编辑:事实证明,此错误是因为编纂系统只有在对整个表进行编码时才能处理备用数据类型。我想我可以看到这里的逻辑,尽管我更喜欢更好的错误,或者该方法更聪明一点。

我现在出现了与此相关的另一个问题。 将我的代码更改为以下内容后:

Codification codebook = new Codification(fulldata);

然后我学习。学习(输入,输出(我的算法,并希望使用新训练的算法。 因此,下一步将是获取一堆测试数据,确保它与码本编码匹配,然后通过算法发送。 不幸的是,当我尝试使用

int[][] testinput = codebook.Transform(testData, inputColumnNameArray);

它爆炸了,声称它找不到要转换的映射。 它引用代码本未正确映射到新值的整数列时执行此操作。 所以现在看来这个 Transform 方法不能处理非字符串列,而且我还没有找到可以处理它的重载,即使文档表明它应该能够处理这个问题。

有谁知道如何解决这个问题,而无需手动构建整个 int[][] testinput 数组,一次一个值?

事实证明,我最终能够回答自己的问题。

据我所知,编纂类有两种使用它的方法。 采用列名列表的构造函数以及 Transform 方法都缺乏处理非字符串数据类型的智能,也许这些方法将来会消失。

仅获取数据表本身的构造函数以及 Apply 方法都能够处理字符串以外的数据类型。 一旦我改用这两种方法,我的错误就消失了。

Codification codebook = new Codification(fulldata);
int[][] testinput = codebook.Apply(testData, inputColumnNameArray);

对我来说,困惑在于所有示例代码似乎随机使用这两种方法,但仅在处理训练数据时使用 Apply 方法,并在编码测试数据时使用 Transform 方法。

我不确定他们为什么选择在文档示例代码中这样做,但我肯定花了很长时间才弄清楚发生了什么足以停止遇到这个特定问题。

最新更新