API RTrees, похоже, изменился в разных версиях. RTrees 2.4.1 documentation говорит, что он поддерживает как регрессию, так и классификацию, хотя я не вижу, как это можно сделать.Как использовать OpenCV RTrees для двоичной классификации?
Я хочу использовать RTrees как бинарный классификатор в OpenCV 3.1, хотя в документации ничего не говорится об этом, а RTrees :: isClassifier() возвращает false.
m_pTrees->setMaxDepth(20);
m_pTrees->setMinSampleCount(10);
cv::TermCriteria criteria(cv::TermCriteria::EPS, 0, 0);
m_pTrees->setTermCriteria(criteria);
m_pTrees->setCalculateVarImportance(false);
m_pTrees->setRegressionAccuracy(0);
// I assumed setting categories makes it a classifier.
m_pTrees->setMaxCategories(2);
// Always returns a float (that looks like the average of votes).
// I expected a single 0 or 1 (since max categories is 2).
m_pTrees->predict(sample);
РЕДАКТИРОВАТЬ: Я сделал еще несколько работ и посмотрел исходный код OpenCV. RTrees
создает скрытую реализацию объекта DTReesImplForRTrees
, который расширяет класс DTreesImpl
. Этот класс управляет переменной-членом _isClassifier
и устанавливает его в соответствии с типом ответа TrainData, заданным train()
.
С tree.cpp в OpenCV исходного кода
_isClassifier = data->getResponseType() == VAR_CATEGORICAL;
На данный момент, я не вижу способа конфигурирования объекта TrainData вернуть это. Возможно, это потому, что мои учебные классы хранятся как float вместо целых чисел? Если я правильно помню, тип данных должен был быть CV_32F, но, возможно, я где-то ошибся.