如何在 IDataView 中查看数据

How to view data inside IDataView

ML.net中,我想查看IDataView中的数据来验证是否加载了正确的数据。我看不到任何 visualizer/debugging 工具来查看它们,就像我们在 System.Data.DataTable 中查看 table

var mlContext = new MLContext();
IDataView trainData = mlContext.Data.LoadFromTextFile<TaxiTrip>(GetAbsolutePath("../../taxi-fare-test.csv"), hasHeader: true);

IDataView 有一个 Preview 方法。您可以 运行 变量中的该方法并通过那里进行调试以查看数据。

var preview = trainData.Preview();

我真正想要的是查看表格格式的数据。为了实现这一点,我为下面的 IDataView 对象编写了一个扩展方法,它将数据转换为 DataTable

分机

public static class DataViewHelper
{
    public static DataTable ToDataTable(this IDataView dataView)
    {
        DataTable dt = null;
        if (dataView != null)
        {
            dt = new DataTable();
            var preview = dataView.Preview();
            dt.Columns.AddRange(preview.Schema.Select(x => new DataColumn(x.Name)).ToArray());
            foreach (var row in preview.RowView)
            {
                var r = dt.NewRow();
                foreach (var col in row.Values)
                {
                    r[col.Key] = col.Value;
                }
                dt.Rows.Add(r);

            }
        }
        return dt;
    }
}

用法

var table= dataView.ToDataTable();

如果您现在调试变量 table,您可以使用 visual studio 的内置 DataTable Visualizer 查看数据

剪断,

public static void LogDataView(IDataView dataView)
{
    var preview = dataView.Preview();
    foreach (var col in preview.Schema) {
        if (col.Name == "Features") {
            continue;
        }
        Console.Write(col.Name + "\t");
    }
    foreach (var row in preview.RowView) {
        Console.WriteLine();
        foreach (var col in row.Values) {
            if (col.Key == "Features") {
                continue;
            }
            Console.Write($"{col.Value}\t");
        }
    }
    Console.WriteLine("\nCount: {0}\n", preview.RowView.Length);
}

跳过Features因为它是矢量,不可打印