0

我使用此功能将当前的 ML.Net 数据导出到 CSV

using (var stream = File.Create("c:\\temp\\aidata.csv"))
             mlContext.Data.SaveAsText(trainData, stream);          

保存的数据看起来不错,但是当我尝试使用ML.Net 模型生成器加载 CSV 时,我收到此错误:

数据错误:无法推断所提供文件的列类型。

注意:我在 CSV 中也有向量列

CSV 文件看起来像这样(我删除了一些更小的列)。

如果我使用 mlContext.Data.LoadFromTextFile("c:\temp\aidata.csv"); 加载数据文件 它加载它没有任何错误,但模型生成器无法加载它。

4

2 回答 2

1

事实上,文件不能.csv仅仅因为它是用扩展名保存的。它需要这样的转换:

static class MLCsvHelper
{
    private class ColumnDefinition
    {
        private readonly int end;

        public string Name { get; }
        public int Start { get; }
        public int Count { get; }

        public ColumnDefinition(string name, int start, int count) =>
            (Name, Start, Count, end) = (name, start, count, start + count - 1);

        public override string ToString() =>
            $"{Name}:\"{Start}:{end}\"";
    }

    public static void Patch(string file, out string csv)
    {
        csv = Path.ChangeExtension(file, "patched.csv");
        var lines = File.ReadAllLines(file);

        var columns = lines.TakeWhile(line => line.Contains("#@"))
            .Where(line => line.Contains("col=")).Select(line => GetColumn(line))
            .ToArray();

        var data = lines.SkipWhile(line => line.Contains("#@")).Skip(1)
            .Select(line => line.Split('\t')).ToArray();

        var res = new[] { string.Join("\t", columns.Select(column => column.Name)) }
            .Concat(data.Select(item => string.Join("\t", columns.Select(column => GetValue(column, item)))));

        File.WriteAllLines(csv, res.ToArray());
    }

    private static ColumnDefinition GetColumn(string line)
    {
        var items = line.Split(new[] { '=', ':' });
        var name = items[1];
        var range = items.Last().Split('-');
        var start = int.Parse(range.First());
        var last = int.Parse(range.Last());
        var count = last - start + 1;
        return new ColumnDefinition(name, start, count);
    }

    private static string GetValue(ColumnDefinition column, string[] data)
    {
        var chunk = data.Skip(column.Start).Take(column.Count);
        var value = string.Join("\t", chunk);
        if (chunk.Skip(1).Any())
            value = $"\"{value}\"";
        return value;
    }
}

MLCsvHelper.Patch("zvVEYT", out var csv);

于 2019-08-16T16:31:32.540 回答
0

正如@jdweng 在评论中所说。您提供的文件不是正确的 csv 格式(列和值用 分隔";")。然而,它确实看起来像 tsv 格式(列和值由制表符分隔)。

如果您尝试将文本保存为 tsv 文件,它应该可以工作。

此外,ML.Net 视频示例使用 tsv 格式。

于 2019-08-12T09:30:54.007 回答