统计学习方法 第五章习题答案

习题5.1

题目:根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树.
统计学习方法 第五章习题答案_第1张图片
答:
先计算每个特征的信息增益比,信息增益比 g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)} gR(D,A)=HA(D)g(D,A)。其中D关于特征A的熵 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ⁡ 2 ∣ D i ∣ ∣ D ∣ H_{A}(D)=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}\log_{2}\frac{|D_{i}|}{|D|} HA(D)=i=1nDDilog2DDi(n为A特征的取值个数),信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
分别以 A 1 , A 2 , A 3 , A 4 A_{1},A_{2},A_{3},A_{4} A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征。
经验熵 H A ( D ) H_{A}(D) HA(D)
H A 1 ( D ) = − 5 15 log ⁡ 2 5 15 − 5 15 log ⁡ 2 5 15 − 5 15 log ⁡ 2 5 15 = 1.584 H_{A_{1}}(D)=-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{5}{15}\log_{2}\frac{5}{15}=1.584 HA1(D)=155log2155155log2155155log2155=1.584
H A 2 ( D ) = − 5 15 log ⁡ 2 5 15 − 10 15 log ⁡ 2 10 15 = 0.918 H_{A_{2}}(D)=-\frac{5}{15}\log_{2}\frac{5}{15}-\frac{10}{15}\log_{2}\frac{10}{15}=0.918 HA2(D)=155log21551510log21510=0.918
H A 3 ( D ) = − 9 15 log ⁡ 2 9 15 − 6 15 log ⁡ 2 6 15 = 0.971 H_{A_{3}}(D)=-\frac{9}{15}\log_{2}\frac{9}{15}-\frac{6}{15}\log_{2}\frac{6}{15}=0.971 HA3(D)=159log2159156log2156=0.971
H A 4 ( D ) = − 4 15 log ⁡ 2 4 15 − 6 15 log ⁡ 2 6 15 − 5 15 log ⁡ 2 5 15 = 1.566 H_{A_{4}}(D)=-\frac{4}{15}\log_{2}\frac{4}{15}-\frac{6}{15}\log_{2}\frac{6}{15}-\frac{5}{15}\log_{2}\frac{5}{15}=1.566 HA4(D)=154log2154156log2156155log2155=1.566
例题5.2已经计算了各个特征的信息增益:
g ( D , A 1 ) = 0.083 g(D,A_{1})=0.083 g(D,A1)=0.083
g ( D , A 2 ) = 0.324 g(D,A_{2})=0.324 g(D,A2)=0.324
g ( D , A 3 ) = 0.420 g(D,A_{3})=0.420 g(D,A3)=0.420
g ( D , A 4 ) = 0.363 g(D,A_{4})=0.363 g(D,A4)=0.363
得信息增益比:
g R ( D , A 1 ) = 0.052 g_{R}(D,A_{1})=0.052 gR(D,A1)=0.052
g R ( D , A 2 ) = 0.353 g_{R}(D,A_{2})=0.353 gR(D,A2)=0.353
g R ( D , A 3 ) = 0.433 g_{R}(D,A_{3})=0.433 gR(D,A3)=0.433
g R ( D , A 4 ) = 0.232 g_{R}(D,A_{4})=0.232 gR(D,A4)=0.232
选择信息增益比最大的特征 A 3 A_{3} A3作为根节点特征,将训练集分为两个子集 D 1 ( A 3 = ′ 是 ′ ) D_{1}(A_{3}='是') D1(A3=) D 2 ( A 3 = ′ 否 ′ ) D_{2}(A_{3}='否') D2(A3=),由于 D 1 D_{1} D1中只有同一类样本点,所以它是一个叶节点,标记为“是”
D 2 D_{2} D2 A 1 , A 2 , A 4 A_{1},A_{2},A_{4} A1,A2,A4中选择新的特征, D 2 D_{2} D2中的元素有:
统计学习方法 第五章习题答案_第2张图片
重新计算各个特征的信息增益比
经验熵:
H ( D 2 ) = − 3 9 log ⁡ 2 3 9 − 6 9 log ⁡ 2 6 9 = 0.918 H(D_{2})=-\frac{3}{9}\log_{2}\frac{3}{9}-\frac{6}{9}\log_{2}\frac{6}{9}=0.918 H(D2)=93log29396log296=0.918
信息增益:
g ( D 2 , A 1 ) = H ( D 2 ) − [ 4 9 H ( D 21 ) + 2 9 H ( D 22 ) + 3 9 H ( D 23 ) ] = 0.918 − [ 4 9 ( − 1 4 log ⁡ 2 1 4 − 3 4 log ⁡ 2 3 4 ) + 2 9 ( − 2 2 log ⁡ 2 2 2 ) + 3 9 ( − 2 3 log ⁡ 2 2 3 − 1 3 log ⁡ 2 1 3 ) ] = 0.918 − 0.667 = 0.251 \begin{aligned}g(D_{2},A_{1})&=H(D_{2})-[\frac{4}{9}H(D_{21})+\frac{2}{9}H(D_{22})+\frac{3}{9}H(D_{23})] \\&=0.918-[\frac{4}{9}(-\frac{1}{4}\log_{2}\frac{1}{4}-\frac{3}{4}\log_{2}\frac{3}{4})+\frac{2}{9}(-\frac{2}{2}\log_{2}\frac{2}{2})+\frac{3}{9}(-\frac{2}{3}\log_{2}\frac{2}{3}-\frac{1}{3}\log_{2}\frac{1}{3})]\\&=0.918-0.667\\&=0.251\end{aligned} g(D2,A1)=H(D2)[94H(D21)+92H(D22)+93H(D23)]=0.918[94(41log24143log243)+92(22log222)+93(32log23231log231)]=0.9180.667=0.251
其中 D 21 , D 22 , D 23 D_{21},D_{22},D_{23} D21,D22,D23分别表示 D 2 D_{2} D2 A 1 A_{1} A1取值为青年,中年,老年的样本子集。
g ( D 2 , A 2 ) = H ( D 2 ) − [ 6 9 H ( D 21 ) + 3 9 H ( D 22 ) ] = 0.918 − [ 6 9 ( − 6 6 log ⁡ 2 6 6 ) + 3 9 ( − 3 3 log ⁡ 2 3 3 ) ] = 0.918 \begin{aligned}g(D_{2},A_{2})&=H(D_{2})-[\frac{6}{9}H(D_{21})+\frac{3}{9}H(D_{22})]\\&=0.918-[\frac{6}{9}(-\frac{6}{6}\log_{2}\frac{6}{6})+\frac{3}{9}(-\frac{3}{3}\log_{2}\frac{3}{3})]\\&=0.918\end{aligned} g(D2,A2)=H(D2)[96H(D21)+93H(D22)]=0.918[96(66log266)+93(33log233)]=0.918
其中 D 21 , D 22 D_{21},D_{22} D21,D22分别表示 D 2 D_{2} D2 A 2 A_{2} A2取值为否,是的样本子集。
g ( D 2 , A 4 ) = H ( D 2 ) − [ 4 9 H ( D 21 ) + 4 9 H ( D 22 ) + 1 9 H ( D 23 ) ] = 0.918 − [ 4 9 ( − 4 4 log ⁡ 2 4 4 ) + 4 9 ( − 2 4 log ⁡ 2 2 4 − 2 4 log ⁡ 2 2 4 ) + 1 9 ( − 1 1 log ⁡ 2 1 1 ) ] = 0.918 − 0.444 = 0.474 \begin{aligned}g(D_{2},A_{4})&=H(D_{2})-[\frac{4}{9}H(D_{21})+\frac{4}{9}H(D_{22})+\frac{1}{9}H(D_{23})]\\&=0.918-[\frac{4}{9}(-\frac{4}{4}\log_{2}\frac{4}{4})+\frac{4}{9}(-\frac{2}{4}\log_{2}\frac{2}{4}-\frac{2}{4}\log_{2}\frac{2}{4})+\frac{1}{9}(-\frac{1}{1}\log_{2}\frac{1}{1})]\\&=0.918-0.444\\&=0.474\end{aligned} g(D2,A4)=H(D2)[94H(D21)+94H(D22)+91H(D23)]=0.918[94(44log244)+94(42log24242log242)+91(11log211)]=0.9180.444=0.474
其中 D 21 , D 22 , D 23 D_{21},D_{22},D_{23} D21,D22,D23分别表示 D 2 D_{2} D2 A 4 A_{4} A4取值为一般,好,非常好的样本子集。
信息增益比:
g R ( D 2 , A 1 ) = g ( D 2 , A 1 ) H A 1 ( D 2 ) = 0.251 − 4 9 log ⁡ 2 4 9 − 2 9 log ⁡ 2 2 9 − 3 9 log ⁡ 2 3 9 = 0.251 1.530 = 0.164 \begin{aligned}g_{R}(D_{2},A_{1})&=\frac{g(D_{2},A_{1})}{H_{A_{1}}(D_{2})}\\&=\frac{0.251}{-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{2}{9}\log_{2}\frac{2}{9}-\frac{3}{9}\log_{2}\frac{3}{9}}\\&=\frac{0.251}{1.530}\\&=0.164\end{aligned} gR(D2,A1)=HA1(D2)g(D2,A1)=94log29492log29293log2930.251=1.5300.251=0.164
g R ( D 2 , A 2 ) = g ( D 2 , A 2 ) H A 2 ( D 2 ) = 0.918 − 6 9 log ⁡ 2 6 9 − 3 9 log ⁡ 2 3 9 = 0.918 0.918 = 1 \begin{aligned}g_{R}(D_{2},A_{2})&=\frac{g(D_{2},A_{2})}{H_{A_{2}}(D_{2})}\\&=\frac{0.918}{-\frac{6}{9}\log_{2}\frac{6}{9}-\frac{3}{9}\log_{2}\frac{3}{9}}\\&=\frac{0.918}{0.918}\\&=1\end{aligned} gR(D2,A2)=HA2(D2)g(D2,A2)=96log29693log2930.918=0.9180.918=1
g R ( D 2 , A 4 ) = g ( D 2 , A 4 ) H A 4 ( D 2 ) = 0.474 − 4 9 log ⁡ 2 4 9 − 4 9 log ⁡ 2 4 9 − 1 9 log ⁡ 2 1 9 = 0.474 1.392 = 0.340 \begin{aligned}g_{R}(D_{2},A_{4})&=\frac{g(D_{2},A_{4})}{H_{A_{4}}(D_{2})}\\&=\frac{0.474}{-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{4}{9}\log_{2}\frac{4}{9}-\frac{1}{9}\log_{2}\frac{1}{9}}\\&=\frac{0.474}{1.392}\\&=0.340\end{aligned} gR(D2,A4)=HA4(D2)g(D2,A4)=94log29494log29491log2910.474=1.3920.474=0.340
选择信息增益比最大的特征 A 2 A_{2} A2作为节点的特征,从这一结点引出两个子结点:一个对应“是”(有工作)的子结点,包含3个样本,它们属于同一类,所以这是一个叶结点,类标记为“是”;另一个是对应“否”(无工作)的子结点,包含6个样本,它们也属于同一类,所以这也是一个叶结点,类标记为“否”。
最终的决策树如图:
统计学习方法 第五章习题答案_第3张图片
贴个代码验算下:
首先是书中例题5.3用ID3算法生成决策树

