使用 OpenCV 的平凡随机森林不起作用,并且与 sklearn 不同

Posted

技术标签:

【中文标题】使用 OpenCV 的平凡随机森林不起作用,并且与 sklearn 不同【英文标题】:Trivial random forest with OpenCV doesn't work and isn't the same as sklearn 【发布时间】:2014-03-17 04:25:49 【问题描述】:

我正在尝试让最简单的随机森林示例起作用。训练数据是带有标签 0 的 2 个点 0,0 和带有标签 1 的 1,1。要预测的样本是 2,2。 OpenCV 返回 0 而不是 1。这是 C++ 中的 OpenCV 代码 (main.cpp):

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[]) 
  cout << " hi \n";
  float trainingData[2][2] =  0.0, 0.0, 1.0, 1.0;
  Mat training_data(2, 2, CV_32FC1, trainingData);
  float trainingClass[2] = 0.0,1.0;
  Mat training_class(2, 1, CV_32FC1, trainingClass);
  CvRTrees rtree;
  rtree.train(training_data, CV_ROW_SAMPLE, training_class);
  float sampleData[2] = 2.0, 2.0;
  Mat sample_data(2, 1, CV_32FC1, sampleData);
  cout << rtree.predict(sample_data) << "  <-- predict\n";
  return 0;

cmake 文件:

cmake_minimum_required(VERSION 2.8)
project( main )
find_package( OpenCV REQUIRED )
add_executable( main main.cpp )
target_link_libraries( main $OpenCV_LIBS )

运行:

> cmake .;make;./main
 hi 
0  <-- predict

为了比较,这里是一个python的sklearn代码(rfc.py):

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)
print clf.predict([[2., 2.]])

运行:

> python rfc.py 
[1]

【问题讨论】:

【参考方案1】:

要训练的点数太少。如果我将其更改为 3,则一切正常。

min_sample_count 更改为 2 也可以。

【讨论】:

以上是关于使用 OpenCV 的平凡随机森林不起作用,并且与 sklearn 不同的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 随机森林示例

如何使用我的日期时间进行预测(随机森林模型)

使用 scikit-learn 和 Flask 对随机森林回归器建模

OpenCV 迭代随机森林训练

OpenCV 随机决策森林:如何获得后验概率

Opencv 300 - 随机森林预测返回错误答案