- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::ml::RTrees 是 OpenCV 机器学习模块中的一部分,用于实现随机森林(Random Forests)算法。随机森林是一种集成学习方法,它通过构建多个决策树并将它们的结果进行汇总来提高预测准确性和控制过拟合。
主要特点
- 分类与回归:既可以用于分类任务也可以用于回归任务。
- 高准确性:由于其集成的特性,通常能够提供比单个决策树更高的预测准确性。
- 抗过拟合能力强:通过随机选择特征和样本,随机森林能有效减少过拟合的风险。
- 易于使用:相对简单易用,且不需要太多的参数调整即可获得良好的性能。
常用成员函数
以下是一些常用的 cv::ml::RTrees 类成员函数:
- 创建模型实例
- Ptr create():创建一个新的 RTrees 模型实例。
- 设置模型参数
- setTermCriteria(TermCriteria val):设置终止条件(例如最大迭代次数或最小误差变化量)。
- setMaxDepth(int val):设置每棵树的最大深度。
- setMinSampleCount(int val):设置分裂节点所需的最小样本数。
- setRegressionAccuracy(float val):设置回归模式下的精度要求。
- setUseSurrogates(bool val):设置是否使用代理分裂规则处理缺失值。
- setPriors(Mat val):设置先验概率。
- setCalculateVarImportance(bool val):设置是否计算变量重要性。
- setActiveVarCount(int val):设置每棵树在每个节点上考虑的特征数量。
训练模型
- train(const Ptr& trainData, int flags=0):使用提供的训练数据进行训练。
- train(InputArray samples, int layout, InputArray responses):另一种形式的训练函数,直接接受样本和响应矩阵作为输入。
预测
- predict(InputArray samples, OutputArray results=noArray(), int flags=0) const:对新样本进行预测,并返回每个样本的类别标签或预测值(取决于标志)。
保存与加载模型
- save(const String& filename):将模型保存到文件。
- load(const String& filename):从文件加载模型。
代码示例
#include <iostream>
#include <opencv2/ml.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::ml;
using namespace std;int main()
{// 准备训练数据Mat samples = ( Mat_< float >( 4, 2 ) << 0.5, 1.0, 1.0, 1.5, 2.0, 0.5, 1.5, 0.0 );Mat responses = ( Mat_< int >( 4, 1 ) << 0, 0, 1, 1 );// 确保数据和标签是正确的类型if ( samples.type() != CV_32F ){samples.convertTo( samples, CV_32F );}if ( responses.type() != CV_32S ){ // 对于分类任务,标签通常是整数类型responses.convertTo( responses, CV_32S );}// 创建并配置 RTrees 模型Ptr< RTrees > rf_model = RTrees::create();rf_model->setMaxDepth( 10 ); // 设置每棵树的最大深度rf_model->setMinSampleCount( 2 ); // 设置分裂节点所需的最小样本数TermCriteria criteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 100, 0.01 );rf_model->setTermCriteria( criteria ); // 设置终止条件// 使用TrainData创建训练数据对象Ptr< TrainData > trainData = TrainData::create( samples, ROW_SAMPLE, responses );// 训练模型bool ok = rf_model->train( trainData );if ( ok ){// 保存模型rf_model->save( "rf_model.yml" );// 对新样本进行预测Mat sample = ( Mat_< float >( 1, 2 ) << 1.6, 0.7 );float response = rf_model->predict( sample );cout << "The predicted response for the sample is: " << response << endl;}else{cerr << "Training failed!" << endl;}return 0;
}
运行结果
The predicted response for the sample is: 1