基本概念

分类和回归树(classification and regression tree, CART) 是应用广泛的决策树学习方法,由特征选择、树的生成和剪枝组成,既可以用做分类也可以用作回归。

回归树
回归树的定义

假设X和Y分别作为输入和输出变量,那么存在训练集
回归树 数据预测 回归树 分类树_决策树
一个回归树对应其输入空间(特征)的划分和这个划分上的输入值。 数学定义:
存在M个分类,每个分类的单元为回归树 数据预测 回归树 分类树_决策树_02,且该单元的输出为回归树 数据预测 回归树 分类树_回归树 数据预测_03,我们有回归树模型回归树 数据预测 回归树 分类树_决策树_04 ,这里回归树 数据预测 回归树 分类树_回归树 数据预测_05代表那个分类的集合。

于是我们可以用平方误差回归树 数据预测 回归树 分类树_回归树_06来表示回归树训练时的误差。

回归树的生成

第一步: 选择切分变量j和切分点s,即选用特征j和特征上的一个阈值s将输入数据划分成一个二叉决策树。这一步需要遍历所有的特征及其阈值,获取最优解,数学表示如下:

1)目标是取两个集合:回归树 数据预测 回归树 分类树_回归树 数据预测_07
2)求解误差最小值
回归树 数据预测 回归树 分类树_决策树_08
第二步:这里设定的输出值为训练数据输出的均方差
$c_1 = ave(y_i | x_i \in R_1) \quad c_2 = ave(y_i | x_i \in R_2) $

第三步: 对已经划分的两个子区域,再次重复步骤1,2,知道满足停止条件,生成有M个区域的决策树。

分类树
基尼指数

分类问题中假设有K个类,样本点属于k类的概率为回归树 数据预测 回归树 分类树_回归树 数据预测_09,则概率分布的基尼系数为:
回归树 数据预测 回归树 分类树_回归树_10

对于给定的样本集合D,其基尼指数为:
回归树 数据预测 回归树 分类树_回归树_11,这里回归树 数据预测 回归树 分类树_回归树 数据预测_12表示D中属于k类的数量。

基尼系数表示了集合D的不确定性,Gini(D, A)表示D作了A分割成回归树 数据预测 回归树 分类树_回归树 数据预测_13后的不确定性,基尼系数越大,不确定性越大。
其中回归树 数据预测 回归树 分类树_回归树 数据预测_14

分类树的训练

这个和回归树的方式基本一样,只是损失定义从最小二乘转变为基尼指数。

第一步: 对输入数据D的每一个特征和可能的取值,做分类A并计算Gini(D, A)
第二步: 取Gini(D, A)最小的一组数据,作为本次的最有特征和最优切分点
第三步: 对上述划分的结果,迭代步骤1,2
第四步: 生成CART决策树(分类)

代码实现(回归树,基于sklearn)
# -*- coding: utf-8 -*-
import numpy  as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor

def _test_cart_regresssion():

    index  = np.linspace(0, 10, 200);

    delta  = np.random.rand()

    index.shape = (200, 1)

   
    y_test = 0.3*index + np.sin(index) + delta

    clf = DecisionTreeRegressor(max_depth=4) 
    """
    这里的深度为4,相当于回归的时候分了4次,划分为2^4=16个区域
    """

    clf.fit(index, y_test)

    y_pred = clf.predict(index)

    plt.scatter(index, y_test,  color='black',marker='o')
    plt.plot(index, y_pred, color='blue', linewidth=2)

    plt.xticks(())
    plt.yticks(())

    plt.show()


    pass;


"""
说明:

CART算法回归树及决策树的例子《CART算法》

作者:fredric

日期:2018-11-4

"""
if __name__ == "__main__":

    _test_cart_regresssion()

回归树 数据预测 回归树 分类树_决策树_15