当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生活中很多问题都是非线性的,不可能使用全局线性模型来拟合任何数据。一种可行的方法是将数据集切分成很多份易建模的数据,然后利用线性回归技术来建模。如果首次切分后仍然难以拟合线性模型就继续切分。在这种切分方式下,树结构和回归法就相当有用。
创建回归树时,观察值取值是连续的、没有分类标签,只有根据观察数据得出的值来创建一个预测的规则。在这种情况下,Classification Tree的最优划分规则就无能为力,CART则使用最小剩余方差(Squared Residuals Minimization)来决定Regression Tree的最优划分,该划分准则是期望划分之后的子树误差方差最小。创建模型树,每个叶子节点则是一个机器学习模型,如线性回归模型。
回归树与分类树的思路类似,但叶节点的数据类型不是离散型,而是连续型,对CART稍作修改就可以处理回归问题。CART算法用于回归时根据叶子是具体值还是另外的机器学习模型又可以分为回归树和模型树。但无论是回归树还是模型树,其适用场景都是:标签值是连续分布的,但又是可以划分群落的,群落之间是有比较鲜明的区别的,即每个群落内部是相似的连续分布,群落之间分布确是不同的。所以回归树和模型树既算回归,也称得上分类。
回归是为了处理预测值是连续分布的情景,其返回值应该是一个具体预测值。回归树的叶子是一个个具体的值,从预测值连续这个意义上严格来说,回归树不能称之为“回归算法”。因为回归树返回的是“一团”数据的均值,而不是具体的、连续的预测值(即训练数据的标签值虽然是连续的,但回归树的预测值却只能是离散的)。所以回归树其实也可以算为“分类”算法,其适用场景要具备“物以类聚”的特点,即特征值的组合会使标签属于某一个“群落”,群落之间会有相对鲜明的“鸿沟”。如人的风格是一个连续分布,但是却又能“群分”成文艺、普通和2B三个群落,利用回归树可以判断一个人是文艺还是2B,但却不能度量其有多文艺或者多2B。所以,利用回归树可以将复杂的训练数据划分成一个个相对简单的群落,群落上可以再利用别的机器学习模型再学习。
模型树的叶子是一个个机器学习模型,如线性回归模型,所以更称的上是“回归”算法。利用模型树就可以度量一个人的文艺值了。回归树和模型树也需要剪枝,剪枝理论和分类树相同。为了获得最佳模型,树剪枝常采用预剪枝和后剪枝结合的方法进行。
树回归中,为成功构建以分段常数为叶节点的树,需要度量出数据的一致性。分类决策树创建时会在给定节点时计算分类数据的混乱度。那么如何计算连续型数值的混乱度呢? 事实上, 在连续数据集上计算混乱度是非常简单的–度量按某一特征划分前后标签数据总差值,每次选取使数据总差值最小的那个特征做最佳分支特征为了对正负差值同等看待,一般使用绝对值或平方值来代替上述差值)。为什么选择计算差值呢》差值越小,相似度越高,越可能属于一个群落咯。那么如果选取方差做差值,总方差的计算方法有两种:(1)计算数据集均值std,计算每个数据点与std的方差,然后n个点求和。(2)计算数据集方差var,然后var_sum = var*n,n为数据集数据数目。Python Matrix中可以利用var方法求得数据集方差,因此该方法简单、方便。
与Gini Gain对离散特征和连续特征的处理方法类似,多值离散特征需要选择最优二分序列,连续特征则要找出最优分裂点。那么,每次最佳分支特征的选取过程为:function chooseBestSplitFeature()(1)先令最佳方差为无限大bestVar=inf。(2)依次计算根据某特征(FeatureCount次迭代)划分数据后的总方差currentVar(,计算方法为:划分后左右子数据集的总方差之和),如果currentVar<bestVar,则bestVar=currentVar.(3)返回最佳分支特征、分支特征值(离散特征则为二分序列、连续特征则为分裂点的值),左右分支子数据集。
7)CART分类当将CART用于分类问题时需要构建CART分类树。