【问题标题】:Accord.net Codification can't handle non-stringsAccord.net Codification 无法处理非字符串
【发布时间】:2020-02-13 12:16:48
【问题描述】:

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

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

Codification codebook = new Codification(fulldata, AllAttributeNames);

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

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

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

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

Codification codebook = new Codification(fulldata);

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

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

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

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

【问题讨论】:

    标签: accord.net


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2015-09-25
      • 2017-06-06
      • 2016-06-24
      • 1970-01-01
      • 2016-04-14
      • 2016-10-29
      • 2013-03-16
      相关资源
      最近更新 更多