CART 训练算法

Scikit-Learn 用分裂回归树(Classification And Regression Tree,简称 CART)算法训练决策树(也叫“增长树”)。这种算法思想真的非常简单:

首先使用单个特征k和阈值 t_k(例如,“花瓣长度≤2.45cm”)将训练集分成两个子集。它如何选择kt_k 呢?它寻找到能够产生最纯粹的子集一对 (k, t_k),然后通过子集大小加权计算。

算法会尝试最小化成本函数。方法如公式 6-2

1528086977613

当它成功的将训练集分成两部分之后, 它将会继续使用相同的递归式逻辑继续的分割子集,然后是子集的子集。当达到预定的最大深度之后将会停止分裂(由max_depth超参数决定),或者是它找不到可以继续降低不纯度的分裂方法的时候。几个其他超参数(之后介绍)控制了其他的停止生长条件(min_samples_splitmin_samples_leafmin_weight_fraction_leafmax_leaf_nodes)。

正如您所看到的,CART 算法是一种贪婪算法:它贪婪地搜索最高级别的最佳分割方式,然后在每个深度重复该过程。 它不检查分割是否能够在几个级别中的全部分割可能中找到最佳方法。贪婪算法通常会产生一个相当好的解决方法,但它不保证这是全局中的最佳解决方案。

不幸的是,找到最优树是一个 NP 完全问题(自行百度):它需要 O(exp^m) 时间,即使对于相当小的训练集也会使问题变得棘手。 这就是为什么我们必须设置一个“合理的”(而不是最佳的)解决方案。