CART简述
cart,分类和回归树算法。
cart既可以用来构建分类决策树,也可以用来构建回归树、模型树。
用树对数据建模,把叶子节点简单设定为常数值,构成回归树。如果把叶子节点设定为分段线性函数,即构成模型树。
- cart创建分类决策树使用当前数据集中具有最小Gini信息增益的特征作为结点划分决策树。详述可见决策树一节的描述。
- 回归树,与分类决策树类似,但叶子节点数据类型不是离散型,而是连续型。cart用于回归时,根据叶子是具体值还是连续的机器学习模型又可以分为回归树和模型树。但是无论是回归树还是模型树,其适用场景都是:标签值是连续分布的,但又是可以划分群落的,群落之间是有比较鲜明的区别的,即每个群落内部是相似的连续分布,群落之间分布确是不同的。所以回归树和模型树既算回归,也称得上分类。
cart使用二元切分法来处理连续变量。所以可以固定树的节点,每个节点由4个固定属性:待切分的feature、待切分的feature value、右子树、左子树。
创建树函数createTree():
注:createTree考虑类别>=3时候的代码可参考博客:
http://blog.csdn.net/wzmsltw/article/details/51057311
中createTree函数。
*找到最佳的待切分feature、value:
如果该节点不能再分,将该节点存为叶节点
执行二元切分
在右子树执行createTree方法
在左子树执行createTree方法*
def createTree(dataSet, leafType, errType, cond=(1,4)):
''' 创建回归树/模型树。
:param dataSet:
:param leafType:
:param errType:
:param cond: 预剪枝条件
:return:
'''
feature, value = chooseBestSplit(dataSet, leafType, errType, cond)
if feature == None:
return value
retTree = {}
retTree['spInd'] = feature
retTree['spVal'] = value
lSet,rSet = binSplitDataSet(dataSet, feature, value)
retTree['left'] = createTree(lSet, leafType, errType, cond)
retTree['right'] = createTree(rSet, leafType, errType, cond)
return retTree
def binSplitDataSet(dataSet, feature, value):
''' 根据属性feature的特定value划分数据集
:param dataSet:
:param feature:
:param value:
:return:
'''
mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:]
mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:]
return mat0,mat1
对数据的复杂关系建模,我们已决定借用树结构帮助切分数据,那么如何实现数据的切分呢?怎么才知道是否已经切分充分了呢?
这些问题的答案取决于叶节点的建模方式。
回归树假设叶节点是常数值,这种策略认为数据中的复杂关系可以用树结构来概括。
为成功构建以分段常数为叶节点的树,需要度量出数据的一致性。决策树使用树进行分类,会在给定节点时计算数据的混乱度。那么如何计算连续性数值的混乱度?事实上,在数据集上计算混乱度很简单,使用平方误差的总值即总方差。总方差可以通过方差乘以数据中样本点的个数得到。
选择最佳分裂属性的伪代码:
对每个特征:
对每个特征值&#x