[源码笔记] OpenCV 2.3 :: Random Trees(一)

OpenCV2.3中Random Trees(R.T.)的继承结构


API

CvRTParams


定义R.T.训练用参数,CvDTreeParams的扩展子类,但并不用到CvDTreeParams(单一决策树)所需的所有参数。比如说,R.T.通常不需要剪枝,因此剪枝参数就不被用到。
_maxdepth
单棵树所可能达到的最大深度
_min_samplecount 树节点持续分裂的最小样本数量,也就是说,小于这个数节点就不持续分裂,变成叶子了
_regressionaccuracy 回归树的终止条件,如果所有节点的精度都达到要求就停止
_usesurrogates 是否使用代理分裂。通常都是false,在有缺损数据或计算变量重要性的场合为true,比如,变量是色彩,而图片中有一部分区域因为光照是全黑的
_maxcategories 将所有可能取值聚类到有限类,以保证计算速度。树会以次优分裂(suboptimal split)的形式生长。只对2种取值以上的树有意义
priors 优先级设置,设定某些你尤其关心的类或值,使训练过程更关注它们的分类或回归精度。通常不设置
_calc_varimportance 设置是否需要获取变量的重要值,一般设置true
_nactivevars 树的每个节点随机选择变量的数量,根据这些变量寻找最佳分裂。如果设置0值,则自动取变量总和的平方根
_max_num_of_trees_in_theforest R.T.中可能存在的树的最大数量
_forestaccuracy 准确率(作为终止条件)
termcrit_type 终止条件设置
CV_TERMCRIT_ITER 以树的数目为终止条件,max_num_of_trees_in_the_forest生效
CV_TERMCRIT_EPS 以准确率为终止条件,forest_accuracy生效
CV_TERMCRIT_ITER | CV_TERMCRIT_EPS 两者同时作为终止条件

CvRTrees::train

训练R.T.
return bool 训练是否成功
_train_data _训练数据:样本(一个样本由固定数量的多个变量定义),以Mat的形式存储,以列或行排列,必须是CV_32FC1格式
tflag trainData的排列结构
CV_ROW_SAMPLE 行排列
CV_COL_SAMPLE 列排列
responses 训练数据:样本的值(输出),以一维Mat的形式存储,对应trainData,必须是CV_32FC1或CV_32SC1格式。对于分类问题,responses是类标签;对于回归问题,responses是需要逼近的函数取值
_varidx 定义感兴趣的变量,变量中的某些,传null表示全部
_sampleidx 定义感兴趣的样本,样本中的某些,传null表示全部
_vartype 定义responses的类型
CV_VAR_CATEGORICAL 分类标签
CV_VAR_ORDEREDCV_VAR_NUMERICAL)数值,用于回归问题
_missingmask 定义缺失数据,和traindata一样大的8位Mat params _ CvRTParams定义的训练参数


CvRTrees::train

训练R.T.(简短版的train函数)
return bool 训练是否成功
data 训练数据:CvMLData格式,可从外部.csv格式的文件读入,内部以Mat形式存储,也是类似的value / responses / missing mask。
_params _CvRTParams定义的训练参数


CvRTrees:predict

对一组输入样本进行预测(分类或回归)
return double 预测结果
sample 输入样本,格式同CvRTrees::train的train_data
_missingmask 定义缺失数据





Example:





1. #include <cv.h>
2. #include <stdio.h>
3. #include <highgui.h>
4. #include <ml.h>
5. #include <map>
6.7. void print_result(float train_err, float test_err,
8. const CvMat _var_imp)
9. {
10. printf( “train error %f\n”, train_err );
11. printf( “test error %f\n\n”, test_err );
12.13. if (_var_imp)
14. {
15. cv::Mat var_imp(_var_imp), sorted_idx;
16. cv::sortIdx(var_imp, sorted_idx, CV_SORT_EVERY_ROW +
17. CV_SORT_DESCENDING);
18.19. printf( “variable importance:\n” );
20. int i, n = (int)var_imp.total();
21. int type = var_imp.type();
22. CV_Assert(type == CV_32F || type == CV_64F);
23.24. for( i = 0; i < n; i++)
25. {
26. int k = sorted_idx.at<int>(i);
27. printf( “%d\t%f\n”, k, type == CV_32F ?
28. var_imp.at<float>(k) :
29. var_imp.at<double>(k));
30. }
31. }
32. printf(“\n”);
33. }
34.35. int main()
36. {
37. const char
filename = “data.xml”;
38. int response_idx = 0;
39.40. CvMLData data;
41. data.read_csv( filename ); // read data
42. data.set_response_idx( response_idx ); // set response index
43. data.change_var_type( response_idx,
44. CV_VAR_CATEGORICAL ); // set response type
45. // split train and test data
46. CvTrainTestSplit spl( 0.5f );
47. data.set_train_test_split( &spl );
48. data.set_miss_ch(“?”); // set missing value
49.50. CvRTrees rtrees;
51. rtrees.train( &data, CvRTParams( 10, 2, 0, false,
52. 16, 0, true, 0, 100, 0, CV_TERMCRIT_ITER ));
53. print_result( rtrees.calc_error( &data, CV_TRAIN_ERROR),
54. rtrees.calc_error( &data, CV_TEST_ERROR ),
55. rtrees.get_var_importance() );
56.57. return 0;
58. }



References:
[1] OpenCV 2.3 Online Documentation: http://opencv.itseez.com/modules/ml/doc/random_trees.html
[2] Random Forests, Leo Breiman and Adele Cutler: http://www.stat.berkeley.edu/users/breiman/RandomForests/cc_home.htm
[3] T. Hastie, R. Tibshirani, J. H. Friedman. The Elements of Statistical Learning. ISBN-13 978-0387952840, 2003, Springer.