5-6 CART树的生成

本文深入探讨了CART树的生成算法,包括输入训练数据集、样本标签,以及输出回归树的过程。详细介绍了通过计算基尼指数选择最优划分特征和值的方法,以及递归生成子节点直至所有实例属于同一类的终止条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CART树的生成算法

输入:
训练数据集X,样本标签y
输出:回归树f(x)

步骤

  1. 若D中所有实例属于同一类CkC_kCk,则T为单结点树,并将类CkC_kCk作为该结点的类标记,返回T
  2. 对每个特征feature的每个取值value,将y分为R1R_1R1R2R_2R2两个集合,因为现在还不是真正的split,只是要计算split后的基尼指数,只需要用到split之后的y
    y1(feature,value)={yi∣xi(feature)≤value}y2(feature,value)={yi∣yi(feature)>value} y_1(feature, value) = \{y_i | x_i^{(feature)} \le value\} \\ y_2(feature, value) = \{y_i | y_i^{(feature)} \gt value\} y1(feature,value)={yixi(feature)value}y2(feature,value)={yiyi(feature)>value}
  3. 计算y1y_1y1y2y_2y2的基尼指数之和

Gini(p)=∑Kpk(1−pk)=1−∑Kpk2 Gini(p) = \sum^K p_k(1-p_k) = 1 - \sum^Kp_k^2 Gini(p)=Kpk(1pk)=1Kpk2

  1. 选择基尼指数计算结果最小的(feature, value)作为当前的最优划分
  2. 基于最优划分生成2个子结点,将数据分配到两个子结点中
  3. 对子结点递归调用CART算法

代码

def gini(y):
    ySet = set(y)
    ret, n = 1, y.shape[0]
    for yi in ySet:
        ret -= (y[y==yi].shape[0]/n)**2
    return ret

def CART(X, y):
    # 若D中所有实例属于同一类$$C_k$$
    if len(set(y))==1:
        # 将类$$C_k$$作为该结点的类标记
        return y[0]
    bestGini = np.inf
    # 对每个特征feature的每个取值value
    for feature in range(X.shape[1]):
        for value in set(X[:,feature]):
            # 将X分为$$R_1$$和$$R_2$$两个集合
            y1 = y[X[:,feature]<= value]
            y2 = y[X[:,feature]> value]
            # 计算$$R_1$$和$$R_2$$的基尼指数之和
            sumGini = gini(y1) + gini(y2)
            # 选择基尼指数计算结果最小的(feature, value)作为当前的最优划分
            if sumGini < bestGini:
                bestFeature, bestValue, bestGini = feature, value, sumGini
    # 基于最优划分生成2个子结点,将数据分配到两个子结点中
    node = {'feature':bestFeature,
            'value':bestValue,
            'left':CART(X[X[:,bestFeature]<= bestValue], y[X[:,bestFeature]<= bestValue]),
           'right':CART(X[X[:,bestFeature]> bestValue], y[X[:,bestFeature]> bestValue])}
    return node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值