Yihantime 2023-09-28 11:18 采纳率: 87.5%
浏览 25
已结题

使用opencvSharp复现随机森林

使用VS2022复现随机森林时

var trainData = TrainData.LoadFromCSV(filename,headerLineCount);  //读取CSV文件,并切割最后一列
trainData.ShuffleTrainTest();     // 打乱数据集
trainData.SetTrainTestSplitRatio(0.7,true);  //拆分

语句报错,错误为“TrainData”不包含“LoadFromCSV”、“ShuffleTrainTest”、“SetTrainTestSplitRatio”语句,而随机森林训练语句

var rf = RTrees.Create();
rf.TermCriteria = new TermCriteria(CriteriaTypes.MaxIter,100,1e-6);
rf.MaxDepth = 10;
rf.MinSampleCount = 2;
rf.RegressionAccuracy = 0.01f;
rf.UseSurrogates = false;
rf.ActiveVarCount = false;
rf.Train(trainData);

中最后一句中的trainData参数必须为TrainData类型,求能替代读取CSV文件并打乱数据集和拆分语句的代码。

  • 写回答

13条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-09-28 11:25
    关注

    该回复引自强大而免费的微信小程序:皆我百晓生。


    要使用OpenCvSharp复现随机森林,您可以按照以下步骤进行操作:

    1. 使用C#中的System.IO命名空间中的StreamReader类读取CSV文件的内容,并将其存储在适当的数据结构中,例如List<List>。以下是一个示例代码片段:
    List<List<string>> data = new List<List<string>>();
    
    using (StreamReader reader = new StreamReader(filename))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            List<string> row = line.Split(',').ToList();
            data.Add(row);
        }
    }
    
    1. 使用C#中的Random类打乱数据集。以下是一个示例代码片段:
    Random random = new Random();
    List<List<string>> shuffledData = data.OrderBy(x => random.Next()).ToList();
    
    1. 使用C#中的LINQ查询从打乱后的数据集中拆分训练集和测试集。以下是一个示例代码片段:
    int trainDataCount = (int)(shuffledData.Count * 0.7);
    List<List<string>> trainData = shuffledData.Take(trainDataCount).ToList();
    List<List<string>> testData = shuffledData.Skip(trainDataCount).ToList();
    
    1. 使用OpenCvSharp的RTrees类进行随机森林训练。以下是一个示例代码片段:
    var rf = RTrees.Create();
    rf.TermCriteria = new TermCriteria(CriteriaTypes.MaxIter, 100, 1e-6);
    rf.MaxDepth = 10;
    rf.MinSampleCount = 2;
    rf.RegressionAccuracy = 0.01f;
    rf.UseSurrogates = false;
    rf.ActiveVarCount = false;
    
    Mat trainDataMat = new Mat(trainData.Count, trainData[0].Count, MatType.CV_32F);
    for (int i = 0; i < trainData.Count; i++)
    {
        for (int j = 0; j < trainData[i].Count; j++)
        {
            float value;
            bool parseResult = float.TryParse(trainData[i][j], out value);
            if (parseResult)
                trainDataMat.Set<float>(i, j, value);
        }
    }
    
    Mat trainLabelsMat = new Mat(trainData.Count, 1, MatType.CV_32S, Scalar.All(0));
    rf.Train(trainDataMat, SampleTypes.RowSample, trainLabelsMat);
    

    请注意,这只是一个简单示例,您需要根据您的具体情况进行适当的修改和调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 10月13日
  • 已采纳回答 10月5日
  • 修改了问题 9月28日
  • 创建了问题 9月28日