【问题标题】:How to convert a string[][] with data into an IDataView-Object? (ML.NET)如何将带有数据的 string[][] 转换为 IDataView-Object? (ML.NET)
【发布时间】:2019-09-05 17:23:25
【问题描述】:

我实际上完成了所有 Microsoft ML.NET 教程,现在想构建自己的模型。我想将string[][] data 转换为IDataView-Object,因为我想在 ML.NET-Model 中使用它进行二进制分类。

到目前为止,我一直使用来自外部文本或 CSV 文件的数据进行培训。现在我想使用存储在string[][] data 中的数据。 data[0][] 中是文本值,data[1][] 中是 boolean 值。

我无法将现有的嵌套数组转换为IDataView object。我已经尝试使用以下代码:

 public class BinaryData
        {

            public string Text { get; set; }


            public bool Label { get; set; }
        }

// The data is collected from an Excel-Table with some functions and saved in this nested array: 

string[][] data = form.GetDataSelection().GetDataContainer().textCols;



BinaryData[] inMemoryCollection = new BinaryData[data[0].Length];
            for (int i = 0; i < data[0].Length-1; i++)
            {

                inMemoryCollection[i] = new BinaryData
                {
                    Text = data[0][i],
                    Label = Convert.ToBoolean(Convert.ToInt64(data[1][i]))
                };                             
            } 


IDataView dataView = mlContext.Data.LoadFromEnumerable<BinaryData>(inMemoryCollection);

我的实现基于tutorial from Microsoft

在我想使用 Fit()-Method 之前它一直有效。我收到以下错误消息:

System.InvalidOperationException: '拆分器/合并器工作者 使用源数据时遇到异常'

我希望有人可以在这里帮助我。非常感谢!

【问题讨论】:

  • 您使用的是锯齿状数组 [][]。也许尝试一个二维数组 [,]。如果这不起作用并且您没有得到好的答案,请回复此评论,我会看看今晚是否可以挖掘。
  • 嘿,埃里克,非常感谢您的帮助!它工作正常。当我正在为一个大学项目编辑 Excel-AddIn 时,我首先使用一种方法将给定的锯齿状数组转换为二维数组,然后使用 for 循环将其转换为我的 inMemoryCollection
  • 您为什么不将其发布为您自己问题的答案,展示您如何进行转换?问题的未来访问者更有可能看到答案而不是评论。

标签: c# .net ml.net


【解决方案1】:

它适用于two-dimensional array [,]。我使用Method from this post jagged array [][] 转换为二维数组并稍微更改了我的代码:

string[][] data_jagged = form.GetDataSelection().GetDataContainer().textCols;
string[,] data = To2D(data_jagged);

BinaryData[] inMemoryCollection = new BinaryData[data_jagged[0].Length];
            for (int i = 0; i < data_jagged[0].Length; i++)
            {

                inMemoryCollection[i] = new BinaryData
                {
                    Text = data[0,i],
                    Label = Convert.ToBoolean(Convert.ToInt64(data[1,i]))
                };                             
            } 


IDataView dataView = mlContext.Data.LoadFromEnumerable<BinaryData>(inMemoryCollection);

感谢 Eric 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2013-06-16
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多