习题5.1
题目:根据表5.1所给的训练数据集,利用信息增益比(C4.5算法)生成决策树.
答:
先计算每个特征的信息增益比,信息增益比
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=1n∣D∣∣Di∣log2∣D∣∣Di∣(n为A特征的取值个数),信息增益
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
分别以
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)=−155log2155−155log2155−155log2155=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)=−155log2155−1510log21510=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)=−159log2159−156log2156=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)=−154log2154−156log2156−155log2155=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中的元素有:
重新计算各个特征的信息增益比
经验熵:
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)=−93log293−96log296=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(−41log241−43log243)+92(−22log222)+93(−32log232−31log231)]=0.918−0.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(−42log242−42log242)+91(−11log211)]=0.918−0.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)=−94log294−92log292−93log2930.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)=−96log296−93log2930.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)=−94log294−94log294−91log2910.474=1.3920.474=0.340
选择信息增益比最大的特征
A
2
A_{2}
A2作为节点的特征,从这一结点引出两个子结点:一个对应“是”(有工作)的子结点,包含3个样本,它们属于同一类,所以这是一个叶结点,类标记为“是”;另一个是对应“否”(无工作)的子结点,包含6个样本,它们也属于同一类,所以这也是一个叶结点,类标记为“否”。
最终的决策树如图:
贴个代码验算下:
首先是书中例题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 |
回归树的建立算法:
本题的计算量有点大,直接用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
∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)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β
这种情况即该处是否剪枝不影响最终的损失函数大小,此时虽然二者的损失函数一致,但是右侧的子树更小,即最小子树仍为1个。
其二:
此时不难得出,若
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α。