Encog C#,来自 CSV 的 VersatileMLDataSet,如何获取原始数据?

Encog C#, VersatileMLDataSet from CSV, how to get original data?

我想使用 Encog 库中的 CSV reader,如下所示:

    var format = new CSVFormat('.', ' ');
    IVersatileDataSource source = new CSVDataSource(filename, false, format);
    var data = new VersatileMLDataSet(source);

是否可以从变量data中获取原始数据?在将它用于神经网络之前,我必须在 dataGridView 中向用户显示 CSV 中的记录。我也希望能够修改原始数据。根据 documentation 有 属性 Data,但它对我不起作用。如果我尝试这样的事情:

data.Data[1][1] 

我得到空指针异常。在归一化之前使用数据还有另一个问题。我想通过以下方式获取记录数:

data.GetRecordCount()

但是我得到错误你必须在使用数据集之前对其进行标准化。所以即使我还没有使用数据我也必须对其进行标准化?如果这是真的,那么最好使用我自己的 CSV reader 然后从内存中将其加载到 encog 中,对吗?

所以我刚刚在 GitHub 上查看了 Encog 源代码。值得庆幸的是,您的问题定义明确且范围狭窄,因此我可以提供答案。很遗憾,您可能不会喜欢它。

基本上,当您将 IVersatileDataSource 传入 VersatileMLDataSet 的构造函数时,它会被放入一个名为 _source 的 private readonly 字段中。 _source 没有抽象,因此您无法从 VersatileMLDataSet 外部访问它。

数据属性确实只会在规范化过程中填充。 CSVDataSource 中似乎也没有任何字段 public 对您有任何价值(同样,都是私有的)。

如果您只想查看单列数据,您可以留在 Encog 中查看 Encog.Util.NetworkUtil.QuickCSVUtils。此 class 中有一些方法可以帮助您获取文件并快速获取单列数据。

如果您想从 Encog 中的文件中获取完整的 CSV 数据,您可以使用 Encog.Util.CSV.ReadCSV class 来获取数据。这是您的代码在实例化 QuickCSVUtils 时无论如何使用的底层实现。您必须围绕 ReadCSV 提供一些包装器逻辑,类似于 QuickCSVUtils。如果您走这条路,我建议您查看 class 以了解其如何使用 ReadCSV。基本上 ReadCSV 一次读取一行。

但是,如果您确实需要从 VersatileMLDataSet class 中读取 RAW csv 数据,最好的办法是在派生自 VersatileMLDataSet 的自定义 class 中提供您自己的实现。

阅读文件后需要执行几个步骤:

  1. 您必须定义列类型
  2. 分析数据
  3. 地图输出
  4. 设置规范化策略
  5. 获取您的数据计数
  6. 可选择克隆 data.Data 以保留原件

下面的代码带有适当的注释。

var filename = @"iris.data.csv";
var format = new CSVFormat('.', ',');
IVersatileDataSource source = new CSVDataSource(filename, false, CSVFormat.DecimalPoint);
var data = new VersatileMLDataSet(source);

// Define columns to read data in.
data.DefineSourceColumn("Col1", 0, ColumnType.Continuous);
data.DefineSourceColumn("Col2", 1, ColumnType.Continuous);
data.DefineSourceColumn("Col3", 2, ColumnType.Continuous);
data.DefineSourceColumn("Col4", 3, ColumnType.Continuous);

ColumnDefinition outputColumn = data.DefineSourceColumn("Col5", 4, ColumnType.Nominal);

// Analyze data
data.Analyze();

// Output mapping
data.DefineSingleOutputOthersInput(outputColumn);

// Set normalization strategy
data.NormHelper.NormStrategy = new BasicNormalizationStrategy(-1, 1, -1, 1);
data.Normalize();

// Get count
var count = data.GetRecordCount();

// Clone to get original data
var oiginalData = data.Data.Clone();

有关详细信息,请查看 quickstart paper

我使用的示例数据来自here