import numpy as np
from math import log

def loadData():
    datasets = [['青年', '否', '否', '一般', '否'],
               ['青年', '否', '否', '好', '否'],
               ['青年', '是', '否', '好', '是'],
               ['青年', '是', '是', '一般', '是'],
               ['青年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '好', '否'],
               ['中年', '是', '是', '好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '好', '是'],
               ['老年', '是', '否', '好', '是'],
               ['老年', '是', '否', '非常好', '是'],
               ['老年', '否', '否', '一般', '否'],
               ]
    labels = [u'年龄', u'有工作', u'有自己的房子', u'信贷情况', u'类别']
    # 返回数据集和每个维度的名称
    return datasets, labels

def calc_entropy(datasets):
    label_count = {}
    for dataset in datasets:
        label =  dataset[-1]
        if label not in label_count:
            label_count[label] = 0
        label_count[label] += 1
    entropy = -sum([(p/len(datasets))*log(p/len(datasets),2) for p in label_count.values()])
    return entropy

def calc_conditional_entropy(datasets, index = 0):
    feature_data = {}
    for dataset in datasets:
        feature = dataset[index]
        if feature not in feature_data:
            feature_data[feature] = []
        feature_data[feature].append(dataset)
    condEntropy = sum([(len(p)/len(datasets))*calc_entropy(p) for p in feature_data.values()])
    return condEntropy

def info_gain(entropy, condEntropy):
    return entropy - condEntropy

def info_gain_train_childTree(datasets, labels):
    entropy = calc_entropy(datasets)
    features = []
    for index in range(len(datasets[0])-1):
        condEntropy = calc_conditional_entropy(datasets, index)
        c_info_gain = info_gain(entropy, condEntropy)
        features.append((index, c_info_gain))
        print("特征({})的信息增益为{:.3f}".format(labels[index], c_info_gain))
    best_feature = max(features, key=lambda x: x[-1])
    print("特征({})的信息增益最大,选择为当前节点特征".format(labels[best_feature[0]]))
    return best_feature

def info_gain_train(datasets, labels):
    label_count = {}
    for dataset in datasets:
        label = dataset[-1]
        if label not in label_count:
            label_count[label] = 0
        label_count[label] += 1
    if len(label_count.keys()) == 1:
        key = list(label_count.keys())[0]
        print("此时类别均为{}".format(key))
        return
    best_feature = info_gain_train_childTree(datasets, labels)

    feature_data = {}
    for dataset in datasets:
        feature = dataset[best_feature[0]]
        if feature not in feature_data:
            feature_data[feature] = []
        feature_data[feature].append(dataset)

    for data in zip(feature_data.keys(), feature_data.values()):
        print("当{}为{}".format(labels[best_feature[0]], data[0]))
        info_gain_train(data[1], labels)


if __name__ == "__main__":
    datasets, labels = loadData()
    info_gain_train(datasets, labels)

运行结果

特征(年龄)的信息增益为0.083
特征(有工作)的信息增益为0.324
特征(有自己的房子)的信息增益为0.420
特征(信贷情况)的信息增益为0.363
特征(有自己的房子)的信息增益最大,选择为当前节点特征
当有自己的房子为否
特征(年龄)的信息增益为0.252
特征(有工作)的信息增益为0.918
特征(有自己的房子)的信息增益为0.000
特征(信贷情况)的信息增益为0.474
特征(有工作)的信息增益最大,选择为当前节点特征
当有工作为否
此时类别均为否
当有工作为是
此时类别均为是
当有自己的房子为是
此时类别均为是

C4.5算法

import numpy as np
from math import log

def loadData():
    datasets = [['青年', '否', '否', '一般', '否'],
               ['青年', '否', '否', '好', '否'],
               ['青年', '是', '否', '好', '是'],
               ['青年', '是', '是', '一般', '是'],
               ['青年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '好', '否'],
               ['中年', '是', '是', '好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '好', '是'],
               ['老年', '是', '否', '好', '是'],
               ['老年', '是', '否', '非常好', '是'],
               ['老年', '否', '否', '一般', '否'],
               ]
    labels = [u'年龄', u'有工作', u'有自己的房子', u'信贷情况', u'类别']
    # 返回数据集和每个维度的名称
    return datasets, labels

def calc_entropy(datasets, index=-1):
    label_count = {}
    for dataset in datasets:
        label =  dataset[index]
        if label not in label_count:
            label_count[label] = 0
        label_count[label] += 1
    entropy = -sum([(p/len(datasets))*log(p/len(datasets),2) for p in label_count.values()])
    return entropy

def calc_conditional_entropy(datasets, index = 0):
    feature_data = {}
    for dataset in datasets:
        feature = dataset[index]
        if feature not in feature_data:
            feature_data[feature] = []
        feature_data[feature].append(dataset)
    condEntropy = sum([(len(p)/len(datasets))*calc_entropy(p) for p in feature_data.values()])
    return condEntropy

def info_gain(entropy, condEntropy):
    return entropy - condEntropy

def info_gain_ratio(c_info_gain, c_entropy):
    return 0 if c_info_gain == 0 else c_info_gain/c_entropy

def info_gain_train_childTree(datasets, labels):
    entropy = calc_entropy(datasets)
    features = []
    for index in range(len(datasets[0])-1):
        condEntropy = calc_conditional_entropy(datasets, index)
        c_info_gain = info_gain(entropy, condEntropy)
        c_entropy = calc_entropy(datasets, index)
        c_info_gain_ratio = info_gain_ratio(c_info_gain, c_entropy)
        features.append((index, c_info_gain_ratio))
        print("特征({})的信息增益比为{:.3f}".format(labels[index], c_info_gain_ratio))
    best_feature = max(features, key=lambda x: x[-1])
    print("特征({})的信息增益比最大,选择为当前节点特征".format(labels[best_feature[0]]))
    return best_feature

def info_gain_train(datasets, labels):
    label_count = {}
    for dataset in datasets:
        label = dataset[-1]
        if label not in label_count:
            label_count[label] = 0
        label_count[label] += 1
    if len(label_count.keys()) == 1:
        key = list(label_count.keys())[0]
        print("此时类别均为{}".format(key))
        return
    best_feature = info_gain_train_childTree(datasets, labels)

    feature_data = {}
    for dataset in datasets:
        feature = dataset[best_feature[0]]
        if feature not in feature_data:
            feature_data[feature] = []
        feature_data[feature].append(dataset)

    for data in zip(feature_data.keys(), feature_data.values()):
        print("当{}为{}".format(labels[best_feature[0]], data[0]))
        info_gain_train(data[1], labels)


if __name__ == "__main__":
    datasets, labels = loadData()
    info_gain_train(datasets, labels)

运行结果

特征(年龄)的信息增益比为0.052
特征(有工作)的信息增益比为0.352
特征(有自己的房子)的信息增益比为0.433
特征(信贷情况)的信息增益比为0.232
特征(有自己的房子)的信息增益比最大,选择为当前节点特征
当有自己的房子为否
特征(年龄)的信息增益比为0.164
特征(有工作)的信息增益比为1.000
特征(有自己的房子)的信息增益比为0.000
特征(信贷情况)的信息增益比为0.340
特征(有工作)的信息增益比最大,选择为当前节点特征
当有工作为否
此时类别均为否
当有工作为是
此时类别均为是
当有自己的房子为是
此时类别均为是

习题5.2

题目:已知下表所示的训练数据,试用平方误差损失准则生成一个二叉回归树.

x i x_{i} xi 1 2 3 4 5 6 7 8 9 10
y i y_{i} yi 4.50 4.75 4.91 5.34 5.80 7.05 7.70 8.23 8.70 9.00

回归树的建立算法:
统计学习方法 第五章习题答案_第4张图片
本题的计算量有点大,直接用Python实现,具体代码和结果如下。

#环境Python3.7
#-*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

#节点定义
class TreeNode(object):
    def __init__(self, tempR, tempc):
        self.R = tempR
        self.c = tempc
        self.left = None
        self.right = None


y = np.array([4.5, 4.75, 4.91, 5.34, 5.8, 7.05, 7.9, 8.23, 8.7, 9]) #y的值

#CART算法建立回归树
def CART(start, end):
    # 切点s的选择表示R1为x值小于等于s的点,R2为大于s的点
    if(end - start >= 1):
        result = []
        for s in range(start+1, end+1):#s在(start, end]之间取值
            y1 = y[start : s] #y1取索引为[start, s]之间的值
            y2 = y[s: end+1] #y2 取索引为[s+1, end]之间的值
            result.append((y1.std()**2)*y1.size + (y2.std()**2)*y2.size)
            #std即标准差函数,求标准差的时候默认除以元素的个数,因此平方后乘以元素个数才是要求的平方差
        index1 = result.index(min(result)) + start#取平方差误差最小的索引值
        root = TreeNode(y[start:end+1], min(result))
        #索引值为0-9,x值为1-10,即s的值比求的索引值多1
        print("节点元素值为",y[start:end+1], "  s =",index1+1, "  最小平方误差为",min(result))#输出s值和最小平方误差
        root.left = CART(start, index1) #对列表的左侧生成左子树
        root.right = CART(index1+1, end) #对列表的右侧生成右子树
    else:
        root = None
    return root


if __name__ == "__main__":
    root = CART(0, 9)

运行结果:

节点元素值为 [4.5  4.75 4.91 5.34 5.8  7.05 7.9  8.23 8.7  9.  ]   s = 5   最小平方误差为 3.3587199999999986
节点元素值为 [4.5  4.75 4.91 5.34 5.8 ]   s = 3   最小平方误差为 0.1912
节点元素值为 [4.5  4.75 4.91]   s = 1   最小平方误差为 0.012800000000000023
节点元素值为 [4.75 4.91]   s = 2   最小平方误差为 0.0
节点元素值为 [5.34 5.8 ]   s = 4   最小平方误差为 0.0
节点元素值为 [7.05 7.9  8.23 8.7  9.  ]   s = 7   最小平方误差为 0.6625166666666665
节点元素值为 [7.05 7.9 ]   s = 6   最小平方误差为 0.0
节点元素值为 [8.23 8.7  9.  ]   s = 8   最小平方误差为 0.04500000000000021
节点元素值为 [8.7 9. ]   s = 9   最小平方误差为 0.0

原本是打算再用matplotlib可视化决策树,有、麻烦,后期有时间再优化一下。向大家说声抱歉。
另外简单说明一下计算的过程,以根节点为例,变换切分点 s s s,选择使得平方误差最小的切分点
s = 1 s=1 s=1:
y 1 = [ 4.5 ] , y 2 = [ 4.75 , 4.91 , 5.34 , 5.8 , 7.05 , 7.9 , 8.23 , 8.7 , 9. ] y_{1} = [4.5], y_{2} = [4.75 ,4.91, 5.34, 5.8 , 7.05 ,7.9, 8.23, 8.7, 9.] y1=[4.5],y2=[4.75,4.91,5.34,5.8,7.05,7.9,8.23,8.7,9.]
此时有 c 1 = 4.5 , c 2 = a v g ( y 2 ) = 6.85 c_{1} = 4.5, c{2} = avg(y{2}) = 6.85 c1=4.5,c2=avg(y2)=6.85 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 = 22.45 \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}=22.45 xiR1(j,s)(yic1)2+xiR2(j,s)(yic2)2=22.45
然后依次将 s s s从2取值到10,计算平方误差,选其中平方误差最小的s为根节点s,将元素分为左右子树后,再对左右子树进行相同的处理。

习题5.3

题目:证明 CART 剪枝算法中,当 α \alpha α确定时,存在唯一的最小子树 T α T_{\alpha} Tα使损失函数 C α ( T ) C_{\alpha}(T) Cα(T)最小
答:
(1)存在性
α \alpha α确定时,可以生成多种子树,每个子树对应一个损失函数,一定存在一个最小的损失函数。
(2)唯一性
假设损失函数为最小的损失函数有两个子树 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ,剪枝的本质是对每个节点依次向上递归,若减去该节点后的子树的损失函数更小,则进行剪枝,否则结束该节点的递归。
若子树的 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ某处不相同有两种情况
其一: T α T_{\alpha} Tα某处节点剪枝后得到 T β T_{\beta} Tβ
统计学习方法 第五章习题答案_第5张图片
这种情况即该处是否剪枝不影响最终的损失函数大小,此时虽然二者的损失函数一致,但是右侧的子树更小,即最小子树仍为1个。

其二:
统计学习方法 第五章习题答案_第6张图片
此时不难得出,若 T α T_{\alpha} Tα对2号节点进行剪枝,则 T a l p h a T_{alpha} Talpha的损失函数比原来小,所以最终结果也需要对2号节点进行剪枝,同理若 T β T_{\beta} Tβ对3号节点进行剪枝,则 T b e t a T_{beta} Tbeta的损失函数比原来小,所以最终结果也需要对3号节点进行剪枝,因此 T α , T β T_{\alpha}, T_{\beta} Tα,Tβ均不是最小子树。

习题5.4

题目:证明 CART 剪枝算法中求出的子树序列 { T 0 , T 1 , ⋯   , T n } \left\{T_{0}, T_{1}, \cdots, T_{n}\right\} {T0,T1,,Tn}分别是区间 α ∈ [ α i , α i + 1 ) \alpha \in\left[\alpha_{i}, \alpha_{i+1}\right) α[αi,αi+1)的最优子树 T α T_{\alpha} Tα,这里 i = 0 , 1 , ⋯   , n , 0 = α 0 < α 1 < ⋯ < α n < + ∞ i=0,1, \cdots, n, \quad 0=\alpha_{0}<\alpha_{1}<\cdots<\alpha_{n}<+\infty i=0,1,,n,0=α0<α1<<αn<+
在子树序列中,每棵子树 { T 0 , T 1 , ⋯   , T n } \left\{T_{0}, T_{1}, \cdots, T_{n}\right\} {T0,T1,,Tn}都对应于一个参数 α 0 , α 1 , α 2 . . . α n \alpha_0,\alpha_1,\alpha_2...\alpha_n α0,α1,α2...αn。所以,当最优子树 T k T_k Tk确定时,对应的 α k \alpha_k αk也确定了,即得到最优决策树 T α T_\alpha Tα

参考

CART算法详解
决策树详解
决策树可视化
CART剪枝

你可能感兴趣的:(统计学习方法)