我正在Surface Pro(Windows 10 64位)上使用Opencv3 for Visual Studio 2017,以C ++进行编码。
我想训练决策树,以便可以通过回归进行预测。我需要它能够预测介于所代表的训练集中的响应之间。例如,这段代码:
cv::Mat samples(6, 1, CV_32FC1);
samples.at<float>(0, 0) = 1.5;
samples.at<float>(1, 0) = 2.7;
samples.at<float>(2, 0) = 3.8;
samples.at<float>(3, 0) = 4.3;
samples.at<float>(4, 0) = 5.4;
samples.at<float>(5, 0) = 5.2;
cv::Mat responses = samples.clone();
cv::Mat samples2(5, 1, CV_32FC1);
samples2.at<float>(0, 0) = 1.8;
samples2.at<float>(1, 0) = 2.5;
samples2.at<float>(2, 0) = 3.6;
samples2.at<float>(3, 0) = 4.4;
samples2.at<float>(4, 0) = 5.3;
cv::Ptr< cv::ml::DTrees > model = cv::ml::DTrees::create();
model->setMinSampleCount(1);
model->setCVFolds(1);
model->setMaxDepth(10);
model->setRegressionAccuracy(.01f);
model->train(samples, cv::ml::ROW_SAMPLE, responses);
cv::Mat results;
model->predict(samples2, results);
for (int i = 0; i < results.rows; i++) {
for (int j = 0; j < results.cols; j++)
cout << results.at<float>(i, j) << ", ";
cout << endl;
}
输出为:
1.5
2.7
3.8
4.3
5.2
这是一个简单的身份问题,无论样本是什么,响应都应该如此。但是,从此示例中,它只能预测所看到的响应。据我了解,这是因为每个响应叶都是一个恒定值。决策树完成后,它以恒定的值落在那些叶子之一上。
我的问题是,是否有人知道一种操纵决策树的方法(最好使用OpenCV),以便它可以预测所见之外的响应?例如使用内插和/或外推。