OpenCV中的CvDTree类实现了单一的决策树,可以作为基类用在Boosting 和 Random Trees中。决策树是一个二叉树,回归和分类中都可以用。在分类中,每个树叶都被标记了一个类别,多个叶子也可以是相同的类别,在回归中,一个常量也可以赋值给一个叶子,所以逼近函数是分段的。在机器学习中,基尼纯度被用来作为分类的准则,平方和误差被用来作为回归的评价。在以下四种情况下,分割会终止。
1 结构树的深度已经达到了指定的最大值
2 在没有统计数据表征应该继续分割的情况下,节点中的训练数据小于指定的阈值
3 节点中的所有样本属于同一类,或者在回归中,变化很小
4 找到的最好的分割与随机选择并没有明显的提高
当树完成创建后,可能会用到交叉验证来做剪枝处理。有些导致模型过拟合的枝将被剪掉。正常来说,这个过程只应用在独立的决策树中。通常,此法创建的树已经够小了并且它们拥有防止过拟合的机制。
(以上译自OpenCV 2.4.9 ref)
OpenCV实现的是CART分类和回归树。算法的要点是给树的每个节点定义一个衡量标准。比如:当我们拟合一个函数的时候,我们使用真实值和预测值差的平方和,这是衡量标准,算法的目的是使差的平方和最小。对于分类问题,我们定义一个度量,使得当一个节点的大多数值都属于同一类时,这个度量最小。三个最常用度量是entropy,Gini index, misclassification。
一旦我们定义了度量,二叉数搜寻整个特征向量,搜寻哪个特征和那个阈值可以正确分类数据或正确拟合数据。根据惯例,我们说特征值大于这个阈值的数据为”真“,被分配到左分支,其他的点放到右分支。从二叉数的每个节点递归使用这个过程直到数据都纯净了,或者节点里的数据样本数达到最小值。
(以上自《学习OpenCV(第一版) 》 P.527)
Gini不纯度