регрессия дерева решений opencv, предсказать невидимые ответы? - PullRequest
0 голосов
/ 19 сентября 2018

Я использую opencv3 для Visual Studio 2017, кодирование на C ++, для Surface Pro (Windows 10 64-разрядная версия).

Я хочу обучить дерево решений, чтобы оно могло предсказывать с помощью регрессии.Мне нужно, чтобы он мог прогнозировать между ответами, которых не было в представленном обучающем наборе.Например, этот код:

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), чтобы онможет предсказать ответы за пределами того, что он видел?например, используя интерполяцию и / или экстраполяцию.

...