在 C# 中将数据集拆分为 train/test/valid

Dataset splitting as train/test/valid at C#

我有一个数据为 Dictionary<string,List<string>>Key 个词典包括 class_nameValue 个词典包括 个图像 。毕竟,我在我的本地电脑上生成了这个字典作为数据集。但是,我必须在 C# 代码中拆分 train(%80)/test(%10)/valid(%10) 中的所有数据。例如,我选择了 90 张图片,我有 3 张 class,每个 class 有 30 张图片。拆分后,Train set class 必须有24张图片,test and val sets 3张图片一张一张。我该怎么做,有人帮忙吗?我分享一个png帮助理解。enter image description here

我没有完全理解你的结构,但假设你的词典有 90 个词条

var train = new List<KeyValuePair<string,List<string>>>();
var test = new List<KeyValuePair<string,List<string>>>();
var valid = new List<KeyValuePair<string,List<string>>>();

int i = 0;
foreach(var kvp in dictionary90){
  var x = i++ % 10;
  if(x<8)
    train.Add(kvp);
  else if(x<9)
    test.Add(kvp);
  else
    valid.Add(kvp);
}

它会将您的词典条目分散到列表中 8:1:1 的比例

这个函数会将你的字典分成3份。你可以通过改变循环条件来修改它。如果 List 的计数大于 1(因为使用 Math.Ceiling 函数)

,它将起作用
(Dictionary<string, List<string>> trainData, Dictionary<string, List<string>> testData, Dictionary<string, List<string>> validData) SplitData(Dictionary<string, List<string>> data)
{
    var random = new Random();

    var train = new Dictionary<string, List<string>>();
    var test = new Dictionary<string, List<string>>();
    var valid = new Dictionary<string, List<string>>();

    foreach (KeyValuePair<string, List<string>> dataClass in data)
    {
        train[dataClass.Key] = dataClass.Value.ToList();
        test[dataClass.Key] = new List<string>();
        valid[dataClass.Key] = new List<string>();

        for (int i = 0; i < Math.Ceiling(0.1 * dataClass.Value.Count); i++)
        {
            int idx = random.Next(train[dataClass.Key].Count);
            test[dataClass.Key].Add(train[dataClass.Key][idx]);
            train[dataClass.Key].RemoveAt(idx);
        }

        for (int i = 0; i < Math.Ceiling(0.1 * dataClass.Value.Count); i++)
        {
            int idx = random.Next(train[dataClass.Key].Count);
            valid[dataClass.Key].Add(train[dataClass.Key][idx]);
            train[dataClass.Key].RemoveAt(idx);
        }
    }

    return (train, test, valid);
}