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

Accord.net Codification can't handle non-strings

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

我 运行 遇到的一个问题是,当我尝试编码我的字符串数据时,编码 class 似乎无法处理任何数据table不是字符串的列,尽管文档另有说明。

Codification codebook = new Codification(fulldata, AllAttributeNames);

我调用 fulldata 是数据的那一行table,我尝试包括 Int32 类型和 Double 类型的列,并且 Codification class 抛出了一个错误,说它无法将它们转换为 String 类型。

"System.InvalidCastException: 'Unable to cast object of type 'System.Double' to type 'System.String'.'"

编辑:事实证明,这个错误是因为编码系统在编码整个 table 时只能处理替代数据类型。我想我可以看到这里的逻辑,尽管我更喜欢更好的错误,或者该方法更聪明一些。

我现在遇到了另一个与此相关的问题。将我的代码更改为:

Codification codebook = new Codification(fulldata);

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

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

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

有谁知道如何在不手动构建整个 int[][] testinput 数组的情况下一次一个值地解决这个问题?

原来我最终能够回答我自己的问题。

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

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

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

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

我不确定他们为什么选择在文档示例代码中执行此操作,但我确实花了很长时间才弄清楚发生了什么足以阻止这个特定问题。