使用此功能,我将当前的ML.Net数据导出到CSV
using (var stream = File.Create("c:\\temp\\aidata.csv"))
mlContext.Data.SaveAsText(trainData, stream);
保存的数据看起来不错,但是当我尝试使用ML.Net Model Builder加载CSV时,出现此错误:
数据错误:无法推断所提供文件的列类型。
注意: 我在CSV中也有矢量列
CSV文件看起来像this(我已经删除了一些较小的列)。
如果我使用mlContext.Data.LoadFromTextFile(“ c:\ temp \ aidata.csv”)加载数据文件; 它会加载它而没有任何错误,但是Model Builder无法加载它。
答案 0 :(得分: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);
答案 1 :(得分:0)
正如@jdweng在评论中所说。您提供的文件的csv格式不正确(列和值用";"
分隔)。但是它看起来确实像tsv格式(列和值由制表符分隔)。
如果您尝试将文本另存为tsv文件,则应该可以使用。
此外,ML.Net视频示例使用的是tsv格式。