如何将带有数据的string [] []转换为IDataView-Object? (ML.NET)

时间:2019-09-05 17:23:25

标签: c# .net ml.net

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

到目前为止,我一直使用外部文本或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:'拆分器/合并器工作程序   消费源数据时遇到异常”

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

1 个答案:

答案 0 :(得分:0)

它与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的帮助。