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

时间:2019-10-16 16:38:39

标签: accord.net

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

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

Codification codebook = new Codification(fulldata, AllAttributeNames);

我在那行中将fulldata用作数据表,并尝试同时包含Int32类型和Double类型的列,并且Codification类抛出错误,表明无法将其转换为String类型。

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

EDIT:事实证明,此错误是因为Codification系统仅在编码整个表时才可以处理其他数据类型。我想我可以在这里看到逻辑,尽管我希望有一个更好的错误,或者该方法更聪明。

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

Codification codebook = new Codification(fulldata);

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

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

它爆炸,声称找不到要转换的映射。它是参考Integer列执行此操作的,而Codebook正确地未将其映射到新值。因此,现在看来,这种Transform方法不能处理非字符串列,而且即使documentation表示它应该能够处理此问题,我也没有发现它可以重载。

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

1 个答案:

答案 0 :(得分:1)

结果证明我最终能够回答自己的问题。

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

仅接受数据表本身的构造函数以及Apply方法都能够处理字符串以外的数据类型。切换到这两种方法后,我的错误就消失了。

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

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

我不确定他们为什么选择在文档示例代码中执行此操作,但是肯定花了我很长时间才能弄清楚发生了什么情况才能停止出现此特定问题。