在OpenCV Python中随机森林无法正常工作

我似乎无法正确地传递参数来在OpenCV的Python接口中训练随机森林分类器。

我在C++中编写了一个实现,运行正常,但在Python中没有得到相同的结果。

我在这里找到了一些示例代码:http://fossies.org/linux/misc/opencv-2.4.7.tar.gz:a/opencv-2.4.7/samples/python2/letter_recog.py

这似乎表明你应该通过字典传递参数。以下是我使用的代码:

rtree_params = dict(max_depth=11, min_sample_count=5, use_surrogates=False, max_categories=15, calc_var_importance=False, n_active_vars=0, max_num_of_trees_in_the_forest=1000, termcrit_type=cv2.TERM_CRITERIA_MAX_ITER)classifier = cv2.RTrees()classifier.train(train_data, cv2.CV_ROW_SAMPLE, label_data, params=rtree_params);

我可以看出分类器确实被正确训练了,但它的准确性远不如我在C++中使用相同参数训练的分类器。我相当确定这些参数被识别了,因为当我调整这些值时会得到不同的结果。

我注意到当我将分类器输出到文件时,它只有一个树。我相当确定这是问题所在。我查看了OpenCV的实现:

http://www.code.opencv.org/svn/gsoc2012/denoising/trunk/opencv-2.4.2/modules/ml/src/rtrees.cpp

根据我的参数,它应该输出一个包含1000棵树的森林。我尝试将max_num_of_trees_in_the_forest参数设置为各种极端值,但这并没有改变OpenCV的行为。

有什么想法吗?


回答:

不确定这是否会有很大帮助,但我认为:

n_active_vars=0

应该改为

nactive_vars=0

另外,你可以尝试调整term_crit参数。例如,尝试添加:

term_crit=(cv2.TERM_CRITERIA_MAX_ITER,1000,1)

到你的字典中。

我认为这将设置当森林中添加了1000棵树时终止的标准。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